diff options
author | Brian Behlendorf <[email protected]> | 2013-01-28 14:15:39 -0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2013-01-28 15:35:00 -0800 |
commit | 2b7ab9d4d9b307c354795e2805ff313ddd01985d (patch) | |
tree | d58656a05ce0968b6d931bc36b0ef7bdaeb5c0ca | |
parent | 930b6fec210d828cb3755f8756dbbbf3001cccae (diff) |
Linux 2.6.26 compat, lookup_bdev()
It's doubtful many people were impacted by this but commit 6c28567
accidentally broke ZFS builds for 2.6.26 and earlier kernels. This
commit depends on the lookup_bdev() function which exists in 2.6.26
but wasn't exported until 2.6.27.
The availability of the function isn't critical so a wrapper is
introduced which returns ERR_PTR(-ENOTSUP) when the function isn't
defined. This will have the effect of causing zvol_is_zvol() to
always fail for 2.6.26 kernels. This in turn means vdevs will
always get opened concurrently which is good for normal usage.
This will only become an issue if your using a zvol as a vdev in
another pool. In which case you really should be using a newer
kernel anyway.
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #1205
-rw-r--r-- | config/kernel-lookup-bdev.m4 | 17 | ||||
-rw-r--r-- | config/kernel.m4 | 1 | ||||
-rw-r--r-- | include/linux/blkdev_compat.h | 9 |
3 files changed, 27 insertions, 0 deletions
diff --git a/config/kernel-lookup-bdev.m4 b/config/kernel-lookup-bdev.m4 new file mode 100644 index 000000000..245f95f04 --- /dev/null +++ b/config/kernel-lookup-bdev.m4 @@ -0,0 +1,17 @@ +dnl # +dnl # 2.6.27 API change +dnl # lookup_bdev() was exported. +dnl # +AC_DEFUN([ZFS_AC_KERNEL_LOOKUP_BDEV], + [AC_MSG_CHECKING([whether lookup_bdev() is available]) + ZFS_LINUX_TRY_COMPILE_SYMBOL([ + #include <linux/fs.h> + ], [ + lookup_bdev(NULL); + ], [lookup_bdev], [fs/block_dev.c], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_LOOKUP_BDEV, 1, [lookup_bdev() is available]) + ], [ + AC_MSG_RESULT(no) + ]) +]) diff --git a/config/kernel.m4 b/config/kernel.m4 index fd6ab1f9a..6d28074d0 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -12,6 +12,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ ZFS_AC_KERNEL_3ARG_BLKDEV_GET ZFS_AC_KERNEL_BLKDEV_GET_BY_PATH ZFS_AC_KERNEL_OPEN_BDEV_EXCLUSIVE + ZFS_AC_KERNEL_LOOKUP_BDEV ZFS_AC_KERNEL_INVALIDATE_BDEV_ARGS ZFS_AC_KERNEL_BDEV_LOGICAL_BLOCK_SIZE ZFS_AC_KERNEL_BDEV_PHYSICAL_BLOCK_SIZE diff --git a/include/linux/blkdev_compat.h b/include/linux/blkdev_compat.h index 1ff8eeaf3..9d3e6f07c 100644 --- a/include/linux/blkdev_compat.h +++ b/include/linux/blkdev_compat.h @@ -393,6 +393,15 @@ bio_set_flags_failfast(struct block_device *bdev, int *flags) #endif /* HAVE_1ARG_INVALIDATE_BDEV */ /* + * 2.6.27 API change + * The function was exported for use, prior to this it existed by the + * symbol was not exported. + */ +#ifndef HAVE_LOOKUP_BDEV +# define lookup_bdev(path) ERR_PTR(-ENOTSUP) +#endif + +/* * 2.6.30 API change * To ensure good performance preferentially use the physical block size * for proper alignment. The physical size is supposed to be the internal |