Skip to content

Commit 9f65c48

Browse files
teknoraveraxboe
authored andcommitted
loop: raise media_change event
Make the loop device raise a DISK_MEDIA_CHANGE event on attach or detach. # udevadm monitor -up |grep -e DISK_MEDIA_CHANGE -e DEVNAME & # losetup -f zero [ 7.454235] loop0: detected capacity change from 0 to 16384 DISK_MEDIA_CHANGE=1 DEVNAME=/dev/loop0 DEVNAME=/dev/loop0 DEVNAME=/dev/loop0 # losetup -f zero [ 10.205245] loop1: detected capacity change from 0 to 16384 DISK_MEDIA_CHANGE=1 DEVNAME=/dev/loop1 DEVNAME=/dev/loop1 DEVNAME=/dev/loop1 # losetup -f zero2 [ 13.532368] loop2: detected capacity change from 0 to 40960 DISK_MEDIA_CHANGE=1 DEVNAME=/dev/loop2 DEVNAME=/dev/loop2 # losetup -D DEVNAME=/dev/loop1 DISK_MEDIA_CHANGE=1 DEVNAME=/dev/loop1 DEVNAME=/dev/loop2 DISK_MEDIA_CHANGE=1 DEVNAME=/dev/loop2 DEVNAME=/dev/loop0 DISK_MEDIA_CHANGE=1 DEVNAME=/dev/loop0 Signed-off-by: Matteo Croce <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Tested-by: Luca Boccassi <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jens Axboe <[email protected]>
1 parent e6138dc commit 9f65c48

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

drivers/block/loop.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev,
774774
goto out_err;
775775

776776
/* and ... switch */
777+
disk_force_media_change(lo->lo_disk, DISK_EVENT_MEDIA_CHANGE);
777778
blk_mq_freeze_queue(lo->lo_queue);
778779
mapping_set_gfp_mask(old_file->f_mapping, lo->old_gfp_mask);
779780
lo->lo_backing_file = file;
@@ -1257,6 +1258,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
12571258
goto out_unlock;
12581259
}
12591260

1261+
disk_force_media_change(lo->lo_disk, DISK_EVENT_MEDIA_CHANGE);
12601262
set_disk_ro(lo->lo_disk, (lo->lo_flags & LO_FLAGS_READ_ONLY) != 0);
12611263

12621264
INIT_WORK(&lo->rootcg_work, loop_rootcg_workfn);
@@ -1410,6 +1412,7 @@ static int __loop_clr_fd(struct loop_device *lo, bool release)
14101412

14111413
partscan = lo->lo_flags & LO_FLAGS_PARTSCAN && bdev;
14121414
lo_number = lo->lo_number;
1415+
disk_force_media_change(lo->lo_disk, DISK_EVENT_MEDIA_CHANGE);
14131416
out_unlock:
14141417
mutex_unlock(&lo->lo_mutex);
14151418
if (partscan) {
@@ -2386,6 +2389,8 @@ static int loop_add(int i)
23862389
disk->fops = &lo_fops;
23872390
disk->private_data = lo;
23882391
disk->queue = lo->lo_queue;
2392+
disk->events = DISK_EVENT_MEDIA_CHANGE;
2393+
disk->event_flags = DISK_EVENT_FLAG_UEVENT;
23892394
sprintf(disk->disk_name, "loop%d", i);
23902395
add_disk(disk);
23912396
mutex_unlock(&loop_ctl_mutex);

0 commit comments

Comments
 (0)