]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'target-updates/for-next'
authorThierry Reding <treding@nvidia.com>
Thu, 24 Oct 2013 12:59:34 +0000 (14:59 +0200)
committerThierry Reding <treding@nvidia.com>
Thu, 24 Oct 2013 12:59:34 +0000 (14:59 +0200)
1  2 
drivers/target/iscsi/iscsi_target.c
drivers/target/iscsi/iscsi_target_nego.c
drivers/usb/gadget/tcm_usb_gadget.c
drivers/vhost/scsi.c

index 38e44b9abf0f145eacde1e9b90dcf26c45ca2633,e183352a0645c3139d433eac8c7ee5d618fb7a56..c831ccf5e6815823a8bc6c63914374b42c124d03
@@@ -753,8 -753,7 +753,8 @@@ static void iscsit_unmap_iovec(struct i
  
  static void iscsit_ack_from_expstatsn(struct iscsi_conn *conn, u32 exp_statsn)
  {
 -      struct iscsi_cmd *cmd;
 +      LIST_HEAD(ack_list);
 +      struct iscsi_cmd *cmd, *cmd_p;
  
        conn->exp_statsn = exp_statsn;
  
                return;
  
        spin_lock_bh(&conn->cmd_lock);
 -      list_for_each_entry(cmd, &conn->conn_cmd_list, i_conn_node) {
 +      list_for_each_entry_safe(cmd, cmd_p, &conn->conn_cmd_list, i_conn_node) {
                spin_lock(&cmd->istate_lock);
                if ((cmd->i_state == ISTATE_SENT_STATUS) &&
                    iscsi_sna_lt(cmd->stat_sn, exp_statsn)) {
                        cmd->i_state = ISTATE_REMOVE;
                        spin_unlock(&cmd->istate_lock);
 -                      iscsit_add_cmd_to_immediate_queue(cmd, conn,
 -                                              cmd->i_state);
 +                      list_move_tail(&cmd->i_conn_node, &ack_list);
                        continue;
                }
                spin_unlock(&cmd->istate_lock);
        }
        spin_unlock_bh(&conn->cmd_lock);
 +
 +      list_for_each_entry_safe(cmd, cmd_p, &ack_list, i_conn_node) {
 +              list_del(&cmd->i_conn_node);
 +              iscsit_free_cmd(cmd, false);
 +      }
  }
  
  static int iscsit_allocate_iovecs(struct iscsi_cmd *cmd)
@@@ -3374,6 -3369,7 +3374,7 @@@ static int iscsit_build_sendtargets_res
        struct iscsi_tiqn *tiqn;
        struct iscsi_tpg_np *tpg_np;
        int buffer_len, end_of_buf = 0, len = 0, payload_len = 0;
+       int target_name_printed;
        unsigned char buf[ISCSI_IQN_LEN+12]; /* iqn + "TargetName=" + \0 */
        unsigned char *text_in = cmd->text_in_ptr, *text_ptr = NULL;
  
                        continue;
                }
  
-               len = sprintf(buf, "TargetName=%s", tiqn->tiqn);
-               len += 1;
-               if ((len + payload_len) > buffer_len) {
-                       end_of_buf = 1;
-                       goto eob;
-               }
-               memcpy(payload + payload_len, buf, len);
-               payload_len += len;
+               target_name_printed = 0;
  
                spin_lock(&tiqn->tiqn_tpg_lock);
                list_for_each_entry(tpg, &tiqn->tiqn_tpg_list, tpg_list) {
  
+                       /* If demo_mode_discovery=0 and generate_node_acls=0
+                        * (demo mode dislabed) do not return
+                        * TargetName+TargetAddress unless a NodeACL exists.
+                        */
+                       if ((tpg->tpg_attrib.generate_node_acls == 0) &&
+                           (tpg->tpg_attrib.demo_mode_discovery == 0) &&
+                           (!core_tpg_get_initiator_node_acl(&tpg->tpg_se_tpg,
+                               cmd->conn->sess->sess_ops->InitiatorName))) {
+                               continue;
+                       }
                        spin_lock(&tpg->tpg_state_lock);
                        if ((tpg->tpg_state == TPG_STATE_FREE) ||
                            (tpg->tpg_state == TPG_STATE_INACTIVE)) {
                                struct iscsi_np *np = tpg_np->tpg_np;
                                bool inaddr_any = iscsit_check_inaddr_any(np);
  
+                               if (!target_name_printed) {
+                                       len = sprintf(buf, "TargetName=%s",
+                                                     tiqn->tiqn);
+                                       len += 1;
+                                       if ((len + payload_len) > buffer_len) {
+                                               spin_unlock(&tpg->tpg_np_lock);
+                                               spin_unlock(&tiqn->tiqn_tpg_lock);
+                                               end_of_buf = 1;
+                                               goto eob;
+                                       }
+                                       memcpy(payload + payload_len, buf, len);
+                                       payload_len += len;
+                                       target_name_printed = 1;
+                               }
                                len = sprintf(buf, "TargetAddress="
                                        "%s:%hu,%hu",
                                        (inaddr_any == false) ?
@@@ -4381,7 -4397,7 +4402,7 @@@ int iscsit_close_connection
  
  int iscsit_close_session(struct iscsi_session *sess)
  {
-       struct iscsi_portal_group *tpg = ISCSI_TPG_S(sess);
+       struct iscsi_portal_group *tpg = sess->tpg;
        struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
  
        if (atomic_read(&sess->nconn)) {
index ef6d836a4d09745d57ba42e2496dd725f85c57ea,21265c9c12b527417702017263a2b62937a26358..954f750f77479817ecb5abe5a70b8b35f9329996
@@@ -140,7 -140,7 +140,7 @@@ static u32 iscsi_handle_authentication
                        iscsi_nacl = container_of(se_nacl, struct iscsi_node_acl,
                                                  se_node_acl);
  
-                       auth = ISCSI_NODE_AUTH(iscsi_nacl);
+                       auth = &iscsi_nacl->node_auth;
                }
        } else {
                /*
@@@ -789,7 -789,7 +789,7 @@@ static int iscsi_target_handle_csg_zero
                return -1;
  
        if (!iscsi_check_negotiated_keys(conn->param_list)) {
-               if (ISCSI_TPG_ATTRIB(ISCSI_TPG_C(conn))->authentication &&
+               if (conn->tpg->tpg_attrib.authentication &&
                    !strncmp(param->value, NONE, 4)) {
                        pr_err("Initiator sent AuthMethod=None but"
                                " Target is enforcing iSCSI Authentication,"
                        return -1;
                }
  
-               if (ISCSI_TPG_ATTRIB(ISCSI_TPG_C(conn))->authentication &&
+               if (conn->tpg->tpg_attrib.authentication &&
                    !login->auth_complete)
                        return 0;
  
@@@ -862,7 -862,7 +862,7 @@@ static int iscsi_target_handle_csg_one(
        }
  
        if (!login->auth_complete &&
-            ISCSI_TPG_ATTRIB(ISCSI_TPG_C(conn))->authentication) {
+            conn->tpg->tpg_attrib.authentication) {
                pr_err("Initiator is requesting CSG: 1, has not been"
                         " successfully authenticated, and the Target is"
                        " enforcing iSCSI Authentication, login failed.\n");
@@@ -1192,7 -1192,7 +1192,7 @@@ get_target
         */
  alloc_tags:
        tag_num = max_t(u32, ISCSIT_MIN_TAGS, queue_depth);
 -      tag_num += ISCSIT_EXTRA_TAGS;
 +      tag_num += (tag_num / 2) + ISCSIT_EXTRA_TAGS;
        tag_size = sizeof(struct iscsi_cmd) + conn->conn_transport->priv_size;
  
        ret = transport_alloc_session_tags(sess->se_sess, tag_num, tag_size);
index eccea1df702df3afc45c692de31b23febfb52c37,9d89905e231864c89f3afca84c824ea5bdd66cf8..6c3d7950d2a9e56d5231938493127c0964f04221
@@@ -472,7 -472,7 +472,7 @@@ static int usbg_bot_setup(struct usb_fu
                bot_enqueue_cmd_cbw(fu);
                return 0;
                break;
 -      };
 +      }
        return -ENOTSUPP;
  }
  
@@@ -617,7 -617,7 +617,7 @@@ static void uasp_status_data_cmpl(struc
  
        default:
                BUG();
 -      };
 +      }
        return;
  
  cleanup:
@@@ -1923,15 -1923,15 +1923,15 @@@ static int usbg_register_configfs(void
        }
  
        fabric->tf_ops = usbg_ops;
-       TF_CIT_TMPL(fabric)->tfc_wwn_cit.ct_attrs = usbg_wwn_attrs;
-       TF_CIT_TMPL(fabric)->tfc_tpg_base_cit.ct_attrs = usbg_base_attrs;
-       TF_CIT_TMPL(fabric)->tfc_tpg_attrib_cit.ct_attrs = NULL;
-       TF_CIT_TMPL(fabric)->tfc_tpg_param_cit.ct_attrs = NULL;
-       TF_CIT_TMPL(fabric)->tfc_tpg_np_base_cit.ct_attrs = NULL;
-       TF_CIT_TMPL(fabric)->tfc_tpg_nacl_base_cit.ct_attrs = NULL;
-       TF_CIT_TMPL(fabric)->tfc_tpg_nacl_attrib_cit.ct_attrs = NULL;
-       TF_CIT_TMPL(fabric)->tfc_tpg_nacl_auth_cit.ct_attrs = NULL;
-       TF_CIT_TMPL(fabric)->tfc_tpg_nacl_param_cit.ct_attrs = NULL;
+       fabric->tf_cit_tmpl.tfc_wwn_cit.ct_attrs = usbg_wwn_attrs;
+       fabric->tf_cit_tmpl.tfc_tpg_base_cit.ct_attrs = usbg_base_attrs;
+       fabric->tf_cit_tmpl.tfc_tpg_attrib_cit.ct_attrs = NULL;
+       fabric->tf_cit_tmpl.tfc_tpg_param_cit.ct_attrs = NULL;
+       fabric->tf_cit_tmpl.tfc_tpg_np_base_cit.ct_attrs = NULL;
+       fabric->tf_cit_tmpl.tfc_tpg_nacl_base_cit.ct_attrs = NULL;
+       fabric->tf_cit_tmpl.tfc_tpg_nacl_attrib_cit.ct_attrs = NULL;
+       fabric->tf_cit_tmpl.tfc_tpg_nacl_auth_cit.ct_attrs = NULL;
+       fabric->tf_cit_tmpl.tfc_tpg_nacl_param_cit.ct_attrs = NULL;
        ret = target_fabric_configfs_register(fabric);
        if (ret < 0) {
                printk(KERN_ERR "target_fabric_configfs_register() failed"
diff --combined drivers/vhost/scsi.c
index ce5221fa393a8db2ca9f4de61817ae230f3f0bc8,0225c1f5eb397774d1a6ec7d31f2adf82cbc30f4..8cc9ac3ffc33095ea24c3ece3d27ceb007b4efd3
@@@ -728,12 -728,7 +728,12 @@@ vhost_scsi_get_tag(struct vhost_virtque
        }
        se_sess = tv_nexus->tvn_se_sess;
  
 -      tag = percpu_ida_alloc(&se_sess->sess_tag_pool, GFP_KERNEL);
 +      tag = percpu_ida_alloc(&se_sess->sess_tag_pool, GFP_ATOMIC);
 +      if (tag < 0) {
 +              pr_err("Unable to obtain tag for tcm_vhost_cmd\n");
 +              return ERR_PTR(-ENOMEM);
 +      }
 +
        cmd = &((struct tcm_vhost_cmd *)se_sess->sess_cmd_map)[tag];
        sg = cmd->tvc_sgl;
        pages = cmd->tvc_upages;
@@@ -2168,15 -2163,15 +2168,15 @@@ static int tcm_vhost_register_configfs(
        /*
         * Setup default attribute lists for various fabric->tf_cit_tmpl
         */
-       TF_CIT_TMPL(fabric)->tfc_wwn_cit.ct_attrs = tcm_vhost_wwn_attrs;
-       TF_CIT_TMPL(fabric)->tfc_tpg_base_cit.ct_attrs = tcm_vhost_tpg_attrs;
-       TF_CIT_TMPL(fabric)->tfc_tpg_attrib_cit.ct_attrs = NULL;
-       TF_CIT_TMPL(fabric)->tfc_tpg_param_cit.ct_attrs = NULL;
-       TF_CIT_TMPL(fabric)->tfc_tpg_np_base_cit.ct_attrs = NULL;
-       TF_CIT_TMPL(fabric)->tfc_tpg_nacl_base_cit.ct_attrs = NULL;
-       TF_CIT_TMPL(fabric)->tfc_tpg_nacl_attrib_cit.ct_attrs = NULL;
-       TF_CIT_TMPL(fabric)->tfc_tpg_nacl_auth_cit.ct_attrs = NULL;
-       TF_CIT_TMPL(fabric)->tfc_tpg_nacl_param_cit.ct_attrs = NULL;
+       fabric->tf_cit_tmpl.tfc_wwn_cit.ct_attrs = tcm_vhost_wwn_attrs;
+       fabric->tf_cit_tmpl.tfc_tpg_base_cit.ct_attrs = tcm_vhost_tpg_attrs;
+       fabric->tf_cit_tmpl.tfc_tpg_attrib_cit.ct_attrs = NULL;
+       fabric->tf_cit_tmpl.tfc_tpg_param_cit.ct_attrs = NULL;
+       fabric->tf_cit_tmpl.tfc_tpg_np_base_cit.ct_attrs = NULL;
+       fabric->tf_cit_tmpl.tfc_tpg_nacl_base_cit.ct_attrs = NULL;
+       fabric->tf_cit_tmpl.tfc_tpg_nacl_attrib_cit.ct_attrs = NULL;
+       fabric->tf_cit_tmpl.tfc_tpg_nacl_auth_cit.ct_attrs = NULL;
+       fabric->tf_cit_tmpl.tfc_tpg_nacl_param_cit.ct_attrs = NULL;
        /*
         * Register the fabric for use within TCM
         */