Skip to content

Commit fd22aef

Browse files
committed
rbd: move rbd_unregister_watch() call into rbd_dev_image_release()
rbd_dev->disk tear down vs rbd_watch_cb() race shouldn't be a problem anymore thanks to EXISTS and REMOVING checks in rbd_dev_update_size(). A similar race could occur on "rbd map", see commit 811c668 ("rbd: fix rbd map vs notify races"). Signed-off-by: Ilya Dryomov <[email protected]> Reviewed-by: Jason Dillaman <[email protected]>
1 parent 8b679ec commit fd22aef

File tree

1 file changed

+3
-15
lines changed

1 file changed

+3
-15
lines changed

drivers/block/rbd.c

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5964,6 +5964,8 @@ static int rbd_dev_header_name(struct rbd_device *rbd_dev)
59645964
static void rbd_dev_image_release(struct rbd_device *rbd_dev)
59655965
{
59665966
rbd_dev_unprobe(rbd_dev);
5967+
if (rbd_dev->opts)
5968+
rbd_unregister_watch(rbd_dev);
59675969
rbd_dev->image_format = 0;
59685970
kfree(rbd_dev->spec->image_id);
59695971
rbd_dev->spec->image_id = NULL;
@@ -6126,15 +6128,8 @@ static ssize_t do_rbd_add(struct bus_type *bus,
61266128
rbd_dev->mapping.read_only = read_only;
61276129

61286130
rc = rbd_dev_device_setup(rbd_dev);
6129-
if (rc) {
6130-
/*
6131-
* rbd_unregister_watch() can't be moved into
6132-
* rbd_dev_image_release() without refactoring, see
6133-
* commit 1f3ef78861ac.
6134-
*/
6135-
rbd_unregister_watch(rbd_dev);
6131+
if (rc)
61366132
goto err_out_image_probe;
6137-
}
61386133

61396134
rc = count;
61406135
out:
@@ -6275,14 +6270,7 @@ static ssize_t do_rbd_remove(struct bus_type *bus,
62756270
if (__rbd_is_lock_owner(rbd_dev))
62766271
rbd_unlock(rbd_dev);
62776272
up_write(&rbd_dev->lock_rwsem);
6278-
rbd_unregister_watch(rbd_dev);
62796273

6280-
/*
6281-
* Don't free anything from rbd_dev->disk until after all
6282-
* notifies are completely processed. Otherwise
6283-
* rbd_bus_del_dev() will race with rbd_watch_cb(), resulting
6284-
* in a potential use after free of rbd_dev->disk or rbd_dev.
6285-
*/
62866274
rbd_dev_device_release(rbd_dev);
62876275
rbd_dev_image_release(rbd_dev);
62886276
rbd_dev_destroy(rbd_dev);

0 commit comments

Comments
 (0)