From: Hannes Reinecke <hare@suse.de>
Date: Tue, 25 Sep 2018 09:54:05 +0200
Subject: [PATCH] kabi fix for check_disk_size_change()
References: bsc#1098459
Patch-Mainline: never, kabi fix for SLE15
Provide a kabi-safe version of check_disk_size_change.
Signed-off-by: Hannes Reinecke <hare@suse.com>
---
block/partition-generic.c | 4 ++--
fs/block_dev.c | 30 +++++++++++++++++++++---------
include/linux/fs.h | 4 +++-
3 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/block/partition-generic.c b/block/partition-generic.c
index f59308cd6c43..bb77c2a5c8c7 100644
--- a/block/partition-generic.c
+++ b/block/partition-generic.c
@@ -509,7 +509,7 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
if (disk->fops->revalidate_disk)
disk->fops->revalidate_disk(disk);
- check_disk_size_change(disk, bdev, true);
+ check_disk_size_change(disk, bdev);
bdev->bd_invalidated = 0;
if (!get_capacity(disk) || !(state = check_partition(disk, bdev)))
return 0;
@@ -634,7 +634,7 @@ int invalidate_partitions(struct gendisk *disk, struct block_device *bdev)
return res;
set_capacity(disk, 0);
- check_disk_size_change(disk, bdev, false);
+ __check_disk_size_change(disk, bdev);
bdev->bd_invalidated = 0;
/* tell userspace that the media / partition table may have changed */
kobject_uevent(&disk_to_dev(disk)->kobj, KOBJ_CHANGE);
diff --git a/fs/block_dev.c b/fs/block_dev.c
index ec6cc370fdf4..ce1e25f1a947 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1313,30 +1313,39 @@ static void flush_disk(struct block_device *bdev, bool kill_dirty)
* check_disk_size_change - checks for disk size change and adjusts bdev size.
* @disk: struct gendisk to check
* @bdev: struct bdev to adjust.
- * @verbose: if %true log a message about a size change if there is any
*
* 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,
- bool verbose)
+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) {
- if (verbose) {
- printk(KERN_INFO
- "%s: detected capacity change from %lld to %lld\n",
- disk->disk_name, bdev_size, disk_size);
- }
+ printk(KERN_INFO
+ "%s: detected capacity change from %lld to %lld\n",
+ disk->disk_name, bdev_size, disk_size);
i_size_write(bdev->bd_inode, disk_size);
flush_disk(bdev, false);
}
}
EXPORT_SYMBOL(check_disk_size_change);
+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) {
+ i_size_write(bdev->bd_inode, disk_size);
+ flush_disk(bdev, false);
+ }
+}
+EXPORT_SYMBOL(__check_disk_size_change);
+
/**
* revalidate_disk - wrapper for lower-level driver's revalidate_disk call-back
* @disk: struct gendisk to be revalidated
@@ -1357,7 +1366,10 @@ int revalidate_disk(struct gendisk *disk)
return ret;
mutex_lock(&bdev->bd_mutex);
- check_disk_size_change(disk, bdev, ret == 0);
+ if (ret == 0)
+ check_disk_size_change(disk, bdev);
+ else
+ __check_disk_size_change(disk, bdev);
bdev->bd_invalidated = 0;
mutex_unlock(&bdev->bd_mutex);
bdput(bdev);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 25d80f3e281d..7a0f3758c381 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2532,7 +2532,9 @@ extern bool is_bad_inode(struct inode *);
#ifdef CONFIG_BLOCK
extern void check_disk_size_change(struct gendisk *disk,
- struct block_device *bdev, bool verbose);
+ struct block_device *bdev);
+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 *, bool);
--
2.16.4