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

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

rbd: fix rbd_dev_remove_parent()



In certain error paths, it is possible for an rbd device to have a
parent spec but no parent rbd_dev.  In rbd_dev_remove_parent() use
the parent field rather than parent_spec in determining whether to
try to remove any parent devices.  Use assertions to indicate that
any non-null parent pointer has parent_spec associated with it.

Signed-off-by: default avatarAlex Elder <elder@inktank.com>
Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
parent b480815a
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -4994,7 +4994,7 @@ static void rbd_dev_release(struct device *dev)

static void rbd_dev_remove_parent(struct rbd_device *rbd_dev)
{
	while (rbd_dev->parent_spec) {
	while (rbd_dev->parent) {
		struct rbd_device *first = rbd_dev;
		struct rbd_device *second = first->parent;
		struct rbd_device *third;
@@ -5007,12 +5007,15 @@ static void rbd_dev_remove_parent(struct rbd_device *rbd_dev)
			first = second;
			second = third;
		}
		rbd_assert(second);
		rbd_remove_all_snaps(second);
		rbd_bus_del_dev(second);
		first->parent = NULL;
		first->parent_overlap = 0;

		rbd_assert(first->parent_spec);
		rbd_spec_put(first->parent_spec);
		first->parent_spec = NULL;
		first->parent_overlap = 0;
		first->parent = NULL;
	}
}