This patch does not change any functionality but makes the drivers
that support bidirectional commands more compact.

Cc: Douglas Gilbert <dgilb...@interlog.com>
Cc: Hannes Reinecke <h...@suse.com>
Cc: Christoph Hellwig <h...@lst.de>
Cc: Lee Duncan <ldun...@suse.com>
Cc: Chris Leech <cle...@redhat.com>
Signed-off-by: Bart Van Assche <bvanass...@acm.org>
---
 drivers/scsi/iscsi_tcp.c           |  8 +-------
 drivers/scsi/scsi_debug.c          | 11 +----------
 drivers/scsi/scsi_lib.c            |  2 ++
 drivers/target/loopback/tcm_loop.c |  8 +-------
 include/scsi/scsi_host.h           |  2 ++
 5 files changed, 7 insertions(+), 24 deletions(-)

diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index cae6368ebb98..8c09e9e45a62 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -952,12 +952,6 @@ static umode_t iscsi_sw_tcp_attr_is_visible(int 
param_type, int param)
        return 0;
 }
 
-static int iscsi_sw_tcp_slave_alloc(struct scsi_device *sdev)
-{
-       blk_queue_flag_set(QUEUE_FLAG_BIDI, sdev->request_queue);
-       return 0;
-}
-
 static int iscsi_sw_tcp_slave_configure(struct scsi_device *sdev)
 {
        struct iscsi_sw_tcp_host *tcp_sw_host = iscsi_host_priv(sdev->host);
@@ -985,7 +979,7 @@ static struct scsi_host_template iscsi_sw_tcp_sht = {
        .eh_device_reset_handler= iscsi_eh_device_reset,
        .eh_target_reset_handler = iscsi_eh_recover_target,
        .dma_boundary           = PAGE_SIZE - 1,
-       .slave_alloc            = iscsi_sw_tcp_slave_alloc,
+       .bidi_supported         = true,
        .slave_configure        = iscsi_sw_tcp_slave_configure,
        .target_alloc           = iscsi_target_alloc,
        .proc_name              = "iscsi_tcp",
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
index 661512bec3ac..e253c0129b40 100644
--- a/drivers/scsi/scsi_debug.c
+++ b/drivers/scsi/scsi_debug.c
@@ -3948,15 +3948,6 @@ static struct sdebug_dev_info 
*find_build_dev_info(struct scsi_device *sdev)
        return open_devip;
 }
 
-static int scsi_debug_slave_alloc(struct scsi_device *sdp)
-{
-       if (sdebug_verbose)
-               pr_info("slave_alloc <%u %u %u %llu>\n",
-                      sdp->host->host_no, sdp->channel, sdp->id, sdp->lun);
-       blk_queue_flag_set(QUEUE_FLAG_BIDI, sdp->request_queue);
-       return 0;
-}
-
 static int scsi_debug_slave_configure(struct scsi_device *sdp)
 {
        struct sdebug_dev_info *devip =
@@ -5834,7 +5825,7 @@ static struct scsi_host_template sdebug_driver_template = 
{
        .proc_name =            sdebug_proc_name,
        .name =                 "SCSI DEBUG",
        .info =                 scsi_debug_info,
-       .slave_alloc =          scsi_debug_slave_alloc,
+       .bidi_supported =       true,
        .slave_configure =      scsi_debug_slave_configure,
        .slave_destroy =        scsi_debug_slave_destroy,
        .ioctl =                scsi_debug_ioctl,
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 00cd365fb7d2..94842b104bcc 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1881,6 +1881,8 @@ struct request_queue *scsi_mq_alloc_queue(struct 
scsi_device *sdev)
        sdev->request_queue->queuedata = sdev;
        __scsi_init_queue(sdev->host, sdev->request_queue);
        blk_queue_flag_set(QUEUE_FLAG_SCSI_PASSTHROUGH, sdev->request_queue);
+       if (sdev->host->hostt->bidi_supported)
+               blk_queue_flag_set(QUEUE_FLAG_BIDI, sdev->request_queue);
        return sdev->request_queue;
 }
 
diff --git a/drivers/target/loopback/tcm_loop.c 
b/drivers/target/loopback/tcm_loop.c
index 7bd7c0c0db6f..e54a5c57a8bb 100644
--- a/drivers/target/loopback/tcm_loop.c
+++ b/drivers/target/loopback/tcm_loop.c
@@ -304,12 +304,6 @@ static int tcm_loop_target_reset(struct scsi_cmnd *sc)
        return FAILED;
 }
 
-static int tcm_loop_slave_alloc(struct scsi_device *sd)
-{
-       blk_queue_flag_set(QUEUE_FLAG_BIDI, sd->request_queue);
-       return 0;
-}
-
 static struct scsi_host_template tcm_loop_driver_template = {
        .show_info              = tcm_loop_show_info,
        .proc_name              = "tcm_loopback",
@@ -325,7 +319,7 @@ static struct scsi_host_template tcm_loop_driver_template = 
{
        .cmd_per_lun            = 1024,
        .max_sectors            = 0xFFFF,
        .dma_boundary           = PAGE_SIZE - 1,
-       .slave_alloc            = tcm_loop_slave_alloc,
+       .bidi_supported         = true,
        .module                 = THIS_MODULE,
        .track_queue_depth      = 1,
 };
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index 6ca954e9f752..384b50992a56 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -430,6 +430,8 @@ struct scsi_host_template {
        /* True if the low-level driver supports blk-mq only */
        unsigned force_blk_mq:1;
 
+       unsigned bidi_supported:1;
+
        /*
         * Countdown for host blocking with no commands outstanding.
         */
-- 
2.20.1.321.g9e740568ce-goog

Reply via email to