From: Logan Gunthorpe <logang@deltatee.com>
To: linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org,
linux-block@vger.kernel.org, linux-fsdevel@vger.kernel.org
Cc: Christoph Hellwig <hch@lst.de>, Sagi Grimberg <sagi@grimberg.me>,
Keith Busch <kbusch@kernel.org>, Jens Axboe <axboe@fb.com>,
Chaitanya Kulkarni <Chaitanya.Kulkarni@wdc.com>,
Max Gurtovoy <maxg@mellanox.com>,
Stephen Bates <sbates@raithlin.com>,
Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>,
Logan Gunthorpe <logang@deltatee.com>
Subject: [PATCH v6 11/16] nvmet-core: allow one host per passthru-ctrl
Date: Thu, 25 Jul 2019 11:23:30 -0600 [thread overview]
Message-ID: <20190725172335.6825-12-logang@deltatee.com> (raw)
In-Reply-To: <20190725172335.6825-1-logang@deltatee.com>
From: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
This patch rejects any new connection to the passthru-ctrl if this
controller is already connected to host. At the time of allocating the
controller we check if the subsys associated with the passthru ctrl is
already connected to the host.
Signed-off-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
[logang@deltatee.com:
* drop the overide of the target cntlid with the passthru cntlid;
this seemed like a really bad idea especially in the presence of
mixed systems as you could end up with two ctrlrs with the same
cntlid
* push the check to ensure only one ctrlr per subsys into
functions in passthru-cmd.c to avoid excess inline #ifdefs
]
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
---
drivers/nvme/target/core.c | 6 +++++
drivers/nvme/target/io-cmd-passthru.c | 32 +++++++++++++++++++++++++++
drivers/nvme/target/nvmet.h | 10 +++++++++
3 files changed, 48 insertions(+)
diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c
index 2e75968af7f4..9e92486e2ee9 100644
--- a/drivers/nvme/target/core.c
+++ b/drivers/nvme/target/core.c
@@ -13,6 +13,7 @@
#define CREATE_TRACE_POINTS
#include "trace.h"
+#include "../host/nvme.h"
#include "nvmet.h"
struct workqueue_struct *buffered_io_wq;
@@ -1278,6 +1279,10 @@ u16 nvmet_alloc_ctrl(const char *subsysnqn, const char *hostnqn,
if (!ctrl->sqs)
goto out_free_cqs;
+ ret = nvmet_passthru_alloc_ctrl(subsys);
+ if (ret)
+ goto out_free_sqs;
+
ret = ida_simple_get(&cntlid_ida,
NVME_CNTLID_MIN, NVME_CNTLID_MAX,
GFP_KERNEL);
@@ -1341,6 +1346,7 @@ static void nvmet_ctrl_free(struct kref *ref)
flush_work(&ctrl->async_event_work);
cancel_work_sync(&ctrl->fatal_err_work);
+ nvmet_passthru_ctrl_free(subsys);
ida_simple_remove(&cntlid_ida, ctrl->cntlid);
kfree(ctrl->sqs);
diff --git a/drivers/nvme/target/io-cmd-passthru.c b/drivers/nvme/target/io-cmd-passthru.c
index 9ddcdb8415fc..aefdd534cb4a 100644
--- a/drivers/nvme/target/io-cmd-passthru.c
+++ b/drivers/nvme/target/io-cmd-passthru.c
@@ -104,6 +104,38 @@ void nvmet_passthru_subsys_free(struct nvmet_subsys *subsys)
mutex_unlock(&subsys->lock);
}
+int nvmet_passthru_alloc_ctrl(struct nvmet_subsys *subsys)
+{
+ /*
+ * Check here if this subsystem is already connected to the passthru
+ * ctrl. We allow only one target ctrl for one passthru subsystem.
+ */
+
+ mutex_lock(&subsys->lock);
+
+ if (!subsys->passthru_ctrl)
+ goto out;
+
+ if (subsys->passthru_connected) {
+ mutex_unlock(&subsys->lock);
+ return -ENODEV;
+ }
+
+ subsys->passthru_connected = true;
+
+out:
+ mutex_unlock(&subsys->lock);
+
+ return 0;
+}
+
+void nvmet_passthru_ctrl_free(struct nvmet_subsys *subsys)
+{
+ mutex_lock(&subsys->lock);
+ subsys->passthru_connected = false;
+ mutex_unlock(&subsys->lock);
+}
+
static void nvmet_passthru_req_complete(struct nvmet_req *req,
struct request *rq, u16 status)
{
diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h
index aff4db03269d..004949b6b666 100644
--- a/drivers/nvme/target/nvmet.h
+++ b/drivers/nvme/target/nvmet.h
@@ -231,6 +231,7 @@ struct nvmet_subsys {
#ifdef CONFIG_NVME_TARGET_PASSTHRU
struct nvme_ctrl *passthru_ctrl;
char *passthru_ctrl_path;
+ bool passthru_connected;
#endif /* CONFIG_NVME_TARGET_PASSTHRU */
};
@@ -513,6 +514,8 @@ void nvmet_passthru_destroy(void);
void nvmet_passthru_subsys_free(struct nvmet_subsys *subsys);
int nvmet_passthru_ctrl_enable(struct nvmet_subsys *subsys);
void nvmet_passthru_ctrl_disable(struct nvmet_subsys *subsys);
+int nvmet_passthru_alloc_ctrl(struct nvmet_subsys *subsys);
+void nvmet_passthru_ctrl_free(struct nvmet_subsys *subsys);
u16 nvmet_parse_passthru_cmd(struct nvmet_req *req);
static inline
@@ -536,6 +539,13 @@ static inline void nvmet_passthru_subsys_free(struct nvmet_subsys *subsys)
static inline void nvmet_passthru_ctrl_disable(struct nvmet_subsys *subsys)
{
}
+static inline int nvmet_passthru_alloc_ctrl(struct nvmet_subsys *subsys)
+{
+ return 0;
+}
+static inline void nvmet_passthru_ctrl_free(struct nvmet_subsys *subsys)
+{
+}
static inline u16 nvmet_parse_passthru_cmd(struct nvmet_req *req)
{
return 0;
--
2.20.1
next prev parent reply other threads:[~2019-07-25 17:23 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-25 17:23 [PATCH v6 00/16] nvmet: add target passthru commands support Logan Gunthorpe
2019-07-25 17:23 ` [PATCH v6 01/16] chardev: factor out cdev_lookup() helper Logan Gunthorpe
2019-07-25 17:23 ` [PATCH v6 02/16] chardev: introduce cdev_get_by_path() Logan Gunthorpe
2019-07-25 17:40 ` Greg Kroah-Hartman
2019-07-25 17:53 ` Logan Gunthorpe
2019-07-25 17:58 ` Matthew Wilcox
2019-07-25 18:08 ` Logan Gunthorpe
2019-07-25 18:08 ` Greg Kroah-Hartman
2019-07-25 18:14 ` Logan Gunthorpe
2019-07-25 18:27 ` Greg Kroah-Hartman
2019-07-25 18:36 ` Logan Gunthorpe
2019-07-25 19:02 ` Sagi Grimberg
2019-07-25 19:34 ` Greg Kroah-Hartman
2019-07-25 19:37 ` Sagi Grimberg
2019-07-25 19:43 ` Greg Kroah-Hartman
2019-07-25 19:45 ` Sagi Grimberg
2019-07-25 19:43 ` Sagi Grimberg
2019-07-25 19:41 ` Logan Gunthorpe
2019-07-25 19:00 ` Matthew Wilcox
2019-07-25 19:05 ` Sagi Grimberg
2019-07-25 19:11 ` Matthew Wilcox
2019-07-25 19:24 ` Logan Gunthorpe
2019-07-25 19:26 ` Matthew Wilcox
2019-07-25 19:31 ` Logan Gunthorpe
2019-07-25 23:55 ` Al Viro
2019-07-26 4:29 ` Sagi Grimberg
2019-07-26 7:13 ` Greg Kroah-Hartman
2019-07-26 15:46 ` Logan Gunthorpe
2019-07-25 19:31 ` Sagi Grimberg
2019-07-25 18:10 ` Greg Kroah-Hartman
2019-07-25 18:16 ` Logan Gunthorpe
2019-07-25 17:23 ` [PATCH v6 03/16] chardev: export cdev_put() Logan Gunthorpe
2019-07-25 17:23 ` [PATCH v6 04/16] nvme-core: introduce nvme_get_by_path() Logan Gunthorpe
2019-07-25 17:50 ` Matthew Wilcox
2019-07-25 17:54 ` Logan Gunthorpe
2019-07-25 19:58 ` Keith Busch
2019-07-25 20:12 ` Sagi Grimberg
2019-07-25 20:28 ` Logan Gunthorpe
2019-07-25 20:31 ` Keith Busch
2019-07-25 20:37 ` Logan Gunthorpe
2019-07-25 17:23 ` [PATCH v6 05/16] nvme-core: export existing ctrl and ns interfaces Logan Gunthorpe
2019-07-25 17:23 ` [PATCH v6 06/16] nvmet: add return value to nvmet_add_async_event() Logan Gunthorpe
2019-07-25 17:23 ` [PATCH v6 07/16] nvmet: make nvmet_copy_ns_identifier() non-static Logan Gunthorpe
2019-07-25 17:23 ` [PATCH v6 08/16] nvmet-passthru: update KConfig with config passthru option Logan Gunthorpe
2019-07-25 17:23 ` [PATCH v6 09/16] nvmet-passthru: add passthru code to process commands Logan Gunthorpe
2019-07-25 17:23 ` [PATCH v6 10/16] nvmet-passthru: add enable/disable helpers Logan Gunthorpe
2019-07-25 17:23 ` Logan Gunthorpe [this message]
2019-07-25 17:23 ` [PATCH v6 12/16] nvmet-core: don't check the data len for pt-ctrl Logan Gunthorpe
2019-07-25 17:23 ` [PATCH v6 13/16] nvmet-configfs: introduce passthru configfs interface Logan Gunthorpe
2019-07-25 17:23 ` [PATCH v6 14/16] block: don't check blk_rq_is_passthrough() in blk_do_io_stat() Logan Gunthorpe
2019-07-25 17:23 ` [PATCH v6 15/16] block: call blk_account_io_start() in blk_execute_rq_nowait() Logan Gunthorpe
2019-07-25 17:23 ` [PATCH v6 16/16] nvmet-passthru: support block accounting Logan Gunthorpe
2019-07-26 6:23 ` [PATCH v6 00/16] nvmet: add target passthru commands support Hannes Reinecke
2019-07-26 17:07 ` Logan Gunthorpe
2019-07-26 22:21 ` Sagi Grimberg
2019-07-26 22:37 ` Logan Gunthorpe
2019-07-26 23:13 ` Sagi Grimberg
2019-07-27 0:09 ` Logan Gunthorpe
2019-07-27 0:50 ` Stephen Bates
2019-07-29 16:15 ` Sagi Grimberg
2019-07-29 16:17 ` Logan Gunthorpe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190725172335.6825-12-logang@deltatee.com \
--to=logang@deltatee.com \
--cc=Chaitanya.Kulkarni@wdc.com \
--cc=axboe@fb.com \
--cc=hch@lst.de \
--cc=kbusch@kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=maxg@mellanox.com \
--cc=sagi@grimberg.me \
--cc=sbates@raithlin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).