Add scsi_mpath_{start,end}_request() to handle updating private multipath
request data, like nvme_mpath_{start,end}_request().Since we may need to update mpath_disk data, add a callbacks in scsi_driver to actually do this work for the scsi driver. Signed-off-by: John Garry <[email protected]> --- drivers/scsi/scsi_lib.c | 4 ++++ include/scsi/scsi_driver.h | 2 ++ include/scsi/scsi_multipath.h | 24 ++++++++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 7ed0defc8161e..61179caa7b2c8 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c @@ -654,6 +654,8 @@ static bool scsi_end_request(struct request *req, blk_status_t error, */ destroy_rcu_head(&cmd->rcu); + scsi_mpath_end_request(req); + /* * In the MQ case the command gets freed by __blk_mq_end_request, * so we have to do all cleanup that depends on it earlier. @@ -1887,6 +1889,8 @@ static blk_status_t scsi_queue_rq(struct blk_mq_hw_ctx *hctx, memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); cmd->submitter = SUBMITTED_BY_BLOCK_LAYER; + scsi_mpath_start_request(req); + blk_mq_start_request(req); if (blk_mq_is_reserved_rq(req)) { reason = shost->hostt->queue_reserved_command(shost, cmd); diff --git a/include/scsi/scsi_driver.h b/include/scsi/scsi_driver.h index 85e792dc4db50..44e50229a75e7 100644 --- a/include/scsi/scsi_driver.h +++ b/include/scsi/scsi_driver.h @@ -20,6 +20,8 @@ struct scsi_driver { int (*eh_action)(struct scsi_cmnd *, int); void (*eh_reset)(struct scsi_cmnd *); #ifdef CONFIG_SCSI_MULTIPATH + void (*mpath_start_cmd)(struct scsi_cmnd *); + void (*mpath_end_cmd)(struct scsi_cmnd *); struct mpath_disk *(*to_mpath_disk)(struct request *); #endif }; diff --git a/include/scsi/scsi_multipath.h b/include/scsi/scsi_multipath.h index 07db217edb085..6cb3107260952 100644 --- a/include/scsi/scsi_multipath.h +++ b/include/scsi/scsi_multipath.h @@ -56,6 +56,23 @@ void scsi_mpath_add_sysfs_link(struct scsi_device *sdev); void scsi_mpath_remove_sysfs_link(struct scsi_device *sdev); int scsi_mpath_get_head(struct scsi_mpath_head *); void scsi_mpath_put_head(struct scsi_mpath_head *); + +static inline void scsi_mpath_start_request(struct request *req) +{ + struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req); + + if (is_mpath_request(req)) + scsi_cmd_to_driver(cmd)->mpath_start_cmd(cmd); +} + +static inline void scsi_mpath_end_request(struct request *req) +{ + struct scsi_cmnd *cmd = blk_mq_rq_to_pdu(req); + + if (is_mpath_request(req)) + scsi_cmd_to_driver(cmd)->mpath_start_cmd(cmd); +} + #else /* CONFIG_SCSI_MULTIPATH */ struct scsi_mpath_head { @@ -104,6 +121,13 @@ static inline void scsi_mpath_put_head(struct scsi_mpath_head *) { } +static inline void scsi_mpath_start_request(struct request *) +{ +} +static inline void scsi_mpath_end_request(struct request *) +{ +} + static inline void scsi_mpath_add_sysfs_link(struct scsi_device *sdev) { } -- 2.43.5

