[PATCH v9 3/5] fs: split off do_getxattr from getxattr
From: Stefan Roesch <hidden>
Date: 2021-12-28 18:42:05
Also in:
io-uring
Subsystem:
filesystems (vfs and infrastructure), the rest · Maintainers:
Alexander Viro, Christian Brauner, Linus Torvalds
This splits off do_getxattr function from the getxattr function. This will allow io_uring to call it from its io worker. Signed-off-by: Stefan Roesch <redacted> Acked-by: Christian Brauner <redacted> --- fs/internal.h | 7 +++++++ fs/xattr.c | 32 ++++++++++++++++++++------------ 2 files changed, 27 insertions(+), 12 deletions(-)
diff --git a/fs/internal.h b/fs/internal.h
index 00c98b0cd634..942b2005a2be 100644
--- a/fs/internal.h
+++ b/fs/internal.h@@ -220,6 +220,13 @@ struct xattr_ctx { unsigned int flags; }; + +ssize_t do_getxattr(struct user_namespace *mnt_userns, + struct dentry *d, + const char *kname, + void __user *value, + size_t size); + int setxattr_copy(const char __user *name, struct xattr_ctx *ctx); int do_setxattr(struct user_namespace *mnt_userns, struct dentry *dentry, struct xattr_ctx *ctx);
diff --git a/fs/xattr.c b/fs/xattr.c
index 923ba944d20e..3b6d683d07b9 100644
--- a/fs/xattr.c
+++ b/fs/xattr.c@@ -677,19 +677,12 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name, /* * Extended attribute GET operations */ -static ssize_t -getxattr(struct user_namespace *mnt_userns, struct dentry *d, - const char __user *name, void __user *value, size_t size) +ssize_t +do_getxattr(struct user_namespace *mnt_userns, struct dentry *d, + const char *kname, void __user *value, size_t size) { - ssize_t error; void *kvalue = NULL; - char kname[XATTR_NAME_MAX + 1]; - - error = strncpy_from_user(kname, name, sizeof(kname)); - if (error == 0 || error == sizeof(kname)) - error = -ERANGE; - if (error < 0) - return error; + ssize_t error; if (size) { if (size > XATTR_SIZE_MAX)
@@ -713,10 +706,25 @@ getxattr(struct user_namespace *mnt_userns, struct dentry *d, } kvfree(kvalue); - return error; } +static ssize_t +getxattr(struct user_namespace *mnt_userns, struct dentry *d, + const char __user *name, void __user *value, size_t size) +{ + ssize_t error; + struct xattr_name kname; + + error = strncpy_from_user(kname.name, name, sizeof(kname.name)); + if (error == 0 || error == sizeof(kname.name)) + error = -ERANGE; + if (error < 0) + return error; + + return do_getxattr(mnt_userns, d, kname.name, value, size); +} + static ssize_t path_getxattr(const char __user *pathname, const char __user *name, void __user *value, size_t size, unsigned int lookup_flags)
--
2.30.2