]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: convert xfs_open_by_handle() to FD_PREPARE()
authorChristian Brauner <brauner@kernel.org>
Sun, 23 Nov 2025 16:33:35 +0000 (17:33 +0100)
committerChristian Brauner <brauner@kernel.org>
Fri, 28 Nov 2025 11:42:33 +0000 (12:42 +0100)
Link: https://patch.msgid.link/20251123-work-fd-prepare-v4-17-b6efa1706cfd@kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/xfs/xfs_handle.c

index f19fce557354eca77d3fd1d4a0ffe573eb1b59f4..5a3e3bf4e7ccedbb202fe61fa42ecd196889f1bc 100644 (file)
@@ -233,14 +233,11 @@ xfs_open_by_handle(
        xfs_fsop_handlereq_t    *hreq)
 {
        const struct cred       *cred = current_cred();
-       int                     error;
-       int                     fd;
        int                     permflag;
-       struct file             *filp;
        struct inode            *inode;
        struct dentry           *dentry;
        fmode_t                 fmode;
-       struct path             path;
+       struct path             path __free(path_put) = {};
 
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
@@ -249,12 +246,11 @@ xfs_open_by_handle(
        if (IS_ERR(dentry))
                return PTR_ERR(dentry);
        inode = d_inode(dentry);
+       path.dentry = dentry;
 
        /* Restrict xfs_open_by_handle to directories & regular files. */
-       if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode))) {
-               error = -EPERM;
-               goto out_dput;
-       }
+       if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))
+               return -EPERM;
 
 #if BITS_PER_LONG != 32
        hreq->oflags |= O_LARGEFILE;
@@ -263,48 +259,30 @@ xfs_open_by_handle(
        permflag = hreq->oflags;
        fmode = OPEN_FMODE(permflag);
        if ((!(permflag & O_APPEND) || (permflag & O_TRUNC)) &&
-           (fmode & FMODE_WRITE) && IS_APPEND(inode)) {
-               error = -EPERM;
-               goto out_dput;
-       }
+           (fmode & FMODE_WRITE) && IS_APPEND(inode))
+               return -EPERM;
 
-       if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode)) {
-               error = -EPERM;
-               goto out_dput;
-       }
+       if ((fmode & FMODE_WRITE) && IS_IMMUTABLE(inode))
+               return -EPERM;
 
        /* Can't write directories. */
-       if (S_ISDIR(inode->i_mode) && (fmode & FMODE_WRITE)) {
-               error = -EISDIR;
-               goto out_dput;
-       }
+       if (S_ISDIR(inode->i_mode) && (fmode & FMODE_WRITE))
+               return -EISDIR;
 
-       fd = get_unused_fd_flags(0);
-       if (fd < 0) {
-               error = fd;
-               goto out_dput;
-       }
+       path.mnt = mntget(parfilp->f_path.mnt);
 
-       path.mnt = parfilp->f_path.mnt;
-       path.dentry = dentry;
-       filp = dentry_open(&path, hreq->oflags, cred);
-       dput(dentry);
-       if (IS_ERR(filp)) {
-               put_unused_fd(fd);
-               return PTR_ERR(filp);
-       }
+       FD_PREPARE(fdf, 0, dentry_open(&path, hreq->oflags, cred));
+       if (fdf.err)
+               return fdf.err;
 
        if (S_ISREG(inode->i_mode)) {
+               struct file *filp = fd_prepare_file(fdf);
+
                filp->f_flags |= O_NOATIME;
                filp->f_mode |= FMODE_NOCMTIME;
        }
 
-       fd_install(fd, filp);
-       return fd;
-
- out_dput:
-       dput(dentry);
-       return error;
+       return fd_publish(fdf);
 }
 
 int