Merge git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending

Pull SCSI target fixes from Nicholas Bellinger:
 "This includes fixes from HCH for -rc1 configfs default_groups
  conversion changes that ended up breaking some iscsi-target
  default_groups, along with Sagi's ib_drain_qp() conversion for
  iser-target to use the common caller now available to RDMA kernel
  consumers in v4.6+ code"

* git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending:
  target: add a new add_wwn_groups fabrics method
  target: initialize the nacl base CIT begfore init_nodeacl
  target: remove ->fabric_cleanup_nodeacl
  iser-target: Use ib_drain_qp
This commit is contained in:
Linus Torvalds 2016-04-02 18:48:37 -05:00
commit d6c24df082
5 changed files with 29 additions and 66 deletions

View File

@ -63,7 +63,6 @@ isert_rdma_accept(struct isert_conn *isert_conn);
struct rdma_cm_id *isert_setup_id(struct isert_np *isert_np); struct rdma_cm_id *isert_setup_id(struct isert_np *isert_np);
static void isert_release_work(struct work_struct *work); static void isert_release_work(struct work_struct *work);
static void isert_wait4flush(struct isert_conn *isert_conn);
static void isert_recv_done(struct ib_cq *cq, struct ib_wc *wc); static void isert_recv_done(struct ib_cq *cq, struct ib_wc *wc);
static void isert_send_done(struct ib_cq *cq, struct ib_wc *wc); static void isert_send_done(struct ib_cq *cq, struct ib_wc *wc);
static void isert_login_recv_done(struct ib_cq *cq, struct ib_wc *wc); static void isert_login_recv_done(struct ib_cq *cq, struct ib_wc *wc);
@ -141,7 +140,7 @@ isert_create_qp(struct isert_conn *isert_conn,
attr.qp_context = isert_conn; attr.qp_context = isert_conn;
attr.send_cq = comp->cq; attr.send_cq = comp->cq;
attr.recv_cq = comp->cq; attr.recv_cq = comp->cq;
attr.cap.max_send_wr = ISERT_QP_MAX_REQ_DTOS; attr.cap.max_send_wr = ISERT_QP_MAX_REQ_DTOS + 1;
attr.cap.max_recv_wr = ISERT_QP_MAX_RECV_DTOS + 1; attr.cap.max_recv_wr = ISERT_QP_MAX_RECV_DTOS + 1;
attr.cap.max_send_sge = device->ib_device->attrs.max_sge; attr.cap.max_send_sge = device->ib_device->attrs.max_sge;
isert_conn->max_sge = min(device->ib_device->attrs.max_sge, isert_conn->max_sge = min(device->ib_device->attrs.max_sge,
@ -887,7 +886,7 @@ isert_disconnected_handler(struct rdma_cm_id *cma_id,
break; break;
case ISER_CONN_UP: case ISER_CONN_UP:
isert_conn_terminate(isert_conn); isert_conn_terminate(isert_conn);
isert_wait4flush(isert_conn); ib_drain_qp(isert_conn->qp);
isert_handle_unbound_conn(isert_conn); isert_handle_unbound_conn(isert_conn);
break; break;
case ISER_CONN_BOUND: case ISER_CONN_BOUND:
@ -3213,36 +3212,6 @@ isert_wait4cmds(struct iscsi_conn *conn)
} }
} }
static void
isert_beacon_done(struct ib_cq *cq, struct ib_wc *wc)
{
struct isert_conn *isert_conn = wc->qp->qp_context;
isert_print_wc(wc, "beacon");
isert_info("conn %p completing wait_comp_err\n", isert_conn);
complete(&isert_conn->wait_comp_err);
}
static void
isert_wait4flush(struct isert_conn *isert_conn)
{
struct ib_recv_wr *bad_wr;
static struct ib_cqe cqe = { .done = isert_beacon_done };
isert_info("conn %p\n", isert_conn);
init_completion(&isert_conn->wait_comp_err);
isert_conn->beacon.wr_cqe = &cqe;
/* post an indication that all flush errors were consumed */
if (ib_post_recv(isert_conn->qp, &isert_conn->beacon, &bad_wr)) {
isert_err("conn %p failed to post beacon", isert_conn);
return;
}
wait_for_completion(&isert_conn->wait_comp_err);
}
/** /**
* isert_put_unsol_pending_cmds() - Drop commands waiting for * isert_put_unsol_pending_cmds() - Drop commands waiting for
* unsolicitate dataout * unsolicitate dataout
@ -3288,7 +3257,7 @@ static void isert_wait_conn(struct iscsi_conn *conn)
isert_conn_terminate(isert_conn); isert_conn_terminate(isert_conn);
mutex_unlock(&isert_conn->mutex); mutex_unlock(&isert_conn->mutex);
isert_wait4flush(isert_conn); ib_drain_qp(isert_conn->qp);
isert_put_unsol_pending_cmds(conn); isert_put_unsol_pending_cmds(conn);
isert_wait4cmds(conn); isert_wait4cmds(conn);
isert_wait4logout(isert_conn); isert_wait4logout(isert_conn);
@ -3300,7 +3269,7 @@ static void isert_free_conn(struct iscsi_conn *conn)
{ {
struct isert_conn *isert_conn = conn->context; struct isert_conn *isert_conn = conn->context;
isert_wait4flush(isert_conn); ib_drain_qp(isert_conn->qp);
isert_put_conn(isert_conn); isert_put_conn(isert_conn);
} }

View File

@ -209,14 +209,12 @@ struct isert_conn {
struct ib_qp *qp; struct ib_qp *qp;
struct isert_device *device; struct isert_device *device;
struct mutex mutex; struct mutex mutex;
struct completion wait_comp_err;
struct kref kref; struct kref kref;
struct list_head fr_pool; struct list_head fr_pool;
int fr_pool_size; int fr_pool_size;
/* lock to protect fastreg pool */ /* lock to protect fastreg pool */
spinlock_t pool_lock; spinlock_t pool_lock;
struct work_struct release_work; struct work_struct release_work;
struct ib_recv_wr beacon;
bool logout_posted; bool logout_posted;
bool snd_w_inv; bool snd_w_inv;
}; };

