mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-04 02:02:28 +09:00
rbd: protect against concurrent unmaps
commit 82a442d239 upstream.
Make sure two concurrent unmap operations on the same rbd device
won't collide, by only proceeding with the removal and cleanup of a
device if is not already underway.
Signed-off-by: Alex Elder <elder@inktank.com>
Reviewed-by: Josh Durgin <josh.durgin@inktank.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
c4d00f5b3e
commit
7aa73ee132
@@ -5108,6 +5108,7 @@ static ssize_t rbd_remove(struct bus_type *bus,
|
||||
struct list_head *tmp;
|
||||
int dev_id;
|
||||
unsigned long ul;
|
||||
bool already = false;
|
||||
int ret;
|
||||
|
||||
ret = strict_strtoul(buf, 10, &ul);
|
||||
@@ -5135,11 +5136,12 @@ static ssize_t rbd_remove(struct bus_type *bus,
|
||||
if (rbd_dev->open_count)
|
||||
ret = -EBUSY;
|
||||
else
|
||||
set_bit(RBD_DEV_FLAG_REMOVING, &rbd_dev->flags);
|
||||
already = test_and_set_bit(RBD_DEV_FLAG_REMOVING,
|
||||
&rbd_dev->flags);
|
||||
spin_unlock_irq(&rbd_dev->lock);
|
||||
}
|
||||
spin_unlock(&rbd_dev_list_lock);
|
||||
if (ret < 0)
|
||||
if (ret < 0 || already)
|
||||
goto done;
|
||||
|
||||
rbd_bus_del_dev(rbd_dev);
|
||||
|
||||
Reference in New Issue
Block a user