]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Linux 5.11 compat: bdev_whole()
authorBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 22 Dec 2020 21:02:59 +0000 (13:02 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 5 Jan 2021 18:26:25 +0000 (10:26 -0800)
The bd_contains member was removed from the block_device structure.
Callers needing to determine if a vdev is a whole block device should
use the new bdev_whole() wrapper.  For older kernels we provide our
own bdev_whole() wrapper which relies on bd_contains for compatibility.

Reviewed-by: Rafael Kitover <rkitover@gmail.com>
Reviewed-by: Coleman Kane <ckane@colemankane.org>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #11387
Closes #11390

config/kernel-blkdev.m4
module/os/linux/zfs/vdev_disk.c

index 622a1af5d0e067d18f70df6b670cef8fe64b98ea..4b80d4dd29a58defbc0f43be384223e0439d02e0 100644 (file)
@@ -271,6 +271,29 @@ AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_BDEV_LOGICAL_BLOCK_SIZE], [
        ])
 ])
 
+dnl #
+dnl # 5.11 API change
+dnl # Added bdev_whole() helper.
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_WHOLE], [
+       ZFS_LINUX_TEST_SRC([bdev_whole], [
+               #include <linux/blkdev.h>
+       ],[
+               struct block_device *bdev = NULL;
+               bdev = bdev_whole(bdev);
+       ])
+])
+
+AC_DEFUN([ZFS_AC_KERNEL_BLKDEV_BDEV_WHOLE], [
+       AC_MSG_CHECKING([whether bdev_whole() is available])
+       ZFS_LINUX_TEST_RESULT([bdev_whole], [
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_BDEV_WHOLE, 1, [bdev_whole() is available])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
+
 AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV], [
        ZFS_AC_KERNEL_SRC_BLKDEV_GET_BY_PATH
        ZFS_AC_KERNEL_SRC_BLKDEV_PUT
@@ -281,6 +304,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_BLKDEV], [
        ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_PHYSICAL_BLOCK_SIZE
        ZFS_AC_KERNEL_SRC_BLKDEV_CHECK_DISK_CHANGE
        ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_CHECK_MEDIA_CHANGE
+       ZFS_AC_KERNEL_SRC_BLKDEV_BDEV_WHOLE
 ])
 
 AC_DEFUN([ZFS_AC_KERNEL_BLKDEV], [
@@ -293,4 +317,5 @@ AC_DEFUN([ZFS_AC_KERNEL_BLKDEV], [
        ZFS_AC_KERNEL_BLKDEV_BDEV_PHYSICAL_BLOCK_SIZE
        ZFS_AC_KERNEL_BLKDEV_CHECK_DISK_CHANGE
        ZFS_AC_KERNEL_BLKDEV_BDEV_CHECK_MEDIA_CHANGE
+       ZFS_AC_KERNEL_BLKDEV_BDEV_WHOLE
 ])
index 7de5c30f7850b7f7f7591a7e91943e3a8d77b2a6..f38b87cfaabbca51c54ad43f4fc3f0c122cfcb0b 100644 (file)
@@ -94,6 +94,14 @@ bdev_capacity(struct block_device *bdev)
        return (i_size_read(bdev->bd_inode));
 }
 
+#if !defined(HAVE_BDEV_WHOLE)
+static inline struct block_device *
+bdev_whole(struct block_device *bdev)
+{
+       return (bdev->bd_contains);
+}
+#endif
+
 /*
  * Returns the maximum expansion capacity of the block device (in bytes).
  *
@@ -118,7 +126,7 @@ bdev_max_capacity(struct block_device *bdev, uint64_t wholedisk)
        uint64_t psize;
        int64_t available;
 
-       if (wholedisk && bdev->bd_part != NULL && bdev != bdev->bd_contains) {
+       if (wholedisk && bdev != bdev_whole(bdev)) {
                /*
                 * When reporting maximum expansion capacity for a wholedisk
                 * deduct any capacity which is expected to be lost due to
@@ -132,7 +140,7 @@ bdev_max_capacity(struct block_device *bdev, uint64_t wholedisk)
                 * "reserved" EFI partition: in such cases return the device
                 * usable capacity.
                 */
-               available = i_size_read(bdev->bd_contains->bd_inode) -
+               available = i_size_read(bdev_whole(bdev)->bd_inode) -
                    ((EFI_MIN_RESV_SIZE + NEW_START_BLOCK +
                    PARTITION_END_ALIGNMENT) << SECTOR_BITS);
                psize = MAX(available, bdev_capacity(bdev));
@@ -192,8 +200,8 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
                vd->vd_bdev = NULL;
 
                if (bdev) {
-                       if (v->vdev_expanding && bdev != bdev->bd_contains) {
-                               bdevname(bdev->bd_contains, disk_name + 5);
+                       if (v->vdev_expanding && bdev != bdev_whole(bdev)) {
+                               bdevname(bdev_whole(bdev), disk_name + 5);
                                /*
                                 * If userland has BLKPG_RESIZE_PARTITION,
                                 * then it should have updated the partition