mirror of
				https://git.proxmox.com/git/mirror_zfs
				synced 2025-11-04 07:10:11 +00:00 
			
		
		
		
	As of RHEL 7.5 the mainline fops.iterate() method was added to the file_operations structure and is correctly detected by the configure script. Normally this is what we want, but in order to maintain KABI compatibility the RHEL change additionally does the following: * Requires that callers intending to use this extended interface set the FMODE_KABI_ITERATE flag on the file structure when opening the directory. * Adds the fops.iterate() method to the end of the structure, without removing fops.readdir(). This change updates the configure check to ignore the RHEL 7.5+ variant of fops.iterate() when detected. Instead fallback to the fops.readdir() interface which will be available. Finally, add the 'zpl_' prefix to the directory context wrappers to avoid colliding with the kernel provided symbols when both the fops.iterate() and fops.readdir() are provided by the kernel. Reviewed-by: Olaf Faaland <faaland1@llnl.gov> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #7460 Closes #7463
		
			
				
	
	
		
			76 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
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_TRY_COMPILE([
 | 
						|
		#include <linux/fs.h>
 | 
						|
		int iterate(struct file *filp, struct dir_context * context)
 | 
						|
		    { return 0; }
 | 
						|
 | 
						|
		static const struct file_operations fops
 | 
						|
		    __attribute__ ((unused)) = {
 | 
						|
			.iterate_shared	 = iterate,
 | 
						|
		};
 | 
						|
	],[
 | 
						|
	],[
 | 
						|
		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_TRY_COMPILE([
 | 
						|
			#include <linux/fs.h>
 | 
						|
			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
 | 
						|
		],[
 | 
						|
		],[
 | 
						|
			AC_MSG_RESULT(yes)
 | 
						|
			AC_DEFINE(HAVE_VFS_ITERATE, 1,
 | 
						|
				  [fops->iterate() is available])
 | 
						|
		],[
 | 
						|
			AC_MSG_RESULT(no)
 | 
						|
 | 
						|
			AC_MSG_CHECKING([whether fops->readdir() is available])
 | 
						|
			ZFS_LINUX_TRY_COMPILE([
 | 
						|
				#include <linux/fs.h>
 | 
						|
				int readdir(struct file *filp, void *entry,
 | 
						|
				    filldir_t func) { return 0; }
 | 
						|
 | 
						|
				static const struct file_operations fops
 | 
						|
				    __attribute__ ((unused)) = {
 | 
						|
					.readdir = readdir,
 | 
						|
				};
 | 
						|
			],[
 | 
						|
			],[
 | 
						|
				AC_MSG_RESULT(yes)
 | 
						|
				AC_DEFINE(HAVE_VFS_READDIR, 1,
 | 
						|
					  [fops->readdir() is available])
 | 
						|
			],[
 | 
						|
				AC_MSG_ERROR(no; file a bug report with ZoL)
 | 
						|
			])
 | 
						|
		])
 | 
						|
	])
 | 
						|
])
 |