mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Linux 6.15: mkdir now returns struct dentry *
The intent is that the filesystem may have a reference to an "old"
version of the new directory, eg if it was keeping it alive because a
remote NFS client still had it open.
We don't need anything like that, so this really just changes things so
we return error codes encoded in pointers.
Sponsored-by: https://despairlabs.com/sponsor/
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Reviewed-by: Pavel Snajdr <snajpa@snajpa.net>
Signed-off-by: Rob Norris <robn@despairlabs.com>
Closes #17229
(cherry picked from commit bb740d66de)
			
			
This commit is contained in:
		
							parent
							
								
									a4de1d38da
								
							
						
					
					
						commit
						e64d4718a7
					
				| @ -2,6 +2,22 @@ dnl # | ||||
| dnl # Supported mkdir() interfaces checked newest to oldest. | ||||
| dnl # | ||||
| AC_DEFUN([ZFS_AC_KERNEL_SRC_MKDIR], [ | ||||
| 	dnl # | ||||
| 	dnl # 6.15 API change | ||||
| 	dnl # mkdir() returns struct dentry * | ||||
| 	dnl # | ||||
| 	ZFS_LINUX_TEST_SRC([mkdir_return_dentry], [ | ||||
| 		#include <linux/fs.h> | ||||
| 
 | ||||
| 		static struct dentry *mkdir(struct mnt_idmap *idmap, | ||||
| 			struct inode *inode, struct dentry *dentry, | ||||
| 			umode_t umode) { return dentry; } | ||||
| 		static const struct inode_operations | ||||
| 		    iops __attribute__ ((unused)) = { | ||||
| 			.mkdir = mkdir, | ||||
| 		}; | ||||
| 	],[]) | ||||
| 
 | ||||
| 	dnl # | ||||
| 	dnl # 6.3 API change | ||||
| 	dnl # mkdir() takes struct mnt_idmap * as the first arg | ||||
| @ -59,29 +75,40 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_MKDIR], [ | ||||
| 
 | ||||
| AC_DEFUN([ZFS_AC_KERNEL_MKDIR], [ | ||||
| 	dnl # | ||||
| 	dnl # 6.3 API change | ||||
| 	dnl # mkdir() takes struct mnt_idmap * as the first arg | ||||
| 	dnl # 6.15 API change | ||||
| 	dnl # mkdir() returns struct dentry * | ||||
| 	dnl # | ||||
| 	AC_MSG_CHECKING([whether iops->mkdir() takes struct mnt_idmap*]) | ||||
| 	ZFS_LINUX_TEST_RESULT([mkdir_mnt_idmap], [ | ||||
| 	AC_MSG_CHECKING([whether iops->mkdir() returns struct dentry*]) | ||||
| 	ZFS_LINUX_TEST_RESULT([mkdir_return_dentry], [ | ||||
| 		AC_MSG_RESULT(yes) | ||||
| 		AC_DEFINE(HAVE_IOPS_MKDIR_IDMAP, 1, | ||||
| 		    [iops->mkdir() takes struct mnt_idmap*]) | ||||
| 		AC_DEFINE(HAVE_IOPS_MKDIR_DENTRY, 1, | ||||
| 		    [iops->mkdir() returns struct dentry*]) | ||||
| 	],[ | ||||
| 		AC_MSG_RESULT(no) | ||||
| 
 | ||||
| 		dnl # | ||||
| 		dnl # 5.12 API change | ||||
| 		dnl # The struct user_namespace arg was added as the first argument to | ||||
| 		dnl # mkdir() of the iops structure. | ||||
| 		dnl # 6.3 API change | ||||
| 		dnl # mkdir() takes struct mnt_idmap * as the first arg | ||||
| 		dnl # | ||||
| 		AC_MSG_CHECKING([whether iops->mkdir() takes struct user_namespace*]) | ||||
| 		ZFS_LINUX_TEST_RESULT([mkdir_user_namespace], [ | ||||
| 		AC_MSG_CHECKING([whether iops->mkdir() takes struct mnt_idmap*]) | ||||
| 		ZFS_LINUX_TEST_RESULT([mkdir_mnt_idmap], [ | ||||
| 			AC_MSG_RESULT(yes) | ||||
| 			AC_DEFINE(HAVE_IOPS_MKDIR_USERNS, 1, | ||||
| 			    [iops->mkdir() takes struct user_namespace*]) | ||||
| 			AC_DEFINE(HAVE_IOPS_MKDIR_IDMAP, 1, | ||||
| 			    [iops->mkdir() takes struct mnt_idmap*]) | ||||
| 		],[ | ||||
| 			AC_MSG_RESULT(no) | ||||
| 
 | ||||
| 			dnl # | ||||
| 			dnl # 5.12 API change | ||||
| 			dnl # The struct user_namespace arg was added as the first argument to | ||||
| 			dnl # mkdir() of the iops structure. | ||||
| 			dnl # | ||||
| 			AC_MSG_CHECKING([whether iops->mkdir() takes struct user_namespace*]) | ||||
| 			ZFS_LINUX_TEST_RESULT([mkdir_user_namespace], [ | ||||
| 				AC_MSG_RESULT(yes) | ||||
| 				AC_DEFINE(HAVE_IOPS_MKDIR_USERNS, 1, | ||||
| 				    [iops->mkdir() takes struct user_namespace*]) | ||||
| 			],[ | ||||
| 				AC_MSG_RESULT(no) | ||||
| 			]) | ||||
| 		]) | ||||
| 	]) | ||||
| ]) | ||||
|  | ||||
| @ -341,14 +341,20 @@ zpl_snapdir_rmdir(struct inode *dip, struct dentry *dentry) | ||||
| 	return (error); | ||||
| } | ||||
| 
 | ||||
| #if defined(HAVE_IOPS_MKDIR_USERNS) | ||||
| static int | ||||
| #ifdef HAVE_IOPS_MKDIR_USERNS | ||||
| zpl_snapdir_mkdir(struct user_namespace *user_ns, struct inode *dip, | ||||
|     struct dentry *dentry, umode_t mode) | ||||
| #elif defined(HAVE_IOPS_MKDIR_IDMAP) | ||||
| static int | ||||
| zpl_snapdir_mkdir(struct mnt_idmap *user_ns, struct inode *dip, | ||||
|     struct dentry *dentry, umode_t mode) | ||||
| #elif defined(HAVE_IOPS_MKDIR_DENTRY) | ||||
| static struct dentry * | ||||
| zpl_snapdir_mkdir(struct mnt_idmap *user_ns, struct inode *dip, | ||||
|     struct dentry *dentry, umode_t mode) | ||||
| #else | ||||
| static int | ||||
| zpl_snapdir_mkdir(struct inode *dip, struct dentry *dentry, umode_t mode) | ||||
| #endif | ||||
| { | ||||
| @ -376,7 +382,11 @@ zpl_snapdir_mkdir(struct inode *dip, struct dentry *dentry, umode_t mode) | ||||
| 	ASSERT3S(error, <=, 0); | ||||
| 	crfree(cr); | ||||
| 
 | ||||
| #if defined(HAVE_IOPS_MKDIR_DENTRY) | ||||
| 	return (ERR_PTR(error)); | ||||
| #else | ||||
| 	return (error); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
| @ -374,14 +374,20 @@ zpl_unlink(struct inode *dir, struct dentry *dentry) | ||||
| 	return (error); | ||||
| } | ||||
| 
 | ||||
| #if defined(HAVE_IOPS_MKDIR_USERNS) | ||||
| static int | ||||
| #ifdef HAVE_IOPS_MKDIR_USERNS | ||||
| zpl_mkdir(struct user_namespace *user_ns, struct inode *dir, | ||||
|     struct dentry *dentry, umode_t mode) | ||||
| #elif defined(HAVE_IOPS_MKDIR_IDMAP) | ||||
| static int | ||||
| zpl_mkdir(struct mnt_idmap *user_ns, struct inode *dir, | ||||
|     struct dentry *dentry, umode_t mode) | ||||
| #elif defined(HAVE_IOPS_MKDIR_DENTRY) | ||||
| static struct dentry * | ||||
| zpl_mkdir(struct mnt_idmap *user_ns, struct inode *dir, | ||||
|     struct dentry *dentry, umode_t mode) | ||||
| #else | ||||
| static int | ||||
| zpl_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | ||||
| #endif | ||||
| { | ||||
| @ -390,12 +396,14 @@ zpl_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | ||||
| 	znode_t *zp; | ||||
| 	int error; | ||||
| 	fstrans_cookie_t cookie; | ||||
| #if !(defined(HAVE_IOPS_MKDIR_USERNS) || defined(HAVE_IOPS_MKDIR_IDMAP)) | ||||
| #if !(defined(HAVE_IOPS_MKDIR_USERNS) || \ | ||||
| 	defined(HAVE_IOPS_MKDIR_IDMAP) || defined(HAVE_IOPS_MKDIR_DENTRY)) | ||||
| 	zidmap_t *user_ns = kcred->user_ns; | ||||
| #endif | ||||
| 
 | ||||
| 	if (is_nametoolong(dentry)) { | ||||
| 		return (-ENAMETOOLONG); | ||||
| 		error = -ENAMETOOLONG; | ||||
| 		goto err; | ||||
| 	} | ||||
| 
 | ||||
| 	crhold(cr); | ||||
| @ -422,9 +430,14 @@ zpl_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) | ||||
| 	spl_fstrans_unmark(cookie); | ||||
| 	kmem_free(vap, sizeof (vattr_t)); | ||||
| 	crfree(cr); | ||||
| 	ASSERT3S(error, <=, 0); | ||||
| 
 | ||||
| err: | ||||
| 	ASSERT3S(error, <=, 0); | ||||
| #if defined(HAVE_IOPS_MKDIR_DENTRY) | ||||
| 	return (error != 0 ? ERR_PTR(error) : NULL); | ||||
| #else | ||||
| 	return (error); | ||||
| #endif | ||||
| } | ||||
| 
 | ||||
| static int | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Rob Norris
						Rob Norris