Merge tag 'meson-clk-fixes-for-5.1' of https://github.com/BayLibre/clk-meson into...
[linux-2.6-microblaze.git] / drivers / scsi / libiscsi_tcp.c
index 8a6b1b3..c3fe3f3 100644 (file)
@@ -129,12 +129,17 @@ static void iscsi_tcp_segment_map(struct iscsi_segment *segment, int recv)
        BUG_ON(sg->length == 0);
 
        /*
+        * We always map for the recv path.
+        *
         * If the page count is greater than one it is ok to send
         * to the network layer's zero copy send path. If not we
-        * have to go the slow sendmsg path. We always map for the
-        * recv path.
+        * have to go the slow sendmsg path.
+        *
+        * Same goes for slab pages: skb_can_coalesce() allows
+        * coalescing neighboring slab objects into a single frag which
+        * triggers one of hardened usercopy checks.
         */
-       if (page_count(sg_page(sg)) >= 1 && !recv)
+       if (!recv && page_count(sg_page(sg)) >= 1 && !PageSlab(sg_page(sg)))
                return;
 
        if (recv) {
@@ -495,7 +500,7 @@ static int iscsi_tcp_data_in(struct iscsi_conn *conn, struct iscsi_task *task)
        struct iscsi_tcp_task *tcp_task = task->dd_data;
        struct iscsi_data_rsp *rhdr = (struct iscsi_data_rsp *)tcp_conn->in.hdr;
        int datasn = be32_to_cpu(rhdr->datasn);
-       unsigned total_in_length = scsi_in(task->sc)->length;
+       unsigned total_in_length = task->sc->sdb.length;
 
        /*
         * lib iscsi will update this in the completion handling if there
@@ -580,11 +585,11 @@ static int iscsi_tcp_r2t_rsp(struct iscsi_conn *conn, struct iscsi_task *task)
                              data_length, session->max_burst);
 
        data_offset = be32_to_cpu(rhdr->data_offset);
-       if (data_offset + data_length > scsi_out(task->sc)->length) {
+       if (data_offset + data_length > task->sc->sdb.length) {
                iscsi_conn_printk(KERN_ERR, conn,
                                  "invalid R2T with data len %u at offset %u "
                                  "and total length %d\n", data_length,
-                                 data_offset, scsi_out(task->sc)->length);
+                                 data_offset, task->sc->sdb.length);
                return ISCSI_ERR_DATALEN;
        }
 
@@ -696,7 +701,7 @@ iscsi_tcp_hdr_dissect(struct iscsi_conn *conn, struct iscsi_hdr *hdr)
                if (tcp_conn->in.datalen) {
                        struct iscsi_tcp_task *tcp_task = task->dd_data;
                        struct ahash_request *rx_hash = NULL;
-                       struct scsi_data_buffer *sdb = scsi_in(task->sc);
+                       struct scsi_data_buffer *sdb = &task->sc->sdb;
 
                        /*
                         * Setup copy of Data-In into the struct scsi_cmnd