From: Mike Christie <mchristi@redhat.com>
To: sunke32@huawei.com, nbd@other.debian.org, axboe@kernel.dk,
josef@toxicpanda.com, linux-block@vger.kernel.org
Cc: stable@vger.kernel.org
Subject: Re: [PATCH] nbd: fix shutdown and recv work deadlock
Date: Tue, 3 Dec 2019 09:45:56 -0600 [thread overview]
Message-ID: <5DE68334.8090605@redhat.com> (raw)
In-Reply-To: <20191202215150.10250-1-mchristi@redhat.com>
Josef and Jens,
Ignore this patch. It could also deadlock but in a different way, and it
looks like there are other possible issues with races and refcounts. I
will send some new patches.
On 12/02/2019 03:51 PM, Mike Christie wrote:
> This fixes a regression added with:
>
> commit e9e006f5fcf2bab59149cb38a48a4817c1b538b4
> Author: Mike Christie <mchristi@redhat.com>
> Date: Sun Aug 4 14:10:06 2019 -0500
>
> nbd: fix max number of supported devs
>
> where we can deadlock during device shutdown. The problem will occur if
> userpsace has done a NBD_CLEAR_SOCK call, then does close() before the
> recv_work work has done its nbd_config_put() call. If recv_work does the
> last call then it will do destroy_workqueue which will then be stuck
> waiting for the work we are running from.
>
> This fixes the issue by having nbd_start_device_ioctl flush the work
> queue on both the failure and success cases and has a refcount on the
> nbd_device while it is flushing the work queue.
>
> Cc: stable@vger.kernel.org
> Signed-off-by: Mike Christie <mchristi@redhat.com>
> ---
> drivers/block/nbd.c | 9 ++++++---
> 1 file changed, 6 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
> index 57532465fb83..f8597d2fb365 100644
> --- a/drivers/block/nbd.c
> +++ b/drivers/block/nbd.c
> @@ -1293,13 +1293,15 @@ static int nbd_start_device_ioctl(struct nbd_device *nbd, struct block_device *b
>
> if (max_part)
> bdev->bd_invalidated = 1;
> +
> + refcount_inc(&nbd->config_refs);
> mutex_unlock(&nbd->config_lock);
> ret = wait_event_interruptible(config->recv_wq,
> atomic_read(&config->recv_threads) == 0);
> - if (ret) {
> + if (ret)
> sock_shutdown(nbd);
> - flush_workqueue(nbd->recv_workq);
> - }
> + flush_workqueue(nbd->recv_workq);
> +
> mutex_lock(&nbd->config_lock);
> nbd_bdev_reset(bdev);
> /* user requested, ignore socket errors */
> @@ -1307,6 +1309,7 @@ static int nbd_start_device_ioctl(struct nbd_device *nbd, struct block_device *b
> ret = 0;
> if (test_bit(NBD_RT_TIMEDOUT, &config->runtime_flags))
> ret = -ETIMEDOUT;
> + nbd_config_put(nbd);
> return ret;
> }
>
>
prev parent reply other threads:[~2019-12-03 15:46 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-02 21:51 [PATCH] nbd: fix shutdown and recv work deadlock Mike Christie
2019-12-03 15:45 ` Mike Christie [this message]
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=5DE68334.8090605@redhat.com \
--to=mchristi@redhat.com \
--cc=axboe@kernel.dk \
--cc=josef@toxicpanda.com \
--cc=linux-block@vger.kernel.org \
--cc=nbd@other.debian.org \
--cc=stable@vger.kernel.org \
--cc=sunke32@huawei.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.