Merge tag 'for-4.17/block-20180402' of git://git.kernel.dk/linux-block
[sfrench/cifs-2.6.git] / drivers / scsi / iscsi_tcp.c
index 07b54dfebccf0208cf82976bdbe4a77cf2194d3b..2ba4b68fdb73f44840509708a170e763e5502be2 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/kfifo.h>
 #include <linux/scatterlist.h>
 #include <linux/module.h>
+#include <linux/backing-dev.h>
 #include <net/tcp.h>
 #include <scsi/scsi_cmnd.h>
 #include <scsi/scsi_device.h>
@@ -732,7 +733,7 @@ static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,
        struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
        struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data;
        struct sockaddr_in6 addr;
-       int rc, len;
+       int rc;
 
        switch(param) {
        case ISCSI_PARAM_CONN_PORT:
@@ -745,12 +746,12 @@ static int iscsi_sw_tcp_conn_get_param(struct iscsi_cls_conn *cls_conn,
                }
                if (param == ISCSI_PARAM_LOCAL_PORT)
                        rc = kernel_getsockname(tcp_sw_conn->sock,
-                                               (struct sockaddr *)&addr, &len);
+                                               (struct sockaddr *)&addr);
                else
                        rc = kernel_getpeername(tcp_sw_conn->sock,
-                                               (struct sockaddr *)&addr, &len);
+                                               (struct sockaddr *)&addr);
                spin_unlock_bh(&conn->session->frwd_lock);
-               if (rc)
+               if (rc < 0)
                        return rc;
 
                return iscsi_conn_get_addr_param((struct sockaddr_storage *)
@@ -771,7 +772,7 @@ static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost,
        struct iscsi_tcp_conn *tcp_conn;
        struct iscsi_sw_tcp_conn *tcp_sw_conn;
        struct sockaddr_in6 addr;
-       int rc, len;
+       int rc;
 
        switch (param) {
        case ISCSI_HOST_PARAM_IPADDRESS:
@@ -793,9 +794,9 @@ static int iscsi_sw_tcp_host_get_param(struct Scsi_Host *shost,
                }
 
                rc = kernel_getsockname(tcp_sw_conn->sock,
-                                       (struct sockaddr *)&addr, &len);
+                                       (struct sockaddr *)&addr);
                spin_unlock_bh(&session->frwd_lock);
-               if (rc)
+               if (rc < 0)
                        return rc;
 
                return iscsi_conn_get_addr_param((struct sockaddr_storage *)
@@ -954,6 +955,13 @@ static int iscsi_sw_tcp_slave_alloc(struct scsi_device *sdev)
 
 static int iscsi_sw_tcp_slave_configure(struct scsi_device *sdev)
 {
+       struct iscsi_sw_tcp_host *tcp_sw_host = iscsi_host_priv(sdev->host);
+       struct iscsi_session *session = tcp_sw_host->session;
+       struct iscsi_conn *conn = session->leadconn;
+
+       if (conn->datadgst_en)
+               sdev->request_queue->backing_dev_info->capabilities
+                       |= BDI_CAP_STABLE_WRITES;
        blk_queue_bounce_limit(sdev->request_queue, BLK_BOUNCE_ANY);
        blk_queue_dma_alignment(sdev->request_queue, 0);
        return 0;