> I have not tested it yet, but I am pretty sure it won't work. It > looks like the patch changes the BLKRRPART path to go ahead and remove > existing partitions when GENHD_FL_NO_PARTSCAN is set. loop doesn't > issue the BLKRRPART ioctl when !LO_FLAGS_PARTSCAN so this won't help. > I think loop needs to set GENHD_FL_NO_PARTSCAN and then issue the > ioctl regardless of the LO_FLAGS_PARTSCAN flag to get the partitions > to be removed. I will try to test tonight. After testing, my initial thoughts appeared to have been correct. I had to modify the patch as follows. To test, simply do: truncate -s 10m img losetup /dev/loop0 img parted /dev/loop0 mklabel msdos mkpart primary ext2 1m 2m quit ls /dev/loop0* Note the /dev/loop0p1 node. Run losetup -d /dev/loop0 and see if it is still there.
diff --git a/block/ioctl.c b/block/ioctl.c index a31d91d..8b78b5a 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -155,7 +155,7 @@ static int blkdev_reread_part(struct block_device *bdev) struct gendisk *disk = bdev->bd_disk; int res; - if (!disk_part_scan_enabled(disk) || bdev != bdev->bd_contains) + if (bdev != bdev->bd_contains) return -EINVAL; if (!capable(CAP_SYS_ADMIN)) return -EACCES; diff --git a/block/partition-generic.c b/block/partition-generic.c index 1cb4dec..0e7d637 100644 --- a/block/partition-generic.c +++ b/block/partition-generic.c @@ -430,6 +430,15 @@ rescan: disk->fops->revalidate_disk(disk); check_disk_size_change(disk, bdev); bdev->bd_invalidated = 0; + + /* + * If partition scanning is disabled, we are done. + */ + if (!disk_part_scan_enabled(disk)) { + kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE); + return 0; + } + if (!get_capacity(disk) || !(state = check_partition(disk, bdev))) return 0; if (IS_ERR(state)) { diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 8bc6d39..326fac9 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -1039,11 +1039,9 @@ static int loop_clr_fd(struct loop_device *lo) lo->lo_state = Lo_unbound; /* This is safe: open() is still holding a reference. */ module_put(THIS_MODULE); - if (lo->lo_flags & LO_FLAGS_PARTSCAN && bdev) - ioctl_by_bdev(bdev, BLKRRPART, 0); + lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN; + ioctl_by_bdev(bdev, BLKRRPART, 0); lo->lo_flags = 0; - if (!part_shift) - lo->lo_disk->flags |= GENHD_FL_NO_PART_SCAN; mutex_unlock(&lo->lo_ctl_mutex); /* * Need not hold lo_ctl_mutex to fput backing file.
Attachment:
signature.asc
Description: OpenPGP digital signature
_______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs