target: Convert se_node_acl->device_list[] to RCU hlist
[firefly-linux-kernel-4.4.55.git] / drivers / target / target_core_spc.c
index 78c0b40fa5c00f243a5d49dc12206b2de18d1a20..9f995b87b8d1c67d89907843adf4fb53833e1a12 100644 (file)
@@ -981,6 +981,7 @@ static sense_reason_t spc_emulate_modesense(struct se_cmd *cmd)
        int length = 0;
        int ret;
        int i;
+       bool read_only = target_lun_is_rdonly(cmd);;
 
        memset(buf, 0, SE_MODE_PAGE_BUF);
 
@@ -991,9 +992,7 @@ static sense_reason_t spc_emulate_modesense(struct se_cmd *cmd)
        length = ten ? 3 : 2;
 
        /* DEVICE-SPECIFIC PARAMETER */
-       if ((cmd->se_lun->lun_access & TRANSPORT_LUNFLAGS_READ_ONLY) ||
-           (cmd->se_deve &&
-            (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY)))
+       if ((cmd->se_lun->lun_access & TRANSPORT_LUNFLAGS_READ_ONLY) || read_only)
                spc_modesense_write_protect(&buf[length], type);
 
        /*
@@ -1211,8 +1210,9 @@ sense_reason_t spc_emulate_report_luns(struct se_cmd *cmd)
 {
        struct se_dev_entry *deve;
        struct se_session *sess = cmd->se_sess;
+       struct se_node_acl *nacl;
        unsigned char *buf;
-       u32 lun_count = 0, offset = 8, i;
+       u32 lun_count = 0, offset = 8;
 
        if (cmd->data_length < 16) {
                pr_warn("REPORT LUNS allocation length %u too small\n",
@@ -1234,12 +1234,10 @@ sense_reason_t spc_emulate_report_luns(struct se_cmd *cmd)
                lun_count = 1;
                goto done;
        }
+       nacl = sess->se_node_acl;
 
-       spin_lock_irq(&sess->se_node_acl->device_list_lock);
-       for (i = 0; i < TRANSPORT_MAX_LUNS_PER_TPG; i++) {
-               deve = sess->se_node_acl->device_list[i];
-               if (!(deve->lun_flags & TRANSPORT_LUNFLAGS_INITIATOR_ACCESS))
-                       continue;
+       rcu_read_lock();
+       hlist_for_each_entry_rcu(deve, &nacl->lun_entry_hlist, link) {
                /*
                 * We determine the correct LUN LIST LENGTH even once we
                 * have reached the initial allocation length.
@@ -1252,7 +1250,7 @@ sense_reason_t spc_emulate_report_luns(struct se_cmd *cmd)
                int_to_scsilun(deve->mapped_lun, (struct scsi_lun *)&buf[offset]);
                offset += 8;
        }
-       spin_unlock_irq(&sess->se_node_acl->device_list_lock);
+       rcu_read_unlock();
 
        /*
         * See SPC3 r07, page 159.