]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fhandle: simplify error handling
authorChristian Brauner <brauner@kernel.org>
Fri, 29 Nov 2024 13:38:01 +0000 (14:38 +0100)
committerChristian Brauner <brauner@kernel.org>
Sat, 14 Dec 2024 11:40:41 +0000 (12:40 +0100)
Rely on our cleanup infrastructure.

Link: https://lore.kernel.org/r/20241129-work-pidfs-file_handle-v1-2-87d803a42495@kernel.org
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/fhandle.c

index ec9145047dfc9d25e109e72d210987bbf6b36a20..c00d88fb14e16654b5cbbb71760c0478eac20384 100644 (file)
@@ -261,19 +261,20 @@ static int do_handle_to_path(struct file_handle *handle, struct path *path,
 {
        int handle_dwords;
        struct vfsmount *mnt = ctx->root.mnt;
+       struct dentry *dentry;
 
        /* change the handle size to multiple of sizeof(u32) */
        handle_dwords = handle->handle_bytes >> 2;
-       path->dentry = exportfs_decode_fh_raw(mnt,
-                                         (struct fid *)handle->f_handle,
-                                         handle_dwords, handle->handle_type,
-                                         ctx->fh_flags,
-                                         vfs_dentry_acceptable, ctx);
-       if (IS_ERR_OR_NULL(path->dentry)) {
-               if (path->dentry == ERR_PTR(-ENOMEM))
+       dentry = exportfs_decode_fh_raw(mnt, (struct fid *)handle->f_handle,
+                                       handle_dwords, handle->handle_type,
+                                       ctx->fh_flags, vfs_dentry_acceptable,
+                                       ctx);
+       if (IS_ERR_OR_NULL(dentry)) {
+               if (dentry == ERR_PTR(-ENOMEM))
                        return -ENOMEM;
                return -ESTALE;
        }
+       path->dentry = dentry;
        path->mnt = mntget(mnt);
        return 0;
 }
@@ -398,29 +399,23 @@ static long do_handle_open(int mountdirfd, struct file_handle __user *ufh,
                           int open_flag)
 {
        long retval = 0;
-       struct path path;
+       struct path path __free(path_put) = {};
        struct file *file;
-       int fd;
 
        retval = handle_to_path(mountdirfd, ufh, &path, open_flag);
        if (retval)
                return retval;
 
-       fd = get_unused_fd_flags(open_flag);
-       if (fd < 0) {
-               path_put(&path);
+       CLASS(get_unused_fd, fd)(O_CLOEXEC);
+       if (fd < 0)
                return fd;
-       }
+
        file = file_open_root(&path, "", open_flag, 0);
-       if (IS_ERR(file)) {
-               put_unused_fd(fd);
-               retval =  PTR_ERR(file);
-       } else {
-               retval = fd;
-               fd_install(fd, file);
-       }
-       path_put(&path);
-       return retval;
+       if (IS_ERR(file))
+               return PTR_ERR(file);
+
+       fd_install(fd, file);
+       return take_fd(fd);
 }
 
 /**