When remove gendisk, set the size of inode of block_device to zero. This is mainly let the vfs know disk removed. Signed-off-by: Jianpeng Ma <majianpeng@xxxxxxxxx> --- block/genhd.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/block/genhd.c b/block/genhd.c index dadf42b..c3a54b4 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -634,6 +634,7 @@ void del_gendisk(struct gendisk *disk) { struct disk_part_iter piter; struct hd_struct *part; + struct block_device *bdev; disk_del_events(disk); @@ -655,6 +656,19 @@ void del_gendisk(struct gendisk *disk) blk_unregister_queue(disk); blk_unregister_region(disk_devt(disk), disk->minors); + /* + * When used buffer-mode on raw blockdevice,the disk removed. + * But the vfs don't know.So tell the vfs size of disk became zero, + * the buffer write can return + */ + bdev = bdget_disk(disk, 0); + if (bdev) { + mutex_lock(&bdev->bd_inode->i_mutex); + i_size_write(bdev->bd_inode, 0); + mutex_unlock(&bdev->bd_inode->i_mutex); + bdput(bdev); + } + part_stat_set_all(&disk->part0, 0); disk->part0.stamp = 0; -- 1.8.4-rc0 ÿôèº{.nÇ+?·?®??+%?Ëÿ±éݶ¥?wÿº{.nÇ+?·¥?{±ýûz÷¥þ)í?æèw*jg¬±¨¶????Ý¢jÿ¾«þG«?éÿ¢¸¢·¦j:+v?¨?wèjØm¶?ÿþø¯ù®w¥þ?àþf£¢·h??â?úÿ?Ù¥