View File

@ -779,14 +779,6 @@ static int lio_target_init_nodeacl(struct se_node_acl *se_nacl,
return 0; return 0;
} }
static void lio_target_cleanup_nodeacl( struct se_node_acl *se_nacl)
{
struct iscsi_node_acl *acl = container_of(se_nacl,
struct iscsi_node_acl, se_node_acl);
configfs_remove_default_groups(&acl->se_node_acl.acl_fabric_stat_group);
}
/* End items for lio_target_acl_cit */ /* End items for lio_target_acl_cit */
/* Start items for lio_target_tpg_attrib_cit */ /* Start items for lio_target_tpg_attrib_cit */
@ -1247,6 +1239,16 @@ static struct se_wwn *lio_target_call_coreaddtiqn(
if (IS_ERR(tiqn)) if (IS_ERR(tiqn))
return ERR_CAST(tiqn); return ERR_CAST(tiqn);
pr_debug("LIO_Target_ConfigFS: REGISTER -> %s\n", tiqn->tiqn);
pr_debug("LIO_Target_ConfigFS: REGISTER -> Allocated Node:"
" %s\n", name);
return &tiqn->tiqn_wwn;
}
static void lio_target_add_wwn_groups(struct se_wwn *wwn)
{
struct iscsi_tiqn *tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn);
config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_instance_group, config_group_init_type_name(&tiqn->tiqn_stat_grps.iscsi_instance_group,
"iscsi_instance", &iscsi_stat_instance_cit); "iscsi_instance", &iscsi_stat_instance_cit);
configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_instance_group, configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_instance_group,
@ -1271,12 +1273,6 @@ static struct se_wwn *lio_target_call_coreaddtiqn(
"iscsi_logout_stats", &iscsi_stat_logout_cit); "iscsi_logout_stats", &iscsi_stat_logout_cit);
configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_logout_stats_group, configfs_add_default_group(&tiqn->tiqn_stat_grps.iscsi_logout_stats_group,
&tiqn->tiqn_wwn.fabric_stat_group); &tiqn->tiqn_wwn.fabric_stat_group);
pr_debug("LIO_Target_ConfigFS: REGISTER -> %s\n", tiqn->tiqn);
pr_debug("LIO_Target_ConfigFS: REGISTER -> Allocated Node:"
" %s\n", name);
return &tiqn->tiqn_wwn;
} }
static void lio_target_call_coredeltiqn( static void lio_target_call_coredeltiqn(
@ -1284,8 +1280,6 @@ static void lio_target_call_coredeltiqn(
{ {
struct iscsi_tiqn *tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn); struct iscsi_tiqn *tiqn = container_of(wwn, struct iscsi_tiqn, tiqn_wwn);
configfs_remove_default_groups(&tiqn->tiqn_wwn.fabric_stat_group);
pr_debug("LIO_Target_ConfigFS: DEREGISTER -> %s\n", pr_debug("LIO_Target_ConfigFS: DEREGISTER -> %s\n",
tiqn->tiqn); tiqn->tiqn);
iscsit_del_tiqn(tiqn); iscsit_del_tiqn(tiqn);
@ -1660,12 +1654,12 @@ const struct target_core_fabric_ops iscsi_ops = {
.aborted_task = lio_aborted_task, .aborted_task = lio_aborted_task,
.fabric_make_wwn = lio_target_call_coreaddtiqn, .fabric_make_wwn = lio_target_call_coreaddtiqn,
.fabric_drop_wwn = lio_target_call_coredeltiqn, .fabric_drop_wwn = lio_target_call_coredeltiqn,
.add_wwn_groups = lio_target_add_wwn_groups,
.fabric_make_tpg = lio_target_tiqn_addtpg, .fabric_make_tpg = lio_target_tiqn_addtpg,
.fabric_drop_tpg = lio_target_tiqn_deltpg, .fabric_drop_tpg = lio_target_tiqn_deltpg,
.fabric_make_np = lio_target_call_addnptotpg, .fabric_make_np = lio_target_call_addnptotpg,
.fabric_drop_np = lio_target_call_delnpfromtpg, .fabric_drop_np = lio_target_call_delnpfromtpg,
.fabric_init_nodeacl = lio_target_init_nodeacl, .fabric_init_nodeacl = lio_target_init_nodeacl,
.fabric_cleanup_nodeacl = lio_target_cleanup_nodeacl,
.tfc_discovery_attrs = lio_target_discovery_auth_attrs, .tfc_discovery_attrs = lio_target_discovery_auth_attrs,
.tfc_wwn_attrs = lio_target_wwn_attrs, .tfc_wwn_attrs = lio_target_wwn_attrs,

View File

@ -338,10 +338,8 @@ static void target_fabric_nacl_base_release(struct config_item *item)
{ {
struct se_node_acl *se_nacl = container_of(to_config_group(item), struct se_node_acl *se_nacl = container_of(to_config_group(item),
struct se_node_acl, acl_group); struct se_node_acl, acl_group);
struct target_fabric_configfs *tf = se_nacl->se_tpg->se_tpg_wwn->wwn_tf;
if (tf->tf_ops->fabric_cleanup_nodeacl) configfs_remove_default_groups(&se_nacl->acl_fabric_stat_group);
tf->tf_ops->fabric_cleanup_nodeacl(se_nacl);
core_tpg_del_initiator_node_acl(se_nacl); core_tpg_del_initiator_node_acl(se_nacl);
} }
@ -383,14 +381,6 @@ static struct config_group *target_fabric_make_nodeacl(
if (IS_ERR(se_nacl)) if (IS_ERR(se_nacl))
return ERR_CAST(se_nacl); return ERR_CAST(se_nacl);
if (tf->tf_ops->fabric_init_nodeacl) {
int ret = tf->tf_ops->fabric_init_nodeacl(se_nacl, name);
if (ret) {
core_tpg_del_initiator_node_acl(se_nacl);
return ERR_PTR(ret);
}
}
config_group_init_type_name(&se_nacl->acl_group, name, config_group_init_type_name(&se_nacl->acl_group, name,
&tf->tf_tpg_nacl_base_cit); &tf->tf_tpg_nacl_base_cit);
@ -414,6 +404,15 @@ static struct config_group *target_fabric_make_nodeacl(
configfs_add_default_group(&se_nacl->acl_fabric_stat_group, configfs_add_default_group(&se_nacl->acl_fabric_stat_group,
&se_nacl->acl_group); &se_nacl->acl_group);
if (tf->tf_ops->fabric_init_nodeacl) {
int ret = tf->tf_ops->fabric_init_nodeacl(se_nacl, name);
if (ret) {
configfs_remove_default_groups(&se_nacl->acl_fabric_stat_group);
core_tpg_del_initiator_node_acl(se_nacl);
return ERR_PTR(ret);
}
}
return &se_nacl->acl_group; return &se_nacl->acl_group;
} }
@ -892,6 +891,7 @@ static void target_fabric_release_wwn(struct config_item *item)
struct se_wwn, wwn_group); struct se_wwn, wwn_group);
struct target_fabric_configfs *tf = wwn->wwn_tf; struct target_fabric_configfs *tf = wwn->wwn_tf;
configfs_remove_default_groups(&wwn->fabric_stat_group);
tf->tf_ops->fabric_drop_wwn(wwn); tf->tf_ops->fabric_drop_wwn(wwn);
} }
@ -945,6 +945,8 @@ static struct config_group *target_fabric_make_wwn(
&tf->tf_wwn_fabric_stats_cit); &tf->tf_wwn_fabric_stats_cit);
configfs_add_default_group(&wwn->fabric_stat_group, &wwn->wwn_group); configfs_add_default_group(&wwn->fabric_stat_group, &wwn->wwn_group);
if (tf->tf_ops->add_wwn_groups)
tf->tf_ops->add_wwn_groups(wwn);
return &wwn->wwn_group; return &wwn->wwn_group;
} }

