+++ /dev/null
-Subject: Adjust block device size after an online resize of a disk.
-From: Andrew Patterson <andrew.patterson@hp.com>
-Date: Thu Oct 9 08:56:12 2008 +0200:
-Git: c3279d1454cdfed02a557d789d8a6d08ab4cbe70
-References: FATE#302348,FATE#303786
-
-The revalidate_disk routine now checks if a disk has been resized by
-comparing the gendisk capacity to the bdev inode size. If they are
-different (usually because the disk has been resized underneath the kernel)
-the bdev inode size is adjusted to match the capacity.
-
-Signed-off-by: Andrew Patterson <andrew.patterson@hp.com>
-Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
-Signed-off-by: Hannes Reinecke <hare@suse.de>
----
- fs/block_dev.c | 37 +++++++++++++++++++++++++++++++++++++
- include/linux/fs.h | 2 ++
- 2 files changed, 39 insertions(+)
-
---- a/fs/block_dev.c
-+++ b/fs/block_dev.c
-@@ -869,6 +869,34 @@ struct block_device *open_by_devnum(dev_
- EXPORT_SYMBOL(open_by_devnum);
-
- /**
-+ * check_disk_size_change - checks for disk size change and adjusts
-+ * bdev size.
-+ *
-+ * @disk: struct gendisk to check
-+ * @bdev: struct bdev to adjust.
-+ *
-+ * This routine checks to see if the bdev size does not match the disk size
-+ * and adjusts it if it differs.
-+ */
-+void check_disk_size_change(struct gendisk *disk, struct block_device *bdev)
-+{
-+ loff_t disk_size, bdev_size;
-+
-+ disk_size = (loff_t)get_capacity(disk) << 9;
-+ bdev_size = i_size_read(bdev->bd_inode);
-+ if (disk_size != bdev_size) {
-+ char name[BDEVNAME_SIZE];
-+
-+ disk_name(disk, 0, name);
-+ printk(KERN_INFO
-+ "%s: detected capacity change from %lld to %lld\n",
-+ name, bdev_size, disk_size);
-+ i_size_write(bdev->bd_inode, disk_size);
-+ }
-+}
-+EXPORT_SYMBOL(check_disk_size_change);
-+
-+/**
- * revalidate_disk - wrapper for lower-level driver's revalidate_disk
- * call-back
- *
-@@ -880,11 +908,20 @@ EXPORT_SYMBOL(open_by_devnum);
- */
- int revalidate_disk(struct gendisk *disk)
- {
-+ struct block_device *bdev;
- int ret = 0;
-
- if (disk->fops->revalidate_disk)
- ret = disk->fops->revalidate_disk(disk);
-
-+ bdev = bdget_disk(disk, 0);
-+ if (!bdev)
-+ return ret;
-+
-+ mutex_lock(&bdev->bd_mutex);
-+ check_disk_size_change(disk, bdev);
-+ mutex_unlock(&bdev->bd_mutex);
-+ bdput(bdev);
- return ret;
- }
- EXPORT_SYMBOL(revalidate_disk);
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -1742,6 +1742,8 @@ extern int fs_may_remount_ro(struct supe
- */
- #define bio_data_dir(bio) ((bio)->bi_rw & 1)
-
-+extern void check_disk_size_change(struct gendisk *disk,
-+ struct block_device *bdev);
- extern int revalidate_disk(struct gendisk *);
- extern int check_disk_change(struct block_device *);
- extern int __invalidate_device(struct block_device *);