| From 3b22be95b17740068729260c0c7a0598eabbfcd1 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 13 Oct 2020 22:45:14 -0400 |
| Subject: nbd: make the config put is called before the notifying the waiter |
| |
| From: Xiubo Li <xiubli@redhat.com> |
| |
| [ Upstream commit 87aac3a80af5cbad93e63250e8a1e19095ba0d30 ] |
| |
| There has one race case for ceph's rbd-nbd tool. When do mapping |
| it may fail with EBUSY from ioctl(nbd, NBD_DO_IT), but actually |
| the nbd device has already unmaped. |
| |
| It dues to if just after the wake_up(), the recv_work() is scheduled |
| out and defers calling the nbd_config_put(), though the map process |
| has exited the "nbd->recv_task" is not cleared. |
| |
| Signed-off-by: Xiubo Li <xiubli@redhat.com> |
| Reviewed-by: Josef Bacik <josef@toxicpanda.com> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/block/nbd.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c |
| index edf8b632e3d27..f46e26c9d9b3c 100644 |
| --- a/drivers/block/nbd.c |
| +++ b/drivers/block/nbd.c |
| @@ -801,9 +801,9 @@ static void recv_work(struct work_struct *work) |
| if (likely(!blk_should_fake_timeout(rq->q))) |
| blk_mq_complete_request(rq); |
| } |
| + nbd_config_put(nbd); |
| atomic_dec(&config->recv_threads); |
| wake_up(&config->recv_wq); |
| - nbd_config_put(nbd); |
| kfree(args); |
| } |
| |
| -- |
| 2.27.0 |
| |