aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/block_dev.c37
-rw-r--r--include/linux/fs.h2
2 files changed, 39 insertions, 0 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 4eeb69a8873..b721955d382 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -853,6 +853,34 @@ struct block_device *open_by_devnum(dev_t dev, unsigned mode)
853EXPORT_SYMBOL(open_by_devnum); 853EXPORT_SYMBOL(open_by_devnum);
854 854
855/** 855/**
856 * check_disk_size_change - checks for disk size change and adjusts
857 * bdev size.
858 *
859 * @disk: struct gendisk to check
860 * @bdev: struct bdev to adjust.
861 *
862 * This routine checks to see if the bdev size does not match the disk size
863 * and adjusts it if it differs.
864 */
865void check_disk_size_change(struct gendisk *disk, struct block_device *bdev)
866{
867 loff_t disk_size, bdev_size;
868
869 disk_size = (loff_t)get_capacity(disk) << 9;
870 bdev_size = i_size_read(bdev->bd_inode);
871 if (disk_size != bdev_size) {
872 char name[BDEVNAME_SIZE];
873
874 disk_name(disk, 0, name);
875 printk(KERN_INFO
876 "%s: detected capacity change from %lld to %lld\n",
877 name, bdev_size, disk_size);
878 i_size_write(bdev->bd_inode, disk_size);
879 }
880}
881EXPORT_SYMBOL(check_disk_size_change);
882
883/**
856 * revalidate_disk - wrapper for lower-level driver's revalidate_disk 884 * revalidate_disk - wrapper for lower-level driver's revalidate_disk
857 * call-back 885 * call-back
858 * 886 *
@@ -864,11 +892,20 @@ EXPORT_SYMBOL(open_by_devnum);
864 */ 892 */
865int revalidate_disk(struct gendisk *disk) 893int revalidate_disk(struct gendisk *disk)
866{ 894{
895 struct block_device *bdev;
867 int ret = 0; 896 int ret = 0;
868 897
869 if (disk->fops->revalidate_disk) 898 if (disk->fops->revalidate_disk)
870 ret = disk->fops->revalidate_disk(disk); 899 ret = disk->fops->revalidate_disk(disk);
871 900
901 bdev = bdget_disk(disk, 0);
902 if (!bdev)
903 return ret;
904
905 mutex_lock(&bdev->bd_mutex);
906 check_disk_size_change(disk, bdev);
907 mutex_unlock(&bdev->bd_mutex);
908 bdput(bdev);
872 return ret; 909 return ret;
873} 910}
874EXPORT_SYMBOL(revalidate_disk); 911EXPORT_SYMBOL(revalidate_disk);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index d63461f9798..32477e8872d 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1722,6 +1722,8 @@ extern int fs_may_remount_ro(struct super_block *);
1722 */ 1722 */
1723#define bio_data_dir(bio) ((bio)->bi_rw & 1) 1723#define bio_data_dir(bio) ((bio)->bi_rw & 1)
1724 1724
1725extern void check_disk_size_change(struct gendisk *disk,
1726 struct block_device *bdev);
1725extern int revalidate_disk(struct gendisk *); 1727extern int revalidate_disk(struct gendisk *);
1726extern int check_disk_change(struct block_device *); 1728extern int check_disk_change(struct block_device *);
1727extern int __invalidate_device(struct block_device *); 1729extern int __invalidate_device(struct block_device *);