aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi_lib.c
diff options
context:
space:
mode:
authorMing Lei <ming.lei@redhat.com>2017-11-04 14:21:12 -0400
committerJens Axboe <axboe@kernel.dk>2017-11-04 14:31:08 -0400
commit88022d7201e96b43f1754b0358fc6bcd8dbdcde1 (patch)
treeec0b9e2d1227a7101040f954aef16511a5b6fa46 /drivers/scsi/scsi_lib.c
parent826a70a08b1210bbfdbda812ab43eb986e25b5c2 (diff)
blk-mq: don't handle failure in .get_budget
It is enough to just check if we can get the budget via .get_budget(). And we don't need to deal with device state change in .get_budget(). For SCSI, one issue to be fixed is that we have to call scsi_mq_uninit_cmd() to free allocated ressources if SCSI device fails to handle the request. And it isn't enough to simply call blk_mq_end_request() to do that if this request is marked as RQF_DONTPREP. Fixes: 0df21c86bdbf(scsi: implement .get_budget and .put_budget for blk-mq) Signed-off-by: Ming Lei <ming.lei@redhat.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
-rw-r--r--drivers/scsi/scsi_lib.c11
1 files changed, 3 insertions, 8 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 22a7e4c47207..286ea983c9e3 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1955,27 +1955,22 @@ static void scsi_mq_put_budget(struct blk_mq_hw_ctx *hctx)
1955 put_device(&sdev->sdev_gendev); 1955 put_device(&sdev->sdev_gendev);
1956} 1956}
1957 1957
1958static blk_status_t scsi_mq_get_budget(struct blk_mq_hw_ctx *hctx) 1958static bool scsi_mq_get_budget(struct blk_mq_hw_ctx *hctx)
1959{ 1959{
1960 struct request_queue *q = hctx->queue; 1960 struct request_queue *q = hctx->queue;
1961 struct scsi_device *sdev = q->queuedata; 1961 struct scsi_device *sdev = q->queuedata;
1962 blk_status_t ret;
1963
1964 ret = prep_to_mq(scsi_prep_state_check(sdev, NULL));
1965 if (ret == BLK_STS_RESOURCE || ret != BLK_STS_OK)
1966 return ret;
1967 1962
1968 if (!get_device(&sdev->sdev_gendev)) 1963 if (!get_device(&sdev->sdev_gendev))
1969 goto out; 1964 goto out;
1970 if (!scsi_dev_queue_ready(q, sdev)) 1965 if (!scsi_dev_queue_ready(q, sdev))
1971 goto out_put_device; 1966 goto out_put_device;
1972 1967
1973 return BLK_STS_OK; 1968 return true;
1974 1969
1975out_put_device: 1970out_put_device:
1976 put_device(&sdev->sdev_gendev); 1971 put_device(&sdev->sdev_gendev);
1977out: 1972out:
1978 return BLK_STS_RESOURCE; 1973 return false;
1979} 1974}
1980 1975
1981static blk_status_t scsi_queue_rq(struct blk_mq_hw_ctx *hctx, 1976static blk_status_t scsi_queue_rq(struct blk_mq_hw_ctx *hctx,