View File

@ -76,6 +76,7 @@ struct target_core_fabric_ops {
struct se_wwn *(*fabric_make_wwn)(struct target_fabric_configfs *, struct se_wwn *(*fabric_make_wwn)(struct target_fabric_configfs *,
struct config_group *, const char *); struct config_group *, const char *);
void (*fabric_drop_wwn)(struct se_wwn *); void (*fabric_drop_wwn)(struct se_wwn *);
void (*add_wwn_groups)(struct se_wwn *);
struct se_portal_group *(*fabric_make_tpg)(struct se_wwn *, struct se_portal_group *(*fabric_make_tpg)(struct se_wwn *,
struct config_group *, const char *); struct config_group *, const char *);
void (*fabric_drop_tpg)(struct se_portal_group *); void (*fabric_drop_tpg)(struct se_portal_group *);
@ -87,7 +88,6 @@ struct target_core_fabric_ops {
struct config_group *, const char *); struct config_group *, const char *);
void (*fabric_drop_np)(struct se_tpg_np *); void (*fabric_drop_np)(struct se_tpg_np *);
int (*fabric_init_nodeacl)(struct se_node_acl *, const char *); int (*fabric_init_nodeacl)(struct se_node_acl *, const char *);
void (*fabric_cleanup_nodeacl)(struct se_node_acl *);
struct configfs_attribute **tfc_discovery_attrs; struct configfs_attribute **tfc_discovery_attrs;
struct configfs_attribute **tfc_wwn_attrs; struct configfs_attribute **tfc_wwn_attrs;