* [PATCH 1/4] nvme: fix srcu locking on error return in nvme_get_ns_from_disk
@ 2019-05-16 18:50 Christoph Hellwig
2019-05-16 18:50 ` [PATCH 2/4] nvme: remove the ifdef around nvme_nvm_ioctl Christoph Hellwig
` (4 more replies)
0 siblings, 5 replies; 14+ messages in thread
From: Christoph Hellwig @ 2019-05-16 18:50 UTC (permalink / raw)
If we can't get a namespace don't leak the SRCU lock. nvme_ioctl was
working around this, but nvme_pr_command wasn't handling this properly.
Just do what callers would usually expect.
Signed-off-by: Christoph Hellwig <hch at lst.de>
---
drivers/nvme/host/core.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index d7de0642c832..eb1c2c349014 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -1361,9 +1361,14 @@ static struct nvme_ns *nvme_get_ns_from_disk(struct gendisk *disk,
{
#ifdef CONFIG_NVME_MULTIPATH
if (disk->fops == &nvme_ns_head_ops) {
+ struct nvme_ns *ns;
+
*head = disk->private_data;
*srcu_idx = srcu_read_lock(&(*head)->srcu);
- return nvme_find_path(*head);
+ ns = nvme_find_path(*head);
+ if (!ns)
+ srcu_read_unlock(&(*head)->srcu, *srcu_idx);
+ return ns;
}
#endif
*head = NULL;
@@ -1410,9 +1415,9 @@ static int nvme_ioctl(struct block_device *bdev, fmode_t mode,
ns = nvme_get_ns_from_disk(bdev->bd_disk, &head, &srcu_idx);
if (unlikely(!ns))
- ret = -EWOULDBLOCK;
- else
- ret = nvme_ns_ioctl(ns, cmd, arg);
+ return -EWOULDBLOCK;
+
+ ret = nvme_ns_ioctl(ns, cmd, arg);
nvme_put_ns_from_disk(head, srcu_idx);
return ret;
}
--
2.20.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 2/4] nvme: remove the ifdef around nvme_nvm_ioctl
2019-05-16 18:50 [PATCH 1/4] nvme: fix srcu locking on error return in nvme_get_ns_from_disk Christoph Hellwig
@ 2019-05-16 18:50 ` Christoph Hellwig
2019-05-16 19:01 ` Keith Busch
2019-05-16 22:33 ` Chaitanya Kulkarni
2019-05-16 18:50 ` [PATCH 3/4] nvme: merge nvme_ns_ioctl into nvme_ioctl Christoph Hellwig
` (3 subsequent siblings)
4 siblings, 2 replies; 14+ messages in thread
From: Christoph Hellwig @ 2019-05-16 18:50 UTC (permalink / raw)
We already have a proper stub if lightnvm is not enabled, so don't bother
with the ifdef.
Signed-off-by: Christoph Hellwig <hch at lst.de>
---
drivers/nvme/host/core.c | 2 --
1 file changed, 2 deletions(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index eb1c2c349014..7f72d57efc27 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -1395,10 +1395,8 @@ static int nvme_ns_ioctl(struct nvme_ns *ns, unsigned cmd, unsigned long arg)
case NVME_IOCTL_SUBMIT_IO:
return nvme_submit_io(ns, (void __user *)arg);
default:
-#ifdef CONFIG_NVM
if (ns->ndev)
return nvme_nvm_ioctl(ns, cmd, arg);
-#endif
if (is_sed_ioctl(cmd))
return sed_ioctl(ns->ctrl->opal_dev, cmd,
(void __user *) arg);
--
2.20.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 3/4] nvme: merge nvme_ns_ioctl into nvme_ioctl
2019-05-16 18:50 [PATCH 1/4] nvme: fix srcu locking on error return in nvme_get_ns_from_disk Christoph Hellwig
2019-05-16 18:50 ` [PATCH 2/4] nvme: remove the ifdef around nvme_nvm_ioctl Christoph Hellwig
@ 2019-05-16 18:50 ` Christoph Hellwig
2019-05-16 19:02 ` Keith Busch
2019-05-16 22:40 ` Chaitanya Kulkarni
2019-05-16 18:50 ` [PATCH 4/4] nvme: release namespace SRCU protection before performing controller ioctls Christoph Hellwig
` (2 subsequent siblings)
4 siblings, 2 replies; 14+ messages in thread
From: Christoph Hellwig @ 2019-05-16 18:50 UTC (permalink / raw)
Merge the two functions to make future changes a little easier.
Signed-off-by: Christoph Hellwig <hch at lst.de>
---
drivers/nvme/host/core.c | 47 ++++++++++++++++++++--------------------
1 file changed, 24 insertions(+), 23 deletions(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 7f72d57efc27..27f4e0c4be69 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -1382,32 +1382,11 @@ static void nvme_put_ns_from_disk(struct nvme_ns_head *head, int idx)
srcu_read_unlock(&head->srcu, idx);
}
-static int nvme_ns_ioctl(struct nvme_ns *ns, unsigned cmd, unsigned long arg)
-{
- switch (cmd) {
- case NVME_IOCTL_ID:
- force_successful_syscall_return();
- return ns->head->ns_id;
- case NVME_IOCTL_ADMIN_CMD:
- return nvme_user_cmd(ns->ctrl, NULL, (void __user *)arg);
- case NVME_IOCTL_IO_CMD:
- return nvme_user_cmd(ns->ctrl, ns, (void __user *)arg);
- case NVME_IOCTL_SUBMIT_IO:
- return nvme_submit_io(ns, (void __user *)arg);
- default:
- if (ns->ndev)
- return nvme_nvm_ioctl(ns, cmd, arg);
- if (is_sed_ioctl(cmd))
- return sed_ioctl(ns->ctrl->opal_dev, cmd,
- (void __user *) arg);
- return -ENOTTY;
- }
-}
-
static int nvme_ioctl(struct block_device *bdev, fmode_t mode,
unsigned int cmd, unsigned long arg)
{
struct nvme_ns_head *head = NULL;
+ void __user *argp = (void __user *)arg;
struct nvme_ns *ns;
int srcu_idx, ret;
@@ -1415,7 +1394,29 @@ static int nvme_ioctl(struct block_device *bdev, fmode_t mode,
if (unlikely(!ns))
return -EWOULDBLOCK;
- ret = nvme_ns_ioctl(ns, cmd, arg);
+ switch (cmd) {
+ case NVME_IOCTL_ID:
+ force_successful_syscall_return();
+ ret = ns->head->ns_id;
+ break;
+ case NVME_IOCTL_ADMIN_CMD:
+ ret = nvme_user_cmd(ns->ctrl, NULL, argp);
+ break;
+ case NVME_IOCTL_IO_CMD:
+ ret = nvme_user_cmd(ns->ctrl, ns, argp);
+ break;
+ case NVME_IOCTL_SUBMIT_IO:
+ ret = nvme_submit_io(ns, argp);
+ break;
+ default:
+ if (ns->ndev)
+ ret = nvme_nvm_ioctl(ns, cmd, arg);
+ else if (is_sed_ioctl(cmd))
+ ret = sed_ioctl(ns->ctrl->opal_dev, cmd, argp);
+ else
+ ret = -ENOTTY;
+ }
+
nvme_put_ns_from_disk(head, srcu_idx);
return ret;
}
--
2.20.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 4/4] nvme: release namespace SRCU protection before performing controller ioctls
2019-05-16 18:50 [PATCH 1/4] nvme: fix srcu locking on error return in nvme_get_ns_from_disk Christoph Hellwig
2019-05-16 18:50 ` [PATCH 2/4] nvme: remove the ifdef around nvme_nvm_ioctl Christoph Hellwig
2019-05-16 18:50 ` [PATCH 3/4] nvme: merge nvme_ns_ioctl into nvme_ioctl Christoph Hellwig
@ 2019-05-16 18:50 ` Christoph Hellwig
2019-05-16 19:05 ` Keith Busch
2019-05-16 22:57 ` Chaitanya Kulkarni
2019-05-16 19:01 ` [PATCH 1/4] nvme: fix srcu locking on error return in nvme_get_ns_from_disk Keith Busch
2019-05-16 22:33 ` Chaitanya Kulkarni
4 siblings, 2 replies; 14+ messages in thread
From: Christoph Hellwig @ 2019-05-16 18:50 UTC (permalink / raw)
Holding the SRCU critical section protecting the namespace list can
cause deadlocks when using the per-namespace admin passthrough ioctl to
delete as namespace. Release it earlier when performing per-controller
ioctls to avoid that.
Reported-by: Kenneth Heitke <kenneth.heitke at intel.com>
Signed-off-by: Christoph Hellwig <hch at lst.de>
---
drivers/nvme/host/core.c | 25 ++++++++++++++++++++-----
1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 27f4e0c4be69..a3102aabd525 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -1394,14 +1394,31 @@ static int nvme_ioctl(struct block_device *bdev, fmode_t mode,
if (unlikely(!ns))
return -EWOULDBLOCK;
+ /*
+ * Handle ioctls that apply to the controller instead of the namespace
+ * seperately and drop the ns SRCU reference early. This avoids a
+ * deadlock when deleting namespaces using the passthrough interface.
+ */
+ if (cmd == NVME_IOCTL_ADMIN_CMD || is_sed_ioctl(cmd)) {
+ struct nvme_ctrl *ctrl = ns->ctrl;
+
+ nvme_get_ctrl(ns->ctrl);
+ nvme_put_ns_from_disk(head, srcu_idx);
+
+ if (cmd == NVME_IOCTL_ADMIN_CMD)
+ ret = nvme_user_cmd(ctrl, NULL, argp);
+ else
+ ret = sed_ioctl(ctrl->opal_dev, cmd, argp);
+
+ nvme_get_ctrl(ctrl);
+ return ret;
+ }
+
switch (cmd) {
case NVME_IOCTL_ID:
force_successful_syscall_return();
ret = ns->head->ns_id;
break;
- case NVME_IOCTL_ADMIN_CMD:
- ret = nvme_user_cmd(ns->ctrl, NULL, argp);
- break;
case NVME_IOCTL_IO_CMD:
ret = nvme_user_cmd(ns->ctrl, ns, argp);
break;
@@ -1411,8 +1428,6 @@ static int nvme_ioctl(struct block_device *bdev, fmode_t mode,
default:
if (ns->ndev)
ret = nvme_nvm_ioctl(ns, cmd, arg);
- else if (is_sed_ioctl(cmd))
- ret = sed_ioctl(ns->ctrl->opal_dev, cmd, argp);
else
ret = -ENOTTY;
}
--
2.20.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 1/4] nvme: fix srcu locking on error return in nvme_get_ns_from_disk
2019-05-16 18:50 [PATCH 1/4] nvme: fix srcu locking on error return in nvme_get_ns_from_disk Christoph Hellwig
` (2 preceding siblings ...)
2019-05-16 18:50 ` [PATCH 4/4] nvme: release namespace SRCU protection before performing controller ioctls Christoph Hellwig
@ 2019-05-16 19:01 ` Keith Busch
2019-05-16 22:33 ` Chaitanya Kulkarni
4 siblings, 0 replies; 14+ messages in thread
From: Keith Busch @ 2019-05-16 19:01 UTC (permalink / raw)
On Thu, May 16, 2019@08:50:33PM +0200, Christoph Hellwig wrote:
> If we can't get a namespace don't leak the SRCU lock. nvme_ioctl was
> working around this, but nvme_pr_command wasn't handling this properly.
> Just do what callers would usually expect.
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
Looks good.
Reviewed-by: Keith Busch <keith.busch at intel.com>
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 2/4] nvme: remove the ifdef around nvme_nvm_ioctl
2019-05-16 18:50 ` [PATCH 2/4] nvme: remove the ifdef around nvme_nvm_ioctl Christoph Hellwig
@ 2019-05-16 19:01 ` Keith Busch
2019-05-16 22:33 ` Chaitanya Kulkarni
1 sibling, 0 replies; 14+ messages in thread
From: Keith Busch @ 2019-05-16 19:01 UTC (permalink / raw)
On Thu, May 16, 2019@08:50:34PM +0200, Christoph Hellwig wrote:
> We already have a proper stub if lightnvm is not enabled, so don't bother
> with the ifdef.
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
Looks good.
Reviewed-by: Keith Busch <keith.busch at intel.com>
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 3/4] nvme: merge nvme_ns_ioctl into nvme_ioctl
2019-05-16 18:50 ` [PATCH 3/4] nvme: merge nvme_ns_ioctl into nvme_ioctl Christoph Hellwig
@ 2019-05-16 19:02 ` Keith Busch
2019-05-16 22:40 ` Chaitanya Kulkarni
1 sibling, 0 replies; 14+ messages in thread
From: Keith Busch @ 2019-05-16 19:02 UTC (permalink / raw)
On Thu, May 16, 2019@08:50:35PM +0200, Christoph Hellwig wrote:
> Merge the two functions to make future changes a little easier.
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
Looks good.
Reviewed-by: Keith Busch <keith.busch at intel.com>
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 4/4] nvme: release namespace SRCU protection before performing controller ioctls
2019-05-16 18:50 ` [PATCH 4/4] nvme: release namespace SRCU protection before performing controller ioctls Christoph Hellwig
@ 2019-05-16 19:05 ` Keith Busch
2019-05-16 22:57 ` Chaitanya Kulkarni
1 sibling, 0 replies; 14+ messages in thread
From: Keith Busch @ 2019-05-16 19:05 UTC (permalink / raw)
On Thu, May 16, 2019@08:50:36PM +0200, Christoph Hellwig wrote:
> + if (cmd == NVME_IOCTL_ADMIN_CMD)
> + ret = nvme_user_cmd(ctrl, NULL, argp);
> + else
> + ret = sed_ioctl(ctrl->opal_dev, cmd, argp);
> +
> + nvme_get_ctrl(ctrl);
nvme_put_ctrl(ctrl);
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/4] nvme: fix srcu locking on error return in nvme_get_ns_from_disk
2019-05-16 18:50 [PATCH 1/4] nvme: fix srcu locking on error return in nvme_get_ns_from_disk Christoph Hellwig
` (3 preceding siblings ...)
2019-05-16 19:01 ` [PATCH 1/4] nvme: fix srcu locking on error return in nvme_get_ns_from_disk Keith Busch
@ 2019-05-16 22:33 ` Chaitanya Kulkarni
4 siblings, 0 replies; 14+ messages in thread
From: Chaitanya Kulkarni @ 2019-05-16 22:33 UTC (permalink / raw)
Looks good.
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni at wdc.com>
On 5/16/19 11:51 AM, Christoph Hellwig wrote:
> If we can't get a namespace don't leak the SRCU lock. nvme_ioctl was
> working around this, but nvme_pr_command wasn't handling this properly.
> Just do what callers would usually expect.
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
> ---
> drivers/nvme/host/core.c | 13 +++++++++----
> 1 file changed, 9 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index d7de0642c832..eb1c2c349014 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -1361,9 +1361,14 @@ static struct nvme_ns *nvme_get_ns_from_disk(struct gendisk *disk,
> {
> #ifdef CONFIG_NVME_MULTIPATH
> if (disk->fops == &nvme_ns_head_ops) {
> + struct nvme_ns *ns;
> +
> *head = disk->private_data;
> *srcu_idx = srcu_read_lock(&(*head)->srcu);
> - return nvme_find_path(*head);
> + ns = nvme_find_path(*head);
> + if (!ns)
> + srcu_read_unlock(&(*head)->srcu, *srcu_idx);
> + return ns;
> }
> #endif
> *head = NULL;
> @@ -1410,9 +1415,9 @@ static int nvme_ioctl(struct block_device *bdev, fmode_t mode,
>
> ns = nvme_get_ns_from_disk(bdev->bd_disk, &head, &srcu_idx);
> if (unlikely(!ns))
> - ret = -EWOULDBLOCK;
> - else
> - ret = nvme_ns_ioctl(ns, cmd, arg);
> + return -EWOULDBLOCK;
> +
> + ret = nvme_ns_ioctl(ns, cmd, arg);
> nvme_put_ns_from_disk(head, srcu_idx);
> return ret;
> }
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 2/4] nvme: remove the ifdef around nvme_nvm_ioctl
2019-05-16 18:50 ` [PATCH 2/4] nvme: remove the ifdef around nvme_nvm_ioctl Christoph Hellwig
2019-05-16 19:01 ` Keith Busch
@ 2019-05-16 22:33 ` Chaitanya Kulkarni
1 sibling, 0 replies; 14+ messages in thread
From: Chaitanya Kulkarni @ 2019-05-16 22:33 UTC (permalink / raw)
Looks good.
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni at wdc.com>
On 5/16/19 11:51 AM, Christoph Hellwig wrote:
> We already have a proper stub if lightnvm is not enabled, so don't bother
> with the ifdef.
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
> ---
> drivers/nvme/host/core.c | 2 --
> 1 file changed, 2 deletions(-)
>
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index eb1c2c349014..7f72d57efc27 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -1395,10 +1395,8 @@ static int nvme_ns_ioctl(struct nvme_ns *ns, unsigned cmd, unsigned long arg)
> case NVME_IOCTL_SUBMIT_IO:
> return nvme_submit_io(ns, (void __user *)arg);
> default:
> -#ifdef CONFIG_NVM
> if (ns->ndev)
> return nvme_nvm_ioctl(ns, cmd, arg);
> -#endif
> if (is_sed_ioctl(cmd))
> return sed_ioctl(ns->ctrl->opal_dev, cmd,
> (void __user *) arg);
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 3/4] nvme: merge nvme_ns_ioctl into nvme_ioctl
2019-05-16 18:50 ` [PATCH 3/4] nvme: merge nvme_ns_ioctl into nvme_ioctl Christoph Hellwig
2019-05-16 19:02 ` Keith Busch
@ 2019-05-16 22:40 ` Chaitanya Kulkarni
1 sibling, 0 replies; 14+ messages in thread
From: Chaitanya Kulkarni @ 2019-05-16 22:40 UTC (permalink / raw)
Thanks for simplifying this, looks good.
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni at wdc.com>
On 5/16/19 11:51 AM, Christoph Hellwig wrote:
> Merge the two functions to make future changes a little easier.
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
> ---
> drivers/nvme/host/core.c | 47 ++++++++++++++++++++--------------------
> 1 file changed, 24 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index 7f72d57efc27..27f4e0c4be69 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -1382,32 +1382,11 @@ static void nvme_put_ns_from_disk(struct nvme_ns_head *head, int idx)
> srcu_read_unlock(&head->srcu, idx);
> }
>
> -static int nvme_ns_ioctl(struct nvme_ns *ns, unsigned cmd, unsigned long arg)
> -{
> - switch (cmd) {
> - case NVME_IOCTL_ID:
> - force_successful_syscall_return();
> - return ns->head->ns_id;
> - case NVME_IOCTL_ADMIN_CMD:
> - return nvme_user_cmd(ns->ctrl, NULL, (void __user *)arg);
> - case NVME_IOCTL_IO_CMD:
> - return nvme_user_cmd(ns->ctrl, ns, (void __user *)arg);
> - case NVME_IOCTL_SUBMIT_IO:
> - return nvme_submit_io(ns, (void __user *)arg);
> - default:
> - if (ns->ndev)
> - return nvme_nvm_ioctl(ns, cmd, arg);
> - if (is_sed_ioctl(cmd))
> - return sed_ioctl(ns->ctrl->opal_dev, cmd,
> - (void __user *) arg);
> - return -ENOTTY;
> - }
> -}
> -
> static int nvme_ioctl(struct block_device *bdev, fmode_t mode,
> unsigned int cmd, unsigned long arg)
> {
> struct nvme_ns_head *head = NULL;
> + void __user *argp = (void __user *)arg;
> struct nvme_ns *ns;
> int srcu_idx, ret;
>
> @@ -1415,7 +1394,29 @@ static int nvme_ioctl(struct block_device *bdev, fmode_t mode,
> if (unlikely(!ns))
> return -EWOULDBLOCK;
>
> - ret = nvme_ns_ioctl(ns, cmd, arg);
> + switch (cmd) {
> + case NVME_IOCTL_ID:
> + force_successful_syscall_return();
> + ret = ns->head->ns_id;
> + break;
> + case NVME_IOCTL_ADMIN_CMD:
> + ret = nvme_user_cmd(ns->ctrl, NULL, argp);
> + break;
> + case NVME_IOCTL_IO_CMD:
> + ret = nvme_user_cmd(ns->ctrl, ns, argp);
> + break;
> + case NVME_IOCTL_SUBMIT_IO:
> + ret = nvme_submit_io(ns, argp);
> + break;
> + default:
> + if (ns->ndev)
> + ret = nvme_nvm_ioctl(ns, cmd, arg);
> + else if (is_sed_ioctl(cmd))
> + ret = sed_ioctl(ns->ctrl->opal_dev, cmd, argp);
> + else
> + ret = -ENOTTY;
> + }
> +
> nvme_put_ns_from_disk(head, srcu_idx);
> return ret;
> }
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 4/4] nvme: release namespace SRCU protection before performing controller ioctls
2019-05-16 18:50 ` [PATCH 4/4] nvme: release namespace SRCU protection before performing controller ioctls Christoph Hellwig
2019-05-16 19:05 ` Keith Busch
@ 2019-05-16 22:57 ` Chaitanya Kulkarni
1 sibling, 0 replies; 14+ messages in thread
From: Chaitanya Kulkarni @ 2019-05-16 22:57 UTC (permalink / raw)
Looks good, with couple of small nits.
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni at wdc.com>
On 5/16/19 11:51 AM, Christoph Hellwig wrote:
> Holding the SRCU critical section protecting the namespace list can
> cause deadlocks when using the per-namespace admin passthrough ioctl to
> delete as namespace. Release it earlier when performing per-controller
> ioctls to avoid that.
>
> Reported-by: Kenneth Heitke <kenneth.heitke at intel.com>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
> ---
> drivers/nvme/host/core.c | 25 ++++++++++++++++++++-----
> 1 file changed, 20 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index 27f4e0c4be69..a3102aabd525 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -1394,14 +1394,31 @@ static int nvme_ioctl(struct block_device *bdev, fmode_t mode,
> if (unlikely(!ns))
> return -EWOULDBLOCK;
>
> + /*
> + * Handle ioctls that apply to the controller instead of the namespace
> + * seperately and drop the ns SRCU reference early. This avoids a
> + * deadlock when deleting namespaces using the passthrough interface.
> + */
> + if (cmd == NVME_IOCTL_ADMIN_CMD || is_sed_ioctl(cmd)) {
> + struct nvme_ctrl *ctrl = ns->ctrl;
> +
> + nvme_get_ctrl(ns->ctrl);
nit:- just use ctrl instead of ns->ctrl in the above call since we are
already initializing it.
> + nvme_put_ns_from_disk(head, srcu_idx);
> +
> + if (cmd == NVME_IOCTL_ADMIN_CMD)
> + ret = nvme_user_cmd(ctrl, NULL, argp);
> + else
> + ret = sed_ioctl(ctrl->opal_dev, cmd, argp);
> +
> + nvme_get_ctrl(ctrl);
As Keith pointed out nvme_put_ctrl().
> + return ret;
> + }
> +
> switch (cmd) {
> case NVME_IOCTL_ID:
> force_successful_syscall_return();
> ret = ns->head->ns_id;
> break;
> - case NVME_IOCTL_ADMIN_CMD:
> - ret = nvme_user_cmd(ns->ctrl, NULL, argp);
> - break;
> case NVME_IOCTL_IO_CMD:
> ret = nvme_user_cmd(ns->ctrl, ns, argp);
> break;
> @@ -1411,8 +1428,6 @@ static int nvme_ioctl(struct block_device *bdev, fmode_t mode,
> default:
> if (ns->ndev)
> ret = nvme_nvm_ioctl(ns, cmd, arg);
> - else if (is_sed_ioctl(cmd))
> - ret = sed_ioctl(ns->ctrl->opal_dev, cmd, argp);
> else
> ret = -ENOTTY;
> }
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/4] nvme: fix srcu locking on error return in nvme_get_ns_from_disk
@ 2019-05-17 9:47 Christoph Hellwig
2019-05-17 18:36 ` Keith Busch
0 siblings, 1 reply; 14+ messages in thread
From: Christoph Hellwig @ 2019-05-17 9:47 UTC (permalink / raw)
If we can't get a namespace don't leak the SRCU lock. nvme_ioctl was
working around this, but nvme_pr_command wasn't handling this properly.
Just do what callers would usually expect.
Signed-off-by: Christoph Hellwig <hch at lst.de>
Reviewed-by: Keith Busch <keith.busch at intel.com>
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni at wdc.com>
---
drivers/nvme/host/core.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 7da80f375315..63146060df66 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -1361,9 +1361,14 @@ static struct nvme_ns *nvme_get_ns_from_disk(struct gendisk *disk,
{
#ifdef CONFIG_NVME_MULTIPATH
if (disk->fops == &nvme_ns_head_ops) {
+ struct nvme_ns *ns;
+
*head = disk->private_data;
*srcu_idx = srcu_read_lock(&(*head)->srcu);
- return nvme_find_path(*head);
+ ns = nvme_find_path(*head);
+ if (!ns)
+ srcu_read_unlock(&(*head)->srcu, *srcu_idx);
+ return ns;
}
#endif
*head = NULL;
@@ -1410,9 +1415,9 @@ static int nvme_ioctl(struct block_device *bdev, fmode_t mode,
ns = nvme_get_ns_from_disk(bdev->bd_disk, &head, &srcu_idx);
if (unlikely(!ns))
- ret = -EWOULDBLOCK;
- else
- ret = nvme_ns_ioctl(ns, cmd, arg);
+ return -EWOULDBLOCK;
+
+ ret = nvme_ns_ioctl(ns, cmd, arg);
nvme_put_ns_from_disk(head, srcu_idx);
return ret;
}
--
2.20.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH 1/4] nvme: fix srcu locking on error return in nvme_get_ns_from_disk
2019-05-17 9:47 Christoph Hellwig
@ 2019-05-17 18:36 ` Keith Busch
0 siblings, 0 replies; 14+ messages in thread
From: Keith Busch @ 2019-05-17 18:36 UTC (permalink / raw)
Series applied for 5.2.
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2019-05-17 18:36 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-05-16 18:50 [PATCH 1/4] nvme: fix srcu locking on error return in nvme_get_ns_from_disk Christoph Hellwig
2019-05-16 18:50 ` [PATCH 2/4] nvme: remove the ifdef around nvme_nvm_ioctl Christoph Hellwig
2019-05-16 19:01 ` Keith Busch
2019-05-16 22:33 ` Chaitanya Kulkarni
2019-05-16 18:50 ` [PATCH 3/4] nvme: merge nvme_ns_ioctl into nvme_ioctl Christoph Hellwig
2019-05-16 19:02 ` Keith Busch
2019-05-16 22:40 ` Chaitanya Kulkarni
2019-05-16 18:50 ` [PATCH 4/4] nvme: release namespace SRCU protection before performing controller ioctls Christoph Hellwig
2019-05-16 19:05 ` Keith Busch
2019-05-16 22:57 ` Chaitanya Kulkarni
2019-05-16 19:01 ` [PATCH 1/4] nvme: fix srcu locking on error return in nvme_get_ns_from_disk Keith Busch
2019-05-16 22:33 ` Chaitanya Kulkarni
-- strict thread matches above, loose matches on Subject: below --
2019-05-17 9:47 Christoph Hellwig
2019-05-17 18:36 ` Keith Busch
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox