]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
coda: use param->file for FSCONFIG_SET_FD
authorAleksa Sarai <cyphar@cyphar.com>
Wed, 31 Jul 2024 13:10:28 +0000 (23:10 +1000)
committerChristian Brauner <brauner@kernel.org>
Mon, 19 Aug 2024 11:45:03 +0000 (13:45 +0200)
While the old code did support FSCONFIG_SET_FD, there's no need to
re-get the file the fs_context infrastructure already grabbed for us.

Signed-off-by: Aleksa Sarai <cyphar@cyphar.com>
Link: https://lore.kernel.org/r/20240731-fsconfig-fsparam_fd-fixes-v2-2-e7c472224417@cyphar.com
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/coda/inode.c

index 6898dc621011cf206ed862bfb8a5d14c7b785e2f..6896fce122e1865f15455abeac33c904766c2984 100644 (file)
@@ -119,31 +119,43 @@ static const struct fs_parameter_spec coda_param_specs[] = {
        {}
 };
 
-static int coda_parse_fd(struct fs_context *fc, int fd)
+static int coda_set_idx(struct fs_context *fc, struct file *file)
 {
        struct coda_fs_context *ctx = fc->fs_private;
-       struct fd f;
        struct inode *inode;
        int idx;
 
-       f = fdget(fd);
-       if (!f.file)
-               return -EBADF;
-       inode = file_inode(f.file);
+       inode = file_inode(file);
        if (!S_ISCHR(inode->i_mode) || imajor(inode) != CODA_PSDEV_MAJOR) {
-               fdput(f);
-               return invalf(fc, "code: Not coda psdev");
+               return invalf(fc, "coda: Not coda psdev");
        }
-
        idx = iminor(inode);
-       fdput(f);
-
        if (idx < 0 || idx >= MAX_CODADEVS)
                return invalf(fc, "coda: Bad minor number");
        ctx->idx = idx;
        return 0;
 }
 
+static int coda_parse_fd(struct fs_context *fc, struct fs_parameter *param,
+                        struct fs_parse_result *result)
+{
+       struct file *file;
+       int err;
+
+       if (param->type == fs_value_is_file) {
+               file = param->file;
+               param->file = NULL;
+       } else {
+               file = fget(result->uint_32);
+       }
+       if (!file)
+               return -EBADF;
+
+       err = coda_set_idx(fc, file);
+       fput(file);
+       return err;
+}
+
 static int coda_parse_param(struct fs_context *fc, struct fs_parameter *param)
 {
        struct fs_parse_result result;
@@ -155,7 +167,7 @@ static int coda_parse_param(struct fs_context *fc, struct fs_parameter *param)
 
        switch (opt) {
        case Opt_fd:
-               return coda_parse_fd(fc, result.uint_32);
+               return coda_parse_fd(fc, param, &result);
        }
 
        return 0;
@@ -167,6 +179,7 @@ static int coda_parse_param(struct fs_context *fc, struct fs_parameter *param)
  */
 static int coda_parse_monolithic(struct fs_context *fc, void *_data)
 {
+       struct file *file;
        struct coda_mount_data *data = _data;
 
        if (!data)
@@ -175,7 +188,11 @@ static int coda_parse_monolithic(struct fs_context *fc, void *_data)
        if (data->version != CODA_MOUNT_VERSION)
                return invalf(fc, "coda: Bad mount version");
 
-       coda_parse_fd(fc, data->fd);
+       file = fget(data->fd);
+       if (file) {
+               coda_set_idx(fc, file);
+               fput(file);
+       }
        return 0;
 }