Hi, 在 2023/02/08 20:02, Jan Kara 写道:
After some thought I don't like opencoding blkdev_get_by_dev() in disk_scan partitions. But I agree Christoph's approach with blkdev_get_whole() does not quite work either. We could propagate holder/owner into blkdev_get_whole() to fix Christoph's check but still we are left with a question what to do with GD_NEED_PART_SCAN set bit when we get into blkdev_get_whole() and find out we are not elligible to rescan partitions. Because then some exclusive opener later might be caught by surprise when the partition rescan happens due to this bit being set from the past failed attempt to rescan. So what we could do is play a similar trick as we do in the loop device and do in disk_scan_partitions(): /* * If we don't hold exclusive handle for the device, upgrade to it * here to avoid changing partitions under exclusive owner. */ if (!(mode & FMODE_EXCL)) {
This is not necessary, all the caller make sure FMODE_EXCL is not set.
error = bd_prepare_to_claim(disk->part0, disk_scan_partitions); if (error) return error; }
From what I see, if thread open device excl first, and then call ioctl() to reread partition, this will cause this ioctl() to fail?
set_bit(GD_NEED_PART_SCAN, &disk->state); bdev = blkdev_get_by_dev(disk_devt(disk), mode & ~FMODE_EXCL, NULL); if (IS_ERR(bdev)) { error = PTR_ERR(bdev); goto abort; } blkdev_put(bdev, mode & ~FMODE_EXCL); error = 0; abort: if (!(mode & FMODE_EXCL)) bd_abort_claiming(disk->part0, disk_scan_partitions); return error; So esentially we'll temporarily block any exlusive openers by claiming the bdev while we set the GD_NEED_PART_SCAN and force partition rescan. What do you think? Honza