BUG: SCSI INQUIRY thru SCSI_IOCTL_SEND_COMMAND returns no errno for disconnected device
We have a SAN system set up, where our host is connected to IBM ESS storage and SVC storage. When we disconnect ALL FC cables between the host and storage devices, and then send a SCSI INQUIRY using the SCSI_IOCTL_SEND_COMMAND ioctl to the
sd devices, the ioctl does not return with a failure code. Instead, it returns with a zero-length buffer.
Is there a reason why we would get a zeroed-length buffer instead of an error return code?
We see this problem on both an emulex driver (2.10f) and qlogic driver (8.00.00b14, non failover version).
Looking through the kernel SCSI layer code, it just seems that the SCSI inquiry is packaged up as a request and sent off to the LLDD. So is something strange happening in the LLDD's ...
Thanks!!
Lan
Quoted 9 lines · Lan Tran
We have a SAN system set up, where our host is connected to IBM ESS storage and SVC storage. When we disconnect ALL FC cables between the host and storage devices, and then send a SCSI INQUIRY using the
SCSI_IOCTL_SEND_COMMANDioctl to the
sd devices, the ioctl does not return with a failure code. Instead, it returns with a zero-length buffer.Is there a reason why we would get a zeroed-length buffer instead of an error return code?
SCSI_IOCTL_SEND_COMMAND is deprecated, you should be using SG_IO instead.
There was a bug with SG_IO, it does not correctly set all of the status bytes, a patch has been submitted a few times, Mike C's patch fixed problems compared to ones I posted earlier, this patch:
http://marc.theaimsgroup.com/?l=linux-scsi&m=108617935710955&w=2
It looks like SCSI_IOCTL_SEND_COMMAND has a similiar issue, in that it only checks the low byte of the results, so for example a DID_NO_CONNECT returned by the qlogic or emulex driver would be ignored.
See drivers/block/scsi_ioctl.c near the end of sg_scsi_ioctl, this:
err = rq->errors & 0xff; /* only 8 bit SCSI status */
Compare that to code in drivers/scsi/scsi_ioctl.c near the end of scsi_ioctl_send_command, where the entire result is checked, not just the SCSI byte.
-- Patrick Mansfield
Thanks Patrick for the tip! After trying out SG_IO, it works, as long as we use Mike C's patch.
Lan
Quoted 33 lines · Patrick Mansfield
Quoted 9 lines · Lan Tran
We have a SAN system set up, where our host is connected to IBM ESS storage and SVC storage. When we disconnect ALL FC cables between the host and storage devices, and then send a SCSI INQUIRY using the
SCSI_IOCTL_SEND_COMMANDioctl to the
sd devices, the ioctl does not return with a failure code. Instead, it returns with a zero-length buffer.Is there a reason why we would get a zeroed-length buffer instead of an error return code?
SCSI_IOCTL_SEND_COMMANDis deprecated, you should be usingSG_IOinstead.There was a bug with
SG_IO, it does not correctly set all of the status bytes, a patch has been submitted a few times, Mike C's patch fixed problems compared to ones I posted earlier, this patch:http://marc.theaimsgroup.com/?l=linux-scsi&m=108617935710955&w=2It looks like
SCSI_IOCTL_SEND_COMMANDhas a similiar issue, in that it only checks the low byte of the results, so for example aDID_NO_CONNECTreturned by the qlogic or emulex driver would be ignored.See
drivers/block/scsi_ioctl.cnear the end ofsg_scsi_ioctl, this:err = rq->errors & 0xff; /* only 8 bit SCSI status */Compare that to code in
drivers/scsi/scsi_ioctl.cnear the end ofscsi_ioctl_send_command, where the entire result is checked, not just the SCSI byte.-- Patrick Mansfield
Quoted 36 lines · Lan Tran
Thanks Patrick for the tip! After trying out
SG_IO, it works, as long as we use Mike C's patch.Lan
Quoted 30 lines · Patrick Mansfield
Quoted 9 lines · Lan Tran
We have a SAN system set up, where our host is connected to IBM ESS storage and SVC storage. When we disconnect ALL FC cables between the host and storage devices, and then send a SCSI INQUIRY using the
SCSI_IOCTL_SEND_COMMANDioctl to the
sd devices, the ioctl does not return with a failure code. Instead, it returns with a zero-length buffer.Is there a reason why we would get a zeroed-length buffer instead of an error return code?
SCSI_IOCTL_SEND_COMMANDis deprecated, you should be usingSG_IOinstead.There was a bug with
SG_IO, it does not correctly set all of the status bytes, a patch has been submitted a few times, Mike C's patch fixed problems compared to ones I posted earlier, this patch:http://marc.theaimsgroup.com/?l=linux-scsi&m=108617935710955&w=2It looks like
SCSI_IOCTL_SEND_COMMANDhas a similiar issue, in that it only checks the low byte of the results, so for example aDID_NO_CONNECTreturned by the qlogic or emulex driver would be ignored.See
drivers/block/scsi_ioctl.cnear the end ofsg_scsi_ioctl, this:err = rq->errors & 0xff; /* only 8 bit SCSI status */Compare that to code in
drivers/scsi/scsi_ioctl.cnear the end ofscsi_ioctl_send_command, where the entire result is checked, not just the SCSI byte.
I'll make sure to get that patch finally in. It made it to the bsg tree, and never further. Thanks for the reminder.
Signature · 1 line
Jens Axboe