[dm-devel] [RFC PATCH v2 2/2] dm: add CONFIG_DM_MULTIPATH_SG_IO - failover for SG_IO on dm-multipath
Martin Wilck
mwilck at suse.com
Thu Apr 29 21:08:23 UTC 2021
On Thu, 2021-04-29 at 09:32 -0700, Bart Van Assche wrote:
> On 4/29/21 8:50 AM, mwilck at suse.com wrote:
> > + if (hdr.dxfer_len > (queue_max_hw_sectors(bdev->bd_disk-
> > >queue) << 9))
> > + return -EIO;
>
> How about using SECTOR_SHIFT instead of the number 9?
no problem. That line was just copied from the scsi_ioctl code.
>
> > + /*
> > + * Errors resulting from invalid parameters
> > shouldn't be retried
> > + * on another path.
> > + */
> > + switch (rc) {
> > + case -ENOIOCTLCMD:
> > + case -EFAULT:
> > + case -EINVAL:
> > + case -EPERM:
> > + goto out;
> > + default:
> > + break;
> > + }
>
> Will -ENOMEM result in an immediate retry? Is that what's desired?
No, I overlooked that case. Thanks for pointing this out.
>
> > + if (rhdr.info & SG_INFO_CHECK) {
> > + int result;
> > + blk_status_t sts;
> > +
> > + __set_status_byte(&result, rhdr.status);
> > + __set_msg_byte(&result, rhdr.msg_status);
> > + __set_host_byte(&result, rhdr.host_status);
> > + __set_driver_byte(&result,
> > rhdr.driver_status);
> > +
> > + sts = __scsi_result_to_blk_status(&result,
> > result);
> > + rhdr.host_status = host_byte(result);
> > +
> > + /* See if this is a target or path error.
> > */
> > + if (sts == BLK_STS_OK)
> > + rc = 0;
> > + else if (blk_path_error(sts))
> > + rc = -EIO;
> > + else {
> > + rc = blk_status_to_errno(sts);
> > + goto out;
> > + }
> > + }
>
> Will SAM_STAT_CHECK_CONDITION be treated as an I/O error? Is that
> what's
> desired? If not, does that mean that scsi_result_to_blk_status()
> shouldn't be used but instead that a custom SCSI result conversion is
> needed?
This mimics the logic for regular SCSI block I/O. By default, CHECK
CONDITION indeed maps to a BLK_STS_IO_ERR, and will be treated as a
path error. As you probably know, there are some exceptions that are
handled in the SCSI mid-layer beforehand. For example, check_sense()
sets DID_TARGET_FAILURE or DID_MEDIUM_ERROR for certain sense codes,
which map to target errors. So yes, I think this is correct.
> If __scsi_result_to_blk_status() is the right function to call, how
> about making that function accept the driver status, host status, msg
> and SAM status as four separate arguments such that the
> __set_*_byte()
> calls can be left out?
>
> > + char *argv[2] = { "fail_path", bdbuf };
>
> Can the above array be declared static?
How would that work? The function needs to be reentrant, and bdbuf is
on the stack. I don't see an issue here, it's really just two pointers
on the stack.
Regards,
Martin
More information about the dm-devel
mailing list