AC_DEFUN([ZFS_AC_KERNEL_SRC_VFS_ITERATE], [ ZFS_LINUX_TEST_SRC([file_operations_iterate_shared], [ #include int iterate(struct file *filp, struct dir_context * context) { return 0; } static const struct file_operations fops __attribute__ ((unused)) = { .iterate_shared = iterate, }; ],[]) ZFS_LINUX_TEST_SRC([file_operations_iterate], [ #include int iterate(struct file *filp, struct dir_context *context) { return 0; } static const struct file_operations fops __attribute__ ((unused)) = { .iterate = iterate, }; #if defined(FMODE_KABI_ITERATE) #error "RHEL 7.5, FMODE_KABI_ITERATE interface" #endif ],[]) ZFS_LINUX_TEST_SRC([file_operations_readdir], [ #include int readdir(struct file *filp, void *entry, filldir_t func) { return 0; } static const struct file_operations fops __attribute__ ((unused)) = { .readdir = readdir, }; ],[]) ]) AC_DEFUN([ZFS_AC_KERNEL_VFS_ITERATE], [ dnl # dnl # 4.7 API change dnl # AC_MSG_CHECKING([whether fops->iterate_shared() is available]) ZFS_LINUX_TEST_RESULT([file_operations_iterate_shared], [ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_VFS_ITERATE_SHARED, 1, [fops->iterate_shared() is available]) ],[ AC_MSG_RESULT(no) dnl # dnl # 3.11 API change dnl # dnl # RHEL 7.5 compatibility; the fops.iterate() method was dnl # added to the file_operations structure but in order to dnl # maintain KABI compatibility all callers must set dnl # FMODE_KABI_ITERATE which is checked in iterate_dir(). dnl # When detected ignore this interface and fallback to dnl # to using fops.readdir() to retain KABI compatibility. dnl # AC_MSG_CHECKING([whether fops->iterate() is available]) ZFS_LINUX_TEST_RESULT([file_operations_iterate], [ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_VFS_ITERATE, 1, [fops->iterate() is available]) ],[ AC_MSG_RESULT(no) dnl # dnl # readdir interface introduced dnl # AC_MSG_CHECKING([whether fops->readdir() is available]) ZFS_LINUX_TEST_RESULT([file_operations_readdir], [ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_VFS_READDIR, 1, [fops->readdir() is available]) ],[ ZFS_LINUX_TEST_ERROR([vfs_iterate]) ]) ]) ]) ])