Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 2 Mar 2013 19:43:27 +0000 (11:43 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 2 Mar 2013 19:43:27 +0000 (11:43 -0800)
Pull SCSI target patches from Nicholas Bellinger:
 "Here are the remaining target-pending patches for v3.9-rc1.

  The most important one here is the immediate queue starvation
  regression fix for iscsi-target, which addresses a bug that's
  effecting v3.5+ kernels under heavy sustained READ only workloads.
  Thanks alot to Benjamin Estrabaud for helping to track this down!

  Also included is a pSCSI exception bugfix from Asias, along with a
  handful of other minor changes.  Both bugfixes are CC'ed to stable."

* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending:
  target/pscsi: Rename sg_num to nr_vecs in pscsi_get_bio()
  target/pscsi: Fix page increment
  target/pscsi: Drop unnecessary NULL assignment to bio->bi_next
  target: Add __exit annotation for module_exit functions
  iscsi-target: Fix immediate queue starvation regression with DATAIN

drivers/target/iscsi/iscsi_target.c
drivers/target/sbp/sbp_target.c
drivers/target/target_core_file.c
drivers/target/target_core_iblock.c
drivers/target/target_core_pscsi.c

index 9435a3d369a7b8aa7f8e628ea2c32f0845b1f2a2..7ea246a07731e17964e904c34f5fff5f4769774c 100644 (file)
@@ -3584,6 +3584,10 @@ check_rsp_state:
                                spin_lock_bh(&cmd->istate_lock);
                                cmd->i_state = ISTATE_SENT_STATUS;
                                spin_unlock_bh(&cmd->istate_lock);
+
+                               if (atomic_read(&conn->check_immediate_queue))
+                                       return 1;
+
                                continue;
                        } else if (ret == 2) {
                                /* Still must send status,
@@ -3673,7 +3677,7 @@ check_rsp_state:
                }
 
                if (atomic_read(&conn->check_immediate_queue))
-                       break;
+                       return 1;
        }
 
        return 0;
@@ -3717,12 +3721,15 @@ restart:
                     signal_pending(current))
                        goto transport_err;
 
+get_immediate:
                ret = handle_immediate_queue(conn);
                if (ret < 0)
                        goto transport_err;
 
                ret = handle_response_queue(conn);
-               if (ret == -EAGAIN)
+               if (ret == 1)
+                       goto get_immediate;
+               else if (ret == -EAGAIN)
                        goto restart;
                else if (ret < 0)
                        goto transport_err;
index 6917a9e938e7b152eac6e9fddcca399961c796ba..d3536f57444fb7a51bd5313f157e85493d19d6de 100644 (file)
@@ -2598,7 +2598,7 @@ static int __init sbp_init(void)
        return 0;
 };
 
-static void sbp_exit(void)
+static void __exit sbp_exit(void)
 {
        sbp_deregister_configfs();
 };
index d226c10a985bd9ffac1b3a87f8d9891d0c197683..17a6acbc3ab0e300b1db04717ecf68804358319f 100644 (file)
@@ -631,7 +631,7 @@ static int __init fileio_module_init(void)
        return transport_subsystem_register(&fileio_template);
 }
 
-static void fileio_module_exit(void)
+static void __exit fileio_module_exit(void)
 {
        transport_subsystem_release(&fileio_template);
 }
index c73f4a950e230725b5c84d8200f5692cef7247ee..8bcc514ec8b6212e1f9b1913977d29e48ba5c24f 100644 (file)
@@ -821,7 +821,7 @@ static int __init iblock_module_init(void)
        return transport_subsystem_register(&iblock_template);
 }
 
-static void iblock_module_exit(void)
+static void __exit iblock_module_exit(void)
 {
        transport_subsystem_release(&iblock_template);
 }
index 2bcfd79cf59556d46199e4bac2d2f18694f6cc87..82e78d72fdb61f1849f1204e6d02d0970fdb7b41 100644 (file)
@@ -840,14 +840,14 @@ static void pscsi_bi_endio(struct bio *bio, int error)
        bio_put(bio);
 }
 
-static inline struct bio *pscsi_get_bio(int sg_num)
+static inline struct bio *pscsi_get_bio(int nr_vecs)
 {
        struct bio *bio;
        /*
         * Use bio_malloc() following the comment in for bio -> struct request
         * in block/blk-core.c:blk_make_request()
         */
-       bio = bio_kmalloc(GFP_KERNEL, sg_num);
+       bio = bio_kmalloc(GFP_KERNEL, nr_vecs);
        if (!bio) {
                pr_err("PSCSI: bio_kmalloc() failed\n");
                return NULL;
@@ -940,7 +940,6 @@ pscsi_map_sg(struct se_cmd *cmd, struct scatterlist *sgl, u32 sgl_nents,
                                bio = NULL;
                        }
 
-                       page++;
                        len -= bytes;
                        data_len -= bytes;
                        off = 0;
@@ -952,7 +951,6 @@ fail:
        while (*hbio) {
                bio = *hbio;
                *hbio = (*hbio)->bi_next;
-               bio->bi_next = NULL;
                bio_endio(bio, 0);      /* XXX: should be error */
        }
        return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
@@ -1092,7 +1090,6 @@ fail_free_bio:
        while (hbio) {
                struct bio *bio = hbio;
                hbio = hbio->bi_next;
-               bio->bi_next = NULL;
                bio_endio(bio, 0);      /* XXX: should be error */
        }
        ret = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
@@ -1178,7 +1175,7 @@ static int __init pscsi_module_init(void)
        return transport_subsystem_register(&pscsi_template);
 }
 
-static void pscsi_module_exit(void)
+static void __exit pscsi_module_exit(void)
 {
        transport_subsystem_release(&pscsi_template);
 }