If reread partitions of disk, the paths are: blkdev_ioctl->blkdev_reread_part->rescan_partitions->drop_partitions ->invalidate_partition->__invalidate_device In func __invalidate_device, if disk already mounted, it will do shrink_dcache_sb and invalidate_inodes. This operation will effect the fs. So add a judgement before doing rescan_partiontions to judge disk whether mounted.
Signed-off-by: Jianpeng Ma <majianp...@gmail.com> --- block/ioctl.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/block/ioctl.c b/block/ioctl.c index a31d91d..374af7e 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -154,11 +154,19 @@ static int blkdev_reread_part(struct block_device *bdev) { struct gendisk *disk = bdev->bd_disk; int res; + struct super_block *sb; if (!disk_part_scan_enabled(disk) || bdev != bdev->bd_contains) return -EINVAL; if (!capable(CAP_SYS_ADMIN)) return -EACCES; + + sb = get_super(bdev); + if (sb) { + drop_super(sb); + return -EBUSY; + } + if (!mutex_trylock(&bdev->bd_mutex)) return -EBUSY; res = rescan_partitions(disk, bdev); -- 1.8.4 N§²æìr¸yúèØb²X¬¶Ç§vØ^)Þº{.nÇ+·¥{±êçzX§¶¡Ü¨}©²Æ zÚ&j:+v¨¾«êçzZ+Ê+zf£¢·h§~Ûiÿûàz¹®w¥¢¸?¨èÚ&¢)ߢfù^jÇ«y§m á@A«a¶Úÿ 0¶ìh®åi