]> www.infradead.org Git - users/willy/xarray.git/commitdiff
iscsi_target: Convert g_tiqn_list and tiqn_idr to XArray
authorMatthew Wilcox <willy@infradead.org>
Mon, 11 Feb 2019 21:04:04 +0000 (16:04 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 9 Aug 2019 01:38:15 +0000 (21:38 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
drivers/target/iscsi/iscsi_target.c
drivers/target/iscsi/iscsi_target_util.c
include/target/iscsi/iscsi_target_core.h

index d19e051f2bc23562c78124f661c9fac5a8da1901..7b0af8ddba9e722b3586b224ec1bfcf92dad4ff7 100644 (file)
 
 #include <target/iscsi/iscsi_transport.h>
 
-static LIST_HEAD(g_tiqn_list);
 static LIST_HEAD(g_np_list);
-static DEFINE_SPINLOCK(tiqn_lock);
 static DEFINE_MUTEX(np_lock);
 
-static struct idr tiqn_idr;
+static DEFINE_XARRAY_ALLOC(tiqns);
 DEFINE_IDA(sess_ida);
 struct mutex auth_id_lock;
 
@@ -64,25 +62,24 @@ static int iscsit_handle_immediate_data(struct iscsi_cmd *,
 
 struct iscsi_tiqn *iscsit_get_tiqn_for_login(unsigned char *buf)
 {
-       struct iscsi_tiqn *tiqn = NULL;
+       struct iscsi_tiqn *tiqn;
+       unsigned long index;
 
-       spin_lock(&tiqn_lock);
-       list_for_each_entry(tiqn, &g_tiqn_list, tiqn_list) {
+       xa_lock(&tiqns);
+       xa_for_each(&tiqns, index, tiqn) {
                if (!strcmp(tiqn->tiqn, buf)) {
-
                        spin_lock(&tiqn->tiqn_state_lock);
                        if (tiqn->tiqn_state == TIQN_STATE_ACTIVE) {
                                tiqn->tiqn_access_count++;
                                spin_unlock(&tiqn->tiqn_state_lock);
-                               spin_unlock(&tiqn_lock);
-                               return tiqn;
+                               break;
                        }
                        spin_unlock(&tiqn->tiqn_state_lock);
                }
        }
-       spin_unlock(&tiqn_lock);
+       xa_unlock(&tiqns);
 
-       return NULL;
+       return tiqn;
 }
 
 static int iscsit_set_tiqn_shutdown(struct iscsi_tiqn *tiqn)
@@ -125,7 +122,6 @@ struct iscsi_tiqn *iscsit_add_tiqn(unsigned char *buf)
                return ERR_PTR(-ENOMEM);
 
        sprintf(tiqn->tiqn, "%s", buf);
-       INIT_LIST_HEAD(&tiqn->tiqn_list);
        INIT_LIST_HEAD(&tiqn->tiqn_tpg_list);
        spin_lock_init(&tiqn->tiqn_state_lock);
        spin_lock_init(&tiqn->tiqn_tpg_lock);
@@ -135,27 +131,17 @@ struct iscsi_tiqn *iscsit_add_tiqn(unsigned char *buf)
 
        tiqn->tiqn_state = TIQN_STATE_ACTIVE;
 
-       idr_preload(GFP_KERNEL);
-       spin_lock(&tiqn_lock);
-
-       ret = idr_alloc(&tiqn_idr, NULL, 0, 0, GFP_NOWAIT);
+       ret = xa_alloc(&tiqns, &tiqn->tiqn_index, tiqn, xa_limit_32b,
+                       GFP_KERNEL);
        if (ret < 0) {
-               pr_err("idr_alloc() failed for tiqn->tiqn_index\n");
-               spin_unlock(&tiqn_lock);
-               idr_preload_end();
+               pr_err("tiqn ID allocation failed\n");
                kfree(tiqn);
                return ERR_PTR(ret);
        }
-       tiqn->tiqn_index = ret;
-       list_add_tail(&tiqn->tiqn_list, &g_tiqn_list);
-
-       spin_unlock(&tiqn_lock);
-       idr_preload_end();
 
        pr_debug("CORE[0] - Added iSCSI Target IQN: %s\n", tiqn->tiqn);
 
        return tiqn;
-
 }
 
 static void iscsit_wait_for_tiqn(struct iscsi_tiqn *tiqn)
@@ -187,10 +173,7 @@ void iscsit_del_tiqn(struct iscsi_tiqn *tiqn)
 
        iscsit_wait_for_tiqn(tiqn);
 
-       spin_lock(&tiqn_lock);
-       list_del(&tiqn->tiqn_list);
-       idr_remove(&tiqn_idr, tiqn->tiqn_index);
-       spin_unlock(&tiqn_lock);
+       xa_erase(&tiqns, tiqn->tiqn_index);
 
        pr_debug("CORE[0] - Deleted iSCSI Target IQN: %s\n",
                        tiqn->tiqn);
@@ -692,7 +675,6 @@ static int __init iscsi_target_init_module(void)
 
        spin_lock_init(&iscsit_global->ts_bitmap_lock);
        mutex_init(&auth_id_lock);
-       idr_init(&tiqn_idr);
 
        ret = target_register_template(&iscsi_ops);
        if (ret)
@@ -3329,6 +3311,7 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd,
        struct iscsi_conn *conn = cmd->conn;
        struct iscsi_portal_group *tpg;
        struct iscsi_tiqn *tiqn;
+       unsigned long index;
        struct iscsi_tpg_np *tpg_np;
        int buffer_len, end_of_buf = 0, len = 0, payload_len = 0;
        int target_name_printed;
@@ -3361,8 +3344,8 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd,
                text_ptr += 1;
        }
 
-       spin_lock(&tiqn_lock);
-       list_for_each_entry(tiqn, &g_tiqn_list, tiqn_list) {
+       xa_lock(&tiqns);
+       xa_for_each(&tiqns, index, tiqn) {
                if ((cmd->cmd_flags & ICF_SENDTARGETS_SINGLE) &&
                     strcmp(tiqn->tiqn, text_ptr)) {
                        continue;
@@ -3463,7 +3446,7 @@ eob:
                if (cmd->cmd_flags & ICF_SENDTARGETS_SINGLE)
                        break;
        }
-       spin_unlock(&tiqn_lock);
+       xa_unlock(&tiqns);
 
        cmd->buf_ptr = payload;
 
index 89183b3b178ffc950f9521635eef37a3d4325ad9..2593d4fa0a9d338b164a67ea115815675cd38fdb 100644 (file)
@@ -45,9 +45,6 @@
                pr_debug("\n");                                 \
 }
 
-extern struct list_head g_tiqn_list;
-extern spinlock_t tiqn_lock;
-
 int iscsit_add_r2t_to_list(
        struct iscsi_cmd *cmd,
        u32 offset,
index a49d37140a6446afb7e9bb24d9bc60e0dca3bc60..2faf48070b90974cc911eb0e60364dd8082d4fc2 100644 (file)
@@ -864,7 +864,6 @@ struct iscsi_tiqn {
        u32                     tiqn_ntpgs;
        u32                     tiqn_num_tpg_nps;
        u32                     tiqn_nsessions;
-       struct list_head        tiqn_list;
        struct list_head        tiqn_tpg_list;
        spinlock_t              tiqn_state_lock;
        spinlock_t              tiqn_tpg_lock;