From: Matthew Wilcox Date: Mon, 11 Feb 2019 21:04:04 +0000 (-0500) Subject: iscsi_target: Convert g_tiqn_list and tiqn_idr to XArray X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=c845c408c43b911caa1d4c8fb4c4bb764d416dbe;p=users%2Fwilly%2Fxarray.git iscsi_target: Convert g_tiqn_list and tiqn_idr to XArray Signed-off-by: Matthew Wilcox --- diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index d19e051f2bc2..7b0af8ddba9e 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c @@ -43,12 +43,10 @@ #include -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; diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c index 89183b3b178f..2593d4fa0a9d 100644 --- a/drivers/target/iscsi/iscsi_target_util.c +++ b/drivers/target/iscsi/iscsi_target_util.c @@ -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, diff --git a/include/target/iscsi/iscsi_target_core.h b/include/target/iscsi/iscsi_target_core.h index a49d37140a64..2faf48070b90 100644 --- a/include/target/iscsi/iscsi_target_core.h +++ b/include/target/iscsi/iscsi_target_core.h @@ -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;