scsi: core: Also call destroy_rcu_head() for passthrough requests
cmd->rcu is initialized by scsi_initialize_rq(). For passthrough requests, blk_get_request() calls scsi_initialize_rq(). For filesystem requests, scsi_init_command() calls scsi_initialize_rq(). Make sure that destroy_rcu_head() is called for passthrough requests. Cc: Christoph Hellwig <hch@lst.de> Cc: Hannes Reinecke <hare@suse.com> Cc: Ewan D. Milne <emilne@redhat.com> Cc: Johannes Thumshirn <jthumshirn@suse.de> Reported-by: Ewan D. Milne <emilne@redhat.com> Signed-off-by: Bart Van Assche <bvanassche@acm.org> Reviewed-by: Hannes Reinecke <hare@suse.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
165aa2bfb4
commit
db983f6eef
|
@ -585,9 +585,16 @@ static bool scsi_end_request(struct request *req, blk_status_t error,
|
|||
if (!blk_rq_is_scsi(req)) {
|
||||
WARN_ON_ONCE(!(cmd->flags & SCMD_INITIALIZED));
|
||||
cmd->flags &= ~SCMD_INITIALIZED;
|
||||
destroy_rcu_head(&cmd->rcu);
|
||||
}
|
||||
|
||||
/*
|
||||
* Calling rcu_barrier() is not necessary here because the
|
||||
* SCSI error handler guarantees that the function called by
|
||||
* call_rcu() has been called before scsi_end_request() is
|
||||
* called.
|
||||
*/
|
||||
destroy_rcu_head(&cmd->rcu);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
|
|
Loading…
Reference in New Issue