Blob Blame History Raw
From: Enzo Matsumiya <ematsumiya@suse.de>
Patch-mainline: Never, kabi fix
Subject: fix kABI breakage in NVMe driver
References: bsc#1181161

Use admin_q when __GENKSYMS__ is set. Otherwise, use the new fabrics_q member.

This is related to the changes introduced in patch
patches.suse/nvme-make-fabrics-command-run-on-a-separate-request-.patch

--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -165,7 +165,9 @@ struct nvme_ctrl {
 	const struct nvme_ctrl_ops *ops;
 	struct request_queue *admin_q;
 	struct request_queue *connect_q;
+#ifndef __GENKSYMS__
 	struct request_queue *fabrics_q;
+#endif
 	struct device *dev;
 	int instance;
 	int numa_node;
--- a/drivers/nvme/host/fabrics.c
+++ b/drivers/nvme/host/fabrics.c
@@ -158,8 +158,13 @@ int nvmf_reg_read32(struct nvme_ctrl *ct
 	cmd.prop_get.fctype = nvme_fabrics_type_property_get;
 	cmd.prop_get.offset = cpu_to_le32(off);
 
+#ifdef __GENKSYMS__
+	ret = __nvme_submit_sync_cmd(ctrl->admin_q, &cmd, &res, NULL, 0, 0,
+			NVME_QID_ANY, 0, 0);
+#else
 	ret = __nvme_submit_sync_cmd(ctrl->fabrics_q, &cmd, &res, NULL, 0, 0,
 			NVME_QID_ANY, 0, 0);
+#endif
 
 	if (ret >= 0)
 		*val = le64_to_cpu(res.u64);
@@ -205,8 +210,13 @@ int nvmf_reg_read64(struct nvme_ctrl *ct
 	cmd.prop_get.attrib = 1;
 	cmd.prop_get.offset = cpu_to_le32(off);
 
+#ifdef __GENKSYMS__
+	ret = __nvme_submit_sync_cmd(ctrl->admin_q, &cmd, &res, NULL, 0, 0,
+			NVME_QID_ANY, 0, 0);
+#else
 	ret = __nvme_submit_sync_cmd(ctrl->fabrics_q, &cmd, &res, NULL, 0, 0,
 			NVME_QID_ANY, 0, 0);
+#endif
 
 	if (ret >= 0)
 		*val = le64_to_cpu(res.u64);
@@ -251,8 +261,13 @@ int nvmf_reg_write32(struct nvme_ctrl *c
 	cmd.prop_set.offset = cpu_to_le32(off);
 	cmd.prop_set.value = cpu_to_le64(val);
 
+#ifdef __GENKSYMS__
+	ret = __nvme_submit_sync_cmd(ctrl->admin_q, &cmd, NULL, NULL, 0, 0,
+			NVME_QID_ANY, 0, 0);
+#else
 	ret = __nvme_submit_sync_cmd(ctrl->fabrics_q, &cmd, NULL, NULL, 0, 0,
 			NVME_QID_ANY, 0, 0);
+#endif
 	if (unlikely(ret))
 		dev_err(ctrl->device,
 			"Property Set error: %d, offset %#x\n",
@@ -404,9 +419,15 @@ int nvmf_connect_admin_queue(struct nvme
 	strncpy(data->subsysnqn, ctrl->opts->subsysnqn, NVMF_NQN_SIZE);
 	strncpy(data->hostnqn, ctrl->opts->host->nqn, NVMF_NQN_SIZE);
 
+#ifdef __GENKSYMS__
+	ret = __nvme_submit_sync_cmd(ctrl->admin_q, &cmd, &res,
+			data, sizeof(*data), 0, NVME_QID_ANY, 1,
+			BLK_MQ_REQ_RESERVED | BLK_MQ_REQ_NOWAIT);
+#else
 	ret = __nvme_submit_sync_cmd(ctrl->fabrics_q, &cmd, &res,
 			data, sizeof(*data), 0, NVME_QID_ANY, 1,
 			BLK_MQ_REQ_RESERVED | BLK_MQ_REQ_NOWAIT);
+#endif
 	if (ret) {
 		nvmf_log_connect_error(ctrl, ret, le32_to_cpu(res.u32),
 				       &cmd, data);
--- a/drivers/nvme/host/fc.c
+++ b/drivers/nvme/host/fc.c
@@ -2043,7 +2043,9 @@ nvme_fc_ctrl_free(struct kref *ref)
 
 	blk_mq_unquiesce_queue(ctrl->ctrl.admin_q);
 	blk_cleanup_queue(ctrl->ctrl.admin_q);
+#ifndef __GENKSYMS__
 	blk_cleanup_queue(ctrl->ctrl.fabrics_q);
+#endif
 	blk_mq_free_tag_set(&ctrl->admin_tag_set);
 
 	kfree(ctrl->queues);
@@ -3155,11 +3157,13 @@ nvme_fc_init_ctrl(struct device *dev, st
 		goto out_free_queues;
 	ctrl->ctrl.admin_tagset = &ctrl->admin_tag_set;
 
+#ifndef __GENKSYMS__
 	ctrl->ctrl.fabrics_q = blk_mq_init_queue(&ctrl->admin_tag_set);
 	if (IS_ERR(ctrl->ctrl.fabrics_q)) {
 		ret = PTR_ERR(ctrl->ctrl.fabrics_q);
 		goto out_free_admin_tag_set;
 	}
+#endif
 
 	ctrl->ctrl.admin_q = blk_mq_init_queue(&ctrl->admin_tag_set);
 	if (IS_ERR(ctrl->ctrl.admin_q)) {
@@ -3235,7 +3239,9 @@ fail_ctrl:
 out_cleanup_admin_q:
 	blk_cleanup_queue(ctrl->ctrl.admin_q);
 out_cleanup_fabrics_q:
+#ifndef __GENKSYMS__
 	blk_cleanup_queue(ctrl->ctrl.fabrics_q);
+#endif
 out_free_admin_tag_set:
 	blk_mq_free_tag_set(&ctrl->admin_tag_set);
 out_free_queues:
--- a/drivers/nvme/host/rdma.c
+++ b/drivers/nvme/host/rdma.c
@@ -728,7 +728,9 @@ static void nvme_rdma_destroy_admin_queu
 {
 	if (remove) {
 		blk_cleanup_queue(ctrl->ctrl.admin_q);
+#ifndef __GENKSYMS__
 		blk_cleanup_queue(ctrl->ctrl.fabrics_q);
+#endif
 		blk_mq_free_tag_set(ctrl->ctrl.admin_tagset);
 	}
 	if (ctrl->async_event_sqe.data) {
@@ -770,11 +772,13 @@ static int nvme_rdma_configure_admin_que
 			goto out_free_async_qe;
 		}
 
+#ifndef __GENKSYMS__
 		ctrl->ctrl.fabrics_q = blk_mq_init_queue(&ctrl->admin_tag_set);
 		if (IS_ERR(ctrl->ctrl.fabrics_q)) {
 			error = PTR_ERR(ctrl->ctrl.fabrics_q);
 			goto out_free_tagset;
 		}
+#endif
 
 		ctrl->ctrl.admin_q = blk_mq_init_queue(&ctrl->admin_tag_set);
 		if (IS_ERR(ctrl->ctrl.admin_q)) {
@@ -819,8 +823,10 @@ out_cleanup_queue:
 	if (new)
 		blk_cleanup_queue(ctrl->ctrl.admin_q);
 out_cleanup_fabrics_q:
+#ifndef __GENKSYMS__
 	if (new)
 		blk_cleanup_queue(ctrl->ctrl.fabrics_q);
+#endif
 out_free_tagset:
 	if (new)
 		blk_mq_free_tag_set(ctrl->ctrl.admin_tagset);
--- a/drivers/nvme/host/tcp.c
+++ b/drivers/nvme/host/tcp.c
@@ -1653,7 +1653,9 @@ static void nvme_tcp_destroy_admin_queue
 	if (remove) {
 		free_opal_dev(ctrl->opal_dev);
 		blk_cleanup_queue(ctrl->admin_q);
+#ifndef __GENKSYMS__
 		blk_cleanup_queue(ctrl->fabrics_q);
+#endif
 		blk_mq_free_tag_set(ctrl->admin_tagset);
 	}
 	nvme_tcp_free_admin_queue(ctrl);
@@ -1674,11 +1676,13 @@ static int nvme_tcp_configure_admin_queu
 			goto out_free_queue;
 		}
 
+#ifndef __GENKSYMS__
 		ctrl->fabrics_q = blk_mq_init_queue(ctrl->admin_tagset);
 		if (IS_ERR(ctrl->fabrics_q)) {
 			error = PTR_ERR(ctrl->fabrics_q);
 			goto out_free_tagset;
 		}
+#endif
 
 		ctrl->admin_q = blk_mq_init_queue(ctrl->admin_tagset);
 		if (IS_ERR(ctrl->admin_q)) {
@@ -1718,8 +1722,10 @@ out_cleanup_queue:
 	if (new)
 		blk_cleanup_queue(ctrl->admin_q);
 out_cleanup_fabrics_q:
+#ifndef __GENKSYMS__
 	if (new)
 		blk_cleanup_queue(ctrl->fabrics_q);
+#endif
 out_free_tagset:
 	if (new)
 		blk_mq_free_tag_set(ctrl->admin_tagset);
--- a/drivers/nvme/target/loop.c
+++ b/drivers/nvme/target/loop.c
@@ -277,7 +277,9 @@ static void nvme_loop_destroy_admin_queu
 	clear_bit(NVME_LOOP_Q_LIVE, &ctrl->queues[0].flags);
 	nvmet_sq_destroy(&ctrl->queues[0].nvme_sq);
 	blk_cleanup_queue(ctrl->ctrl.admin_q);
+#ifndef __GENKSYMS__
 	blk_cleanup_queue(ctrl->ctrl.fabrics_q);
+#endif
 	blk_mq_free_tag_set(&ctrl->admin_tag_set);
 }
 
@@ -382,11 +384,13 @@ static int nvme_loop_configure_admin_que
 		goto out_free_sq;
 	ctrl->ctrl.admin_tagset = &ctrl->admin_tag_set;
 
+#ifndef __GENKSYMS__
 	ctrl->ctrl.fabrics_q = blk_mq_init_queue(&ctrl->admin_tag_set);
 	if (IS_ERR(ctrl->ctrl.fabrics_q)) {
 		error = PTR_ERR(ctrl->ctrl.fabrics_q);
 		goto out_free_tagset;
 	}
+#endif
 
 	ctrl->ctrl.admin_q = blk_mq_init_queue(&ctrl->admin_tag_set);
 	if (IS_ERR(ctrl->ctrl.admin_q)) {
@@ -428,7 +432,9 @@ static int nvme_loop_configure_admin_que
 out_cleanup_queue:
 	blk_cleanup_queue(ctrl->ctrl.admin_q);
 out_cleanup_fabrics_q:
+#ifndef __GENKSYMS__
 	blk_cleanup_queue(ctrl->ctrl.fabrics_q);
+#endif
 out_free_tagset:
 	blk_mq_free_tag_set(&ctrl->admin_tag_set);
 out_free_sq: