Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 82a442d2 authored by Alex Elder's avatar Alex Elder Committed by Sage Weil
Browse files

rbd: protect against concurrent unmaps



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: default avatarAlex Elder <elder@inktank.com>
Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
parent 751cc0e3
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -5137,6 +5137,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);
@@ -5164,11 +5165,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);