Skip to contentSkip to conversation

qla2xxx: Fix to allow to reset devices using sg interface (sg_reset)

PATCH In review Vladislav Bolkhovitin 3 participants 5 messages Jul 25, 2006 – Jul 30, 2006

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 qla2xxx: Fix to allow to reset devices using sg interface (sg_reset)

Currently it is impossible to reset provided by Qlogic QLA2xxx driver SCSI devices externally using corresponding sg devices, particularly via sg_reset utility, because qla2xxx driver in qla2xxx_eh_device_reset() function checks if the input scsi_cmnd has its private data (CMD_SP()) attached. Then the found pointer isn't used anywhere inside of qla2xxx_eh_device_reset(). If the RESET request comes from sg device, it doesn't have such private data.

The attached patch removes check for non-NULL CMD_SP() from qla2xxx_eh_device_reset(), hence allows to reset QLA2xxx's devices using corresponding sg devices.

Against 2.6.18-rc2.

Vlad

P.S. Sorry for the attachment format, I hope there will be no problems with it for such a small patch.

drivers/scsi/qla2xxx/qla_os.c +1 -3
@@ -744,7 +744,6 @@ qla2xxx_eh_device_reset(struct scsi_cmnd
 {
 	scsi_qla_host_t *ha = to_qla_host(cmd->device->host);
 	fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata;
-	srb_t *sp;
 	int ret;
 	unsigned int id, lun;
 	unsigned long serial;
@@ -755,8 +754,7 @@
 	lun = cmd->device->lun;
 	serial = cmd->serial_number;
 
-	sp = (srb_t *) CMD_SP(cmd);
-	if (!sp || !fcport)
+	if (!fcport)
 		return ret;
 
 	qla_printk(KERN_INFO, ha,
#1 lore raw

Also I've found that without this patch qla2xxx_eh_device_reset() refuses to reset the device during normal error recovery carrying out by SCSI mid-layer as well. I didn't do deeper investigations though, with this patch the error recovery works as expected.

Vlad

Quoted 35 lines · Vladislav Bolkhovitin

Currently it is impossible to reset provided by Qlogic QLA2xxx driver SCSI devices externally using corresponding sg devices, particularly via sg_reset utility, because qla2xxx driver in qla2xxx_eh_device_reset() function checks if the input scsi_cmnd has its private data (CMD_SP()) attached. Then the found pointer isn't used anywhere inside of qla2xxx_eh_device_reset(). If the RESET request comes from sg device, it doesn't have such private data.

The attached patch removes check for non-NULL CMD_SP() from qla2xxx_eh_device_reset(), hence allows to reset QLA2xxx's devices using corresponding sg devices.

Against 2.6.18-rc2.

Vlad

P.S. Sorry for the attachment format, I hope there will be no problems with it for such a small patch.

------------------------------------------------------------------------

drivers/scsi/qla2xxx/qla_os.c +1 -3
@@ -744,7 +744,6 @@ qla2xxx_eh_device_reset(struct scsi_cmnd
 {
 	scsi_qla_host_t *ha = to_qla_host(cmd->device->host);
 	fc_port_t *fcport = (struct fc_port *) cmd->device->hostdata;
-	srb_t *sp;
 	int ret;
 	unsigned int id, lun;
 	unsigned long serial;
@@ -755,8 +754,7 @@
 	lun = cmd->device->lun;
 	serial = cmd->serial_number;
 
-	sp = (srb_t *) CMD_SP(cmd);
-	if (!sp || !fcport)
+	if (!fcport)
 		return ret;
 
 	qla_printk(KERN_INFO, ha,
#4 lore raw
In reply to Vladislav Bolkhovitin
Quoted 11 lines · Vladislav Bolkhovitin

Currently it is impossible to reset provided by Qlogic QLA2xxx driver SCSI devices externally using corresponding sg devices, particularly via sg_reset utility, because qla2xxx driver in qla2xxx_eh_device_reset() function checks if the input scsi_cmnd has its private data (CMD_SP()) attached. Then the found pointer isn't used anywhere inside of qla2xxx_eh_device_reset(). If the RESET request comes from sg device, it doesn't have such private data.

The attached patch removes check for non-NULL CMD_SP() from qla2xxx_eh_device_reset(), hence allows to reset QLA2xxx's devices using corresponding sg devices.

hmm... actually this change should propegate to the bus and host reset handlers as well. I have a series of small fixes queued for submission, I'll add you patch (with the bus/host deltas) to the queue.

Thanks,
Andrew Vasquez

#2 lore raw
In reply to Vladislav Bolkhovitin
Quoted 4 lines · Vladislav Bolkhovitin

Also I've found that without this patch qla2xxx_eh_device_reset() refuses to reset the device during normal error recovery carrying out by SCSI mid-layer as well. I didn't do deeper investigations though, with this patch the error recovery works as expected.

The only way I see this happening is if the command completed after the abort handler FAILED and before the device reset handler executed. Possibly.

During normal EH routines the driver still hold a reference to the command, so the sp should be valid.

In any case, those codes (referencing SP) are residual left-overs from our 'standard' non-upstream driver, and should be clensed.

Thanks again,
Andrew Vasquez

#3 lore raw
Quoted 11 lines · Andrew Vasquez
Quoted 4 lines · Vladislav Bolkhovitin

Also I've found that without this patch qla2xxx_eh_device_reset() refuses to reset the device during normal error recovery carrying out by SCSI mid-layer as well. I didn't do deeper investigations though, with this patch the error recovery works as expected.

The only way I see this happening is if the command completed after the abort handler FAILED and before the device reset handler executed. Possibly.

Quoted 5 lines

During normal EH routines the driver still hold a reference to the command, so the sp should be valid.

In any case, those codes (referencing SP) are residual left-overs from our 'standard' non-upstream driver, and should be clensed.

But it shows a bad problem in the design of those external reset ioctls. Unlike normal EH commands they never went through ->queuecommand so don't have private data allocated or other setup done. This can have pretty serious consequences. We probably can't fix it short from redoing the whole EH entry points, but it at least needs to be documented very carefully.

Anyone volunteering to write up the documentation?