Subject: Added flush_disk to factor out common buffer cache flushing code. From: Andrew Patterson Date: Thu Oct 9 08:56:13 2008 +0200: Git: 56ade44b46780fa291fa68b824f1dafdcb11b0ca References: FATE#302348,FATE#303786 We need to be able to flush the buffer cache for for more than just when a disk is changed, so we factor out common cache flush code in check_disk_change() to an internal flush_disk() routine. This routine will then be used for both disk changes and disk resizes (in a later patch). Include the disk name in the text indicating that there are busy inodes on the device and increase the KERN severity of the message. Adapted for SLES11, based on the original commit. Signed-off-by: Andrew Patterson Signed-off-by: Jens Axboe Signed-off-by: Hannes Reinecke --- fs/block_dev.c | 32 +++++++++++++++++++++++++++----- 1 files changed, 27 insertions(+), 5 deletions(-) diff --git a/fs/block_dev.c b/fs/block_dev.c index f8df73a..eb029ac 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -869,6 +869,32 @@ struct block_device *open_by_devnum(dev_t dev, unsigned mode) EXPORT_SYMBOL(open_by_devnum); /** + * flush_disk - invalidates all buffer-cache entries on a disk + * + * @bdev: struct block device to be flushed + * + * Invalidates all buffer-cache entries on a disk. It should be called + * when a disk has been changed -- either by a media change or online + * resize. + */ +static void flush_disk(struct block_device *bdev) +{ + if (__invalidate_device(bdev)) { + char name[BDEVNAME_SIZE] = ""; + + if (bdev->bd_disk) + disk_name(bdev->bd_disk, 0, name); + printk(KERN_WARNING "VFS: busy inodes on changed media or " + "resized disk %s\n", name); + } + + if (!bdev->bd_disk) + return; + if (bdev->bd_disk->minors > 1) + bdev->bd_invalidated = 1; +} + +/** * check_disk_size_change - checks for disk size change and adjusts * bdev size. * @@ -945,13 +971,9 @@ int check_disk_change(struct block_device *bdev) if (!bdops->media_changed(bdev->bd_disk)) return 0; - if (__invalidate_device(bdev)) - printk("VFS: busy inodes on changed media.\n"); - + flush_disk(bdev); if (bdops->revalidate_disk) bdops->revalidate_disk(bdev->bd_disk); - if (bdev->bd_disk->minors > 1) - bdev->bd_invalidated = 1; return 1; } -- 1.5.2.4