diff options
author | Andrew Patterson <andrew.patterson@hp.com> | 2008-09-04 16:27:40 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2008-10-09 02:56:13 -0400 |
commit | 56ade44b46780fa291fa68b824f1dafdcb11b0ca (patch) | |
tree | 2232dc9a9e6b080428e4e6e0a32bcc7c83cc1731 /fs | |
parent | f98a8cae12f2b2a8f9bfd7a53c990a1a405e880e (diff) |
Added flush_disk to factor out common buffer cache flushing code.
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.
Signed-off-by: Andrew Patterson <andrew.patterson@hp.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r-- | 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 b721955d382e..33650fc537c4 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -853,6 +853,32 @@ struct block_device *open_by_devnum(dev_t dev, unsigned mode) | |||
853 | EXPORT_SYMBOL(open_by_devnum); | 853 | EXPORT_SYMBOL(open_by_devnum); |
854 | 854 | ||
855 | /** | 855 | /** |
856 | * flush_disk - invalidates all buffer-cache entries on a disk | ||
857 | * | ||
858 | * @bdev: struct block device to be flushed | ||
859 | * | ||
860 | * Invalidates all buffer-cache entries on a disk. It should be called | ||
861 | * when a disk has been changed -- either by a media change or online | ||
862 | * resize. | ||
863 | */ | ||
864 | static void flush_disk(struct block_device *bdev) | ||
865 | { | ||
866 | if (__invalidate_device(bdev)) { | ||
867 | char name[BDEVNAME_SIZE] = ""; | ||
868 | |||
869 | if (bdev->bd_disk) | ||
870 | disk_name(bdev->bd_disk, 0, name); | ||
871 | printk(KERN_WARNING "VFS: busy inodes on changed media or " | ||
872 | "resized disk %s\n", name); | ||
873 | } | ||
874 | |||
875 | if (!bdev->bd_disk) | ||
876 | return; | ||
877 | if (disk_partitionable(bdev->bd_disk)) | ||
878 | bdev->bd_invalidated = 1; | ||
879 | } | ||
880 | |||
881 | /** | ||
856 | * check_disk_size_change - checks for disk size change and adjusts | 882 | * check_disk_size_change - checks for disk size change and adjusts |
857 | * bdev size. | 883 | * bdev size. |
858 | * | 884 | * |
@@ -929,13 +955,9 @@ int check_disk_change(struct block_device *bdev) | |||
929 | if (!bdops->media_changed(bdev->bd_disk)) | 955 | if (!bdops->media_changed(bdev->bd_disk)) |
930 | return 0; | 956 | return 0; |
931 | 957 | ||
932 | if (__invalidate_device(bdev)) | 958 | flush_disk(bdev); |
933 | printk("VFS: busy inodes on changed media.\n"); | ||
934 | |||
935 | if (bdops->revalidate_disk) | 959 | if (bdops->revalidate_disk) |
936 | bdops->revalidate_disk(bdev->bd_disk); | 960 | bdops->revalidate_disk(bdev->bd_disk); |
937 | if (disk_partitionable(bdev->bd_disk)) | ||
938 | bdev->bd_invalidated = 1; | ||
939 | return 1; | 961 | return 1; |
940 | } | 962 | } |
941 | 963 | ||