Blob Blame History Raw
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 bed1bb569409..b0cc36737815 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1327,30 +1327,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
@@ -1377,7 +1386,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 668388425f86..5007579512b3 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2554,7 +2554,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