]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fuse: factor out helper for FUSE_DEV_IOC_CLONE
authorAmir Goldstein <amir73il@gmail.com>
Thu, 31 Aug 2023 20:07:55 +0000 (23:07 +0300)
committerMiklos Szeredi <mszeredi@redhat.com>
Fri, 23 Feb 2024 16:36:32 +0000 (17:36 +0100)
In preparation to adding more fuse dev ioctls.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/fuse/dev.c

index 1a8f82f478cb7aa4a01f7286ff2f1e939ee5caca..eba68b57bd7c08bfbbfd0bafa1abef0a23fefded 100644 (file)
@@ -2251,43 +2251,50 @@ static int fuse_device_clone(struct fuse_conn *fc, struct file *new)
        return 0;
 }
 
-static long fuse_dev_ioctl(struct file *file, unsigned int cmd,
-                          unsigned long arg)
+static long fuse_dev_ioctl_clone(struct file *file, __u32 __user *argp)
 {
        int res;
        int oldfd;
        struct fuse_dev *fud = NULL;
        struct fd f;
 
+       if (get_user(oldfd, argp))
+               return -EFAULT;
+
+       f = fdget(oldfd);
+       if (!f.file)
+               return -EINVAL;
+
+       /*
+        * Check against file->f_op because CUSE
+        * uses the same ioctl handler.
+        */
+       if (f.file->f_op == file->f_op)
+               fud = fuse_get_dev(f.file);
+
+       res = -EINVAL;
+       if (fud) {
+               mutex_lock(&fuse_mutex);
+               res = fuse_device_clone(fud->fc, file);
+               mutex_unlock(&fuse_mutex);
+       }
+
+       fdput(f);
+       return res;
+}
+
+static long fuse_dev_ioctl(struct file *file, unsigned int cmd,
+                          unsigned long arg)
+{
+       void __user *argp = (void __user *)arg;
+
        switch (cmd) {
        case FUSE_DEV_IOC_CLONE:
-               if (get_user(oldfd, (__u32 __user *)arg))
-                       return -EFAULT;
+               return fuse_dev_ioctl_clone(file, argp);
 
-               f = fdget(oldfd);
-               if (!f.file)
-                       return -EINVAL;
-
-               /*
-                * Check against file->f_op because CUSE
-                * uses the same ioctl handler.
-                */
-               if (f.file->f_op == file->f_op)
-                       fud = fuse_get_dev(f.file);
-
-               res = -EINVAL;
-               if (fud) {
-                       mutex_lock(&fuse_mutex);
-                       res = fuse_device_clone(fud->fc, file);
-                       mutex_unlock(&fuse_mutex);
-               }
-               fdput(f);
-               break;
        default:
-               res = -ENOTTY;
-               break;
+               return -ENOTTY;
        }
-       return res;
 }
 
 const struct file_operations fuse_dev_operations = {