Re: [PATCH scsi] Short the path length of scsi_cmd_to_driver()
On Thu, 2012-09-27 at 13:43 -0400, Martin K. Petersen wrote: Li == Li Zhong zh...@linux.vnet.ibm.com writes: @@ -845,8 +844,11 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd, scsi_eh_restore_cmnd(scmd, ses); -if (sdrv sdrv-eh_action) -rtn = sdrv-eh_action(scmd, cmnd, cmnd_size, rtn); +if (scmd-request-cmd_type == REQ_TYPE_FS) { +struct scsi_driver *sdrv = scsi_cmd_to_driver(scmd); +if (sdrv-eh_action) +rtn = sdrv-eh_action(scmd, cmnd, cmnd_size, rtn); +} return rtn; } My only concern is whether our device lifetime rules guarantee that the ULD is always attached when we service an error handling command? Thank you, Martin, for the review. I don't know much about scsi, it might take me some more time to have an answer to the above question. For now, if I understand correctly, maybe we could only do the not-consistent behaviours bug fix? Or could we provide two versions of scsi_cmd_to_driver(), one with NULL checking for scsi_send_eh_cmnd(), one without the checking for scsi_finish_command()? Thanks, Zhong -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH scsi] Short the path length of scsi_cmd_to_driver()
On Thu, 2012-09-27 at 13:43 -0400, Martin K. Petersen wrote: Li == Li Zhong zh...@linux.vnet.ibm.com writes: @@ -845,8 +844,11 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd, scsi_eh_restore_cmnd(scmd, ses); -if (sdrv sdrv-eh_action) -rtn = sdrv-eh_action(scmd, cmnd, cmnd_size, rtn); +if (scmd-request-cmd_type == REQ_TYPE_FS) { +struct scsi_driver *sdrv = scsi_cmd_to_driver(scmd); +if (sdrv-eh_action) +rtn = sdrv-eh_action(scmd, cmnd, cmnd_size, rtn); +} return rtn; } My only concern is whether our device lifetime rules guarantee that the ULD is always attached when we service an error handling command? Yes, they are. We can only get REQ_TYPE_FS through a filesystem, which must be mounted on a block device, which is provided by the ULD. You can't unmount with outstanding I/O (which people complain about when it goes into error handling, I'll admit), so the ULD has to stay bound. James -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH scsi] Short the path length of scsi_cmd_to_driver()
Hi James, Martin, Here is the updated version, please help to review. Thanks, Zhong As suggested by James: this patch tries to short the path length of scsi_cmd_to_driver(). As only REQ_TYPE_BLOCK_PC commands can be submitted without a driver, so we could avoid the related NULL checking, as long as we make sure we don't use it for REQ_TYPE_BLOCK_PC type commands. Plus, this fixes a bug where you get different behaviors from REQ_TYPE_BLOCK_PC commands when a driver is and isn't attached. And Martin pointed out that we could have eh action be triggered for REQ_TYPE_FS type only. Signed-off-by: Li Zhong zh...@linux.vnet.ibm.com --- drivers/scsi/scsi_error.c |8 +--- include/scsi/scsi_cmnd.h | 12 ++-- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index de2337f..4001559 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -789,7 +789,6 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd, int cmnd_size, int timeout, unsigned sense_bytes) { struct scsi_device *sdev = scmd-device; - struct scsi_driver *sdrv = scsi_cmd_to_driver(scmd); struct Scsi_Host *shost = sdev-host; DECLARE_COMPLETION_ONSTACK(done); unsigned long timeleft; @@ -845,8 +844,11 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd, scsi_eh_restore_cmnd(scmd, ses); - if (sdrv sdrv-eh_action) - rtn = sdrv-eh_action(scmd, cmnd, cmnd_size, rtn); + if (scmd-request-cmd_type == REQ_TYPE_FS) { + struct scsi_driver *sdrv = scsi_cmd_to_driver(scmd); + if (sdrv-eh_action) + rtn = sdrv-eh_action(scmd, cmnd, cmnd_size, rtn); + } return rtn; } diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h index ac06cc5..de5f5d8 100644 --- a/include/scsi/scsi_cmnd.h +++ b/include/scsi/scsi_cmnd.h @@ -132,18 +132,10 @@ struct scsi_cmnd { unsigned char tag; /* SCSI-II queued command tag */ }; +/* make sure not to use it with REQ_TYPE_BLOCK_PC commands */ static inline struct scsi_driver *scsi_cmd_to_driver(struct scsi_cmnd *cmd) { - struct scsi_driver **sdp; - - if (!cmd-request-rq_disk) - return NULL; - - sdp = (struct scsi_driver **)cmd-request-rq_disk-private_data; - if (!sdp) - return NULL; - - return *sdp; + return *(struct scsi_driver **)cmd-request-rq_disk-private_data; } extern struct scsi_cmnd *scsi_get_command(struct scsi_device *, gfp_t); -- 1.7.7.6 -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH scsi] Short the path length of scsi_cmd_to_driver()
Li == Li Zhong zh...@linux.vnet.ibm.com writes: @@ -845,8 +844,11 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd, scsi_eh_restore_cmnd(scmd, ses); - if (sdrv sdrv-eh_action) - rtn = sdrv-eh_action(scmd, cmnd, cmnd_size, rtn); + if (scmd-request-cmd_type == REQ_TYPE_FS) { + struct scsi_driver *sdrv = scsi_cmd_to_driver(scmd); + if (sdrv-eh_action) + rtn = sdrv-eh_action(scmd, cmnd, cmnd_size, rtn); + } return rtn; } My only concern is whether our device lifetime rules guarantee that the ULD is always attached when we service an error handling command? -- Martin K. Petersen Oracle Linux Engineering -- To unsubscribe from this list: send the line unsubscribe linux-scsi in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html