mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user