Fix lookup_bdev() on Ubuntu
Ubuntu added support for checking inode permissions to lookup_bdev() in kernel commit 193fb6a2c94fab8eb8ce70a5da4d21c7d4023bee (merged in 4.4.0-6.21). Upstream bug: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1636517 This patch adds a test for Ubuntu's variant of lookup_bdev() to configure and calls the function in the correct way. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Hajo Möller <dasjoe@gmail.com> Closes #5336
This commit is contained in:
parent
76a87a902e
commit
e02aaf17f1
|
@ -1,17 +1,29 @@
|
||||||
dnl #
|
dnl #
|
||||||
dnl # 2.6.27 API change
|
dnl # 2.6.27, lookup_bdev() was exported.
|
||||||
dnl # lookup_bdev() was exported.
|
dnl # 4.4.0-6.21 - x.y on Ubuntu, lookup_bdev() takes 2 arguments.
|
||||||
dnl #
|
dnl #
|
||||||
AC_DEFUN([ZFS_AC_KERNEL_LOOKUP_BDEV],
|
AC_DEFUN([ZFS_AC_KERNEL_LOOKUP_BDEV],
|
||||||
[AC_MSG_CHECKING([whether lookup_bdev() is available])
|
[AC_MSG_CHECKING([whether lookup_bdev() wants 1 arg])
|
||||||
ZFS_LINUX_TRY_COMPILE_SYMBOL([
|
ZFS_LINUX_TRY_COMPILE_SYMBOL([
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
], [
|
], [
|
||||||
lookup_bdev(NULL);
|
lookup_bdev(NULL);
|
||||||
], [lookup_bdev], [fs/block_dev.c], [
|
], [lookup_bdev], [fs/block_dev.c], [
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
AC_DEFINE(HAVE_LOOKUP_BDEV, 1, [lookup_bdev() is available])
|
AC_DEFINE(HAVE_1ARG_LOOKUP_BDEV, 1, [lookup_bdev() wants 1 arg])
|
||||||
], [
|
], [
|
||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
|
AC_MSG_CHECKING([whether lookup_bdev() wants 2 args])
|
||||||
|
ZFS_LINUX_TRY_COMPILE_SYMBOL([
|
||||||
|
#include <linux/fs.h>
|
||||||
|
], [
|
||||||
|
lookup_bdev(NULL, FMODE_READ);
|
||||||
|
], [lookup_bdev], [fs/block_dev.c], [
|
||||||
|
AC_MSG_RESULT(yes)
|
||||||
|
AC_DEFINE(HAVE_2ARGS_LOOKUP_BDEV, 1,
|
||||||
|
[lookup_bdev() wants 2 args])
|
||||||
|
], [
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
])
|
||||||
])
|
])
|
||||||
])
|
])
|
|
@ -263,12 +263,21 @@ bio_set_flags_failfast(struct block_device *bdev, int *flags)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 2.6.27 API change
|
* 2.6.27 API change
|
||||||
* The function was exported for use, prior to this it existed by the
|
* The function was exported for use, prior to this it existed but the
|
||||||
* symbol was not exported.
|
* symbol was not exported.
|
||||||
|
*
|
||||||
|
* 4.4.0-6.21 API change for Ubuntu
|
||||||
|
* lookup_bdev() gained a second argument, FMODE_*, to check inode permissions.
|
||||||
*/
|
*/
|
||||||
#ifndef HAVE_LOOKUP_BDEV
|
#ifdef HAVE_1ARG_LOOKUP_BDEV
|
||||||
#define lookup_bdev(path) ERR_PTR(-ENOTSUP)
|
#define vdev_lookup_bdev(path) lookup_bdev(path)
|
||||||
#endif
|
#else
|
||||||
|
#ifdef HAVE_2ARGS_LOOKUP_BDEV
|
||||||
|
#define vdev_lookup_bdev(path) lookup_bdev(path, 0)
|
||||||
|
#else
|
||||||
|
#define vdev_lookup_bdev(path) ERR_PTR(-ENOTSUP)
|
||||||
|
#endif /* HAVE_2ARGS_LOOKUP_BDEV */
|
||||||
|
#endif /* HAVE_1ARG_LOOKUP_BDEV */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 2.6.30 API change
|
* 2.6.30 API change
|
||||||
|
|
|
@ -174,7 +174,7 @@ zvol_is_zvol(const char *device)
|
||||||
struct block_device *bdev;
|
struct block_device *bdev;
|
||||||
unsigned int major;
|
unsigned int major;
|
||||||
|
|
||||||
bdev = lookup_bdev(device);
|
bdev = vdev_lookup_bdev(device);
|
||||||
if (IS_ERR(bdev))
|
if (IS_ERR(bdev))
|
||||||
return (B_FALSE);
|
return (B_FALSE);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue