diff options
author | Coleman Kane <[email protected]> | 2020-10-18 12:54:21 -0400 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2020-11-03 09:51:26 -0800 |
commit | e767b1cacc065e5765054e30c1f06b4e0ec85692 (patch) | |
tree | 72ef19f82512ed1e6101198c426eb810114f5562 /include/os/linux | |
parent | d2090becabf56708c38ffabeb54f4bb8fff7c74d (diff) |
Linux 5.10 compat: check_disk_change() removed
Kernel 5.10 removed check_disk_change() in favor of callers using
the faster bdev_check_media_change() instead, and explicitly forcing
bdev revalidation when they desire that behavior. To preserve prior
behavior, I have wrapped this into a zfs_check_media_change() macro
that calls an inline function for the new API that mimics the old
behavior when check_disk_change() doesn't exist, and just calls
check_disk_change() if it exists.
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Coleman Kane <[email protected]>
Closes #11085
Diffstat (limited to 'include/os/linux')
-rw-r--r-- | include/os/linux/kernel/linux/blkdev_compat.h | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/include/os/linux/kernel/linux/blkdev_compat.h b/include/os/linux/kernel/linux/blkdev_compat.h index 1cdc300a6..35b775633 100644 --- a/include/os/linux/kernel/linux/blkdev_compat.h +++ b/include/os/linux/kernel/linux/blkdev_compat.h @@ -268,12 +268,48 @@ bio_set_bi_error(struct bio *bio, int error) * * For older kernels trigger a re-reading of the partition table by calling * check_disk_change() which calls flush_disk() to invalidate the device. + * + * For newer kernels (as of 5.10), bdev_check_media_chage is used, in favor of + * check_disk_change(), with the modification that invalidation is no longer + * forced. */ +#ifdef HAVE_CHECK_DISK_CHANGE +#define zfs_check_media_change(bdev) check_disk_change(bdev) #ifdef HAVE_BLKDEV_REREAD_PART #define vdev_bdev_reread_part(bdev) blkdev_reread_part(bdev) #else #define vdev_bdev_reread_part(bdev) check_disk_change(bdev) #endif /* HAVE_BLKDEV_REREAD_PART */ +#else +#ifdef HAVE_BDEV_CHECK_MEDIA_CHANGE +static inline int +zfs_check_media_change(struct block_device *bdev) +{ + struct gendisk *gd = bdev->bd_disk; + const struct block_device_operations *bdo = gd->fops; + + if (!bdev_check_media_change(bdev)) + return (0); + + /* + * Force revalidation, to mimic the old behavior of + * check_disk_change() + */ + if (bdo->revalidate_disk) + bdo->revalidate_disk(gd); + + return (0); +} +#define vdev_bdev_reread_part(bdev) zfs_check_media_change(bdev) +#else +/* + * This is encountered if check_disk_change() and bdev_check_media_change() + * are not available in the kernel - likely due to an API change that needs + * to be chased down. + */ +#error "Unsupported kernel: no usable disk change check" +#endif /* HAVE_BDEV_CHECK_MEDIA_CHANGE */ +#endif /* HAVE_CHECK_DISK_CHANGE */ /* * 2.6.27 API change |