3.10 API change: block_device_operations->release() returns void

Linux kernel commit torvalds/linux@db2a144 changed the return type
of block_device_operations->release() to void.  Detect the expected
prototype and defined our callout accordingly.

Signed-off-by: Chris Dunlop <chris@onthe.net.au>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #1494
This commit is contained in:
Chris Dunlop 2013-06-03 16:58:52 +10:00 committed by Brian Behlendorf
parent 168d056cf8
commit a1d9543a39
4 changed files with 37 additions and 2 deletions

View File

@ -10,7 +10,6 @@ AC_DEFUN([ZFS_AC_KERNEL_BDEV_BLOCK_DEVICE_OPERATIONS], [
int blk_open(struct block_device *bdev, fmode_t mode) int blk_open(struct block_device *bdev, fmode_t mode)
{ return 0; } { return 0; }
int blk_release(struct gendisk *g, fmode_t mode) { return 0; }
int blk_ioctl(struct block_device *bdev, fmode_t mode, int blk_ioctl(struct block_device *bdev, fmode_t mode,
unsigned x, unsigned long y) { return 0; } unsigned x, unsigned long y) { return 0; }
int blk_compat_ioctl(struct block_device * bdev, fmode_t mode, int blk_compat_ioctl(struct block_device * bdev, fmode_t mode,
@ -19,7 +18,7 @@ AC_DEFUN([ZFS_AC_KERNEL_BDEV_BLOCK_DEVICE_OPERATIONS], [
static const struct block_device_operations static const struct block_device_operations
bops __attribute__ ((unused)) = { bops __attribute__ ((unused)) = {
.open = blk_open, .open = blk_open,
.release = blk_release, .release = NULL,
.ioctl = blk_ioctl, .ioctl = blk_ioctl,
.compat_ioctl = blk_compat_ioctl, .compat_ioctl = blk_compat_ioctl,
}; };

View File

@ -0,0 +1,29 @@
dnl #
dnl # 3.10.x API change
dnl #
AC_DEFUN([ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID], [
AC_MSG_CHECKING([whether block_device_operations.release is void])
tmp_flags="$EXTRA_KCFLAGS"
EXTRA_KCFLAGS="${NO_UNUSED_BUT_SET_VARIABLE}"
ZFS_LINUX_TRY_COMPILE([
#include <linux/blkdev.h>
void blk_release(struct gendisk *g, fmode_t mode) { return; }
static const struct block_device_operations
bops __attribute__ ((unused)) = {
.open = NULL,
.release = blk_release,
.ioctl = NULL,
.compat_ioctl = NULL,
};
],[
],[
AC_MSG_RESULT(void)
AC_DEFINE(HAVE_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID, 1,
[struct block_device_operations.release returns void])
],[
AC_MSG_RESULT(int)
])
EXTRA_KCFLAGS="$tmp_flags"
])

View File

@ -7,6 +7,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
ZFS_AC_TEST_MODULE ZFS_AC_TEST_MODULE
ZFS_AC_KERNEL_CONFIG ZFS_AC_KERNEL_CONFIG
ZFS_AC_KERNEL_BDEV_BLOCK_DEVICE_OPERATIONS ZFS_AC_KERNEL_BDEV_BLOCK_DEVICE_OPERATIONS
ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID
ZFS_AC_KERNEL_TYPE_FMODE_T ZFS_AC_KERNEL_TYPE_FMODE_T
ZFS_AC_KERNEL_KOBJ_NAME_LEN ZFS_AC_KERNEL_KOBJ_NAME_LEN
ZFS_AC_KERNEL_3ARG_BLKDEV_GET ZFS_AC_KERNEL_3ARG_BLKDEV_GET

View File

@ -1024,7 +1024,11 @@ out_mutex:
return (error); return (error);
} }
#ifdef HAVE_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID
static void
#else
static int static int
#endif
zvol_release(struct gendisk *disk, fmode_t mode) zvol_release(struct gendisk *disk, fmode_t mode)
{ {
zvol_state_t *zv = disk->private_data; zvol_state_t *zv = disk->private_data;
@ -1044,7 +1048,9 @@ zvol_release(struct gendisk *disk, fmode_t mode)
if (drop_mutex) if (drop_mutex)
mutex_exit(&zvol_state_lock); mutex_exit(&zvol_state_lock);
#ifndef HAVE_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID
return (0); return (0);
#endif
} }
static int static int