Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9de3a1ef authored by Mike Christie's avatar Mike Christie Committed by Martin K. Petersen
Browse files

scsi: tcmu: simplify nl interface



Just return EBUSY if a nl request comes in while processing one. The upper
layers do not support sending multiple create/remove requests at the same
time (you cannot have a create and remove at the same time or do multiple
creates or removes at the same time) and doing a reconfig while a
create/remove is still executing does not make sense.

Signed-off-by: default avatarMike Christie <mchristi@redhat.com>
Tested-by: default avatarXiubo Li <xiubli@redhat.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 3228691f
Loading
Loading
Loading
Loading
+12 −14
Original line number Original line Diff line number Diff line
@@ -165,8 +165,6 @@ struct tcmu_dev {
	struct list_head timedout_entry;
	struct list_head timedout_entry;


	struct tcmu_nl_cmd curr_nl_cmd;
	struct tcmu_nl_cmd curr_nl_cmd;
	/* wake up threads waiting on curr_nl_cmd */
	wait_queue_head_t nl_cmd_wq;


	char dev_config[TCMU_CONFIG_LEN];
	char dev_config[TCMU_CONFIG_LEN];


@@ -1264,8 +1262,6 @@ static struct se_device *tcmu_alloc_device(struct se_hba *hba, const char *name)
	timer_setup(&udev->qfull_timer, tcmu_qfull_timedout, 0);
	timer_setup(&udev->qfull_timer, tcmu_qfull_timedout, 0);
	timer_setup(&udev->cmd_timer, tcmu_cmd_timedout, 0);
	timer_setup(&udev->cmd_timer, tcmu_cmd_timedout, 0);


	init_waitqueue_head(&udev->nl_cmd_wq);

	INIT_RADIX_TREE(&udev->data_blocks, GFP_KERNEL);
	INIT_RADIX_TREE(&udev->data_blocks, GFP_KERNEL);


	return &udev->se_dev;
	return &udev->se_dev;
@@ -1539,24 +1535,23 @@ static int tcmu_release(struct uio_info *info, struct inode *inode)
	return 0;
	return 0;
}
}


static void tcmu_init_genl_cmd_reply(struct tcmu_dev *udev, int cmd)
static int tcmu_init_genl_cmd_reply(struct tcmu_dev *udev, int cmd)
{
{
	struct tcmu_nl_cmd *nl_cmd = &udev->curr_nl_cmd;
	struct tcmu_nl_cmd *nl_cmd = &udev->curr_nl_cmd;


	if (!tcmu_kern_cmd_reply_supported)
	if (!tcmu_kern_cmd_reply_supported)
		return;
		return 0;


	if (udev->nl_reply_supported <= 0)
	if (udev->nl_reply_supported <= 0)
		return;
		return 0;


relock:
	mutex_lock(&tcmu_nl_cmd_mutex);
	mutex_lock(&tcmu_nl_cmd_mutex);


	if (nl_cmd->cmd != TCMU_CMD_UNSPEC) {
	if (nl_cmd->cmd != TCMU_CMD_UNSPEC) {
		mutex_unlock(&tcmu_nl_cmd_mutex);
		mutex_unlock(&tcmu_nl_cmd_mutex);
		pr_debug("sleeping for open nl cmd\n");
		pr_warn("netlink cmd %d already executing on %s\n",
		wait_event(udev->nl_cmd_wq, (nl_cmd->cmd == TCMU_CMD_UNSPEC));
			 nl_cmd->cmd, udev->name);
		goto relock;
		return -EBUSY;
	}
	}


	memset(nl_cmd, 0, sizeof(*nl_cmd));
	memset(nl_cmd, 0, sizeof(*nl_cmd));
@@ -1568,6 +1563,7 @@ static void tcmu_init_genl_cmd_reply(struct tcmu_dev *udev, int cmd)
	list_add_tail(&nl_cmd->nl_list, &tcmu_nl_cmd_list);
	list_add_tail(&nl_cmd->nl_list, &tcmu_nl_cmd_list);


	mutex_unlock(&tcmu_nl_cmd_mutex);
	mutex_unlock(&tcmu_nl_cmd_mutex);
	return 0;
}
}


static int tcmu_wait_genl_cmd_reply(struct tcmu_dev *udev)
static int tcmu_wait_genl_cmd_reply(struct tcmu_dev *udev)
@@ -1590,8 +1586,6 @@ static int tcmu_wait_genl_cmd_reply(struct tcmu_dev *udev)
	nl_cmd->status = 0;
	nl_cmd->status = 0;
	mutex_unlock(&tcmu_nl_cmd_mutex);
	mutex_unlock(&tcmu_nl_cmd_mutex);


	wake_up_all(&udev->nl_cmd_wq);

	return ret;
	return ret;
}
}


@@ -1642,7 +1636,11 @@ static int tcmu_netlink_event_send(struct tcmu_dev *udev,


	genlmsg_end(skb, msg_header);
	genlmsg_end(skb, msg_header);


	tcmu_init_genl_cmd_reply(udev, cmd);
	ret = tcmu_init_genl_cmd_reply(udev, cmd);
	if (ret) {
		nlmsg_free(skb);
		return ret;
	}


	ret = genlmsg_multicast_allns(&tcmu_genl_family, skb, 0,
	ret = genlmsg_multicast_allns(&tcmu_genl_family, skb, 0,
				      TCMU_MCGRP_CONFIG, GFP_KERNEL);
				      TCMU_MCGRP_CONFIG, GFP_KERNEL);