]> www.infradead.org Git - users/hch/block.git/commitdiff
fs: split off do_getxattr from getxattr
authorStefan Roesch <shr@fb.com>
Thu, 23 Dec 2021 23:51:21 +0000 (15:51 -0800)
committerJens Axboe <axboe@kernel.dk>
Fri, 24 Dec 2021 14:42:31 +0000 (07:42 -0700)
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 <shr@fb.com>
Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
Link: https://lore.kernel.org/r/20211223235123.4092764-4-shr@fb.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/internal.h
fs/xattr.c

index b07df1623de657da398971a27ea82685a6b25267..420d0283be12ca6cb5755640a6fc629355c6f98c 100644 (file)
@@ -220,6 +220,12 @@ struct xattr_ctx {
 };
 
 
+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,
                void **xattr_val);
 int do_setxattr(struct user_namespace *mnt_userns, struct dentry *dentry,
index dcb4f0ff7e6e2bf17045be2f1ce6efe43e62ddca..51e305db426ffec9193e39950aaf00a49c73738b 100644 (file)
@@ -684,19 +684,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)
@@ -720,10 +713,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)