scsi: reintroduce scsi_driver.init_command
Instead of letting the ULD play games with the prep_fn move back to the model of a central prep_fn with a callback to the ULD. This already cleans up and shortens the code by itself, and will be required to properly support blk-mq in the SCSI midlayer. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Nicholas Bellinger <nab@linux-iscsi.org> Reviewed-by: Mike Christie <michaelc@cs.wisc.edu> Reviewed-by: Hannes Reinecke <hare@suse.de>
This commit is contained in:
@@ -79,6 +79,7 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_WORM);
|
||||
static DEFINE_MUTEX(sr_mutex);
|
||||
static int sr_probe(struct device *);
|
||||
static int sr_remove(struct device *);
|
||||
static int sr_init_command(struct scsi_cmnd *SCpnt);
|
||||
static int sr_done(struct scsi_cmnd *);
|
||||
static int sr_runtime_suspend(struct device *dev);
|
||||
|
||||
@@ -94,6 +95,7 @@ static struct scsi_driver sr_template = {
|
||||
.remove = sr_remove,
|
||||
.pm = &sr_pm_ops,
|
||||
},
|
||||
.init_command = sr_init_command,
|
||||
.done = sr_done,
|
||||
};
|
||||
|
||||
@@ -378,21 +380,14 @@ static int sr_done(struct scsi_cmnd *SCpnt)
|
||||
return good_bytes;
|
||||
}
|
||||
|
||||
static int sr_prep_fn(struct request_queue *q, struct request *rq)
|
||||
static int sr_init_command(struct scsi_cmnd *SCpnt)
|
||||
{
|
||||
int block = 0, this_count, s_size;
|
||||
struct scsi_cd *cd;
|
||||
struct scsi_cmnd *SCpnt;
|
||||
struct scsi_device *sdp = q->queuedata;
|
||||
struct request *rq = SCpnt->request;
|
||||
struct scsi_device *sdp = SCpnt->device;
|
||||
int ret;
|
||||
|
||||
if (rq->cmd_type == REQ_TYPE_BLOCK_PC) {
|
||||
ret = scsi_setup_blk_pc_cmnd(sdp, rq);
|
||||
goto out;
|
||||
} else if (rq->cmd_type != REQ_TYPE_FS) {
|
||||
ret = BLKPREP_KILL;
|
||||
goto out;
|
||||
}
|
||||
ret = scsi_setup_fs_cmnd(sdp, rq);
|
||||
if (ret != BLKPREP_OK)
|
||||
goto out;
|
||||
@@ -517,7 +512,7 @@ static int sr_prep_fn(struct request_queue *q, struct request *rq)
|
||||
*/
|
||||
ret = BLKPREP_OK;
|
||||
out:
|
||||
return scsi_prep_return(q, rq, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int sr_block_open(struct block_device *bdev, fmode_t mode)
|
||||
@@ -718,7 +713,6 @@ static int sr_probe(struct device *dev)
|
||||
|
||||
/* FIXME: need to handle a get_capabilities failure properly ?? */
|
||||
get_capabilities(cd);
|
||||
blk_queue_prep_rq(sdev->request_queue, sr_prep_fn);
|
||||
sr_vendor_init(cd);
|
||||
|
||||
disk->driverfs_dev = &sdev->sdev_gendev;
|
||||
@@ -993,7 +987,6 @@ static int sr_remove(struct device *dev)
|
||||
|
||||
scsi_autopm_get_device(cd->device);
|
||||
|
||||
blk_queue_prep_rq(cd->device->request_queue, scsi_prep_fn);
|
||||
del_gendisk(cd->disk);
|
||||
|
||||
mutex_lock(&sr_ref_mutex);
|
||||
|
Reference in New Issue
Block a user