]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
simplify the callers of file_open_name()
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 25 Sep 2025 21:11:36 +0000 (17:11 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 13 Jan 2026 20:18:08 +0000 (15:18 -0500)
It accepts ERR_PTR() for name and does the right thing in that case.
That allows to simplify the logics in callers, making them trivial
to switch to CLASS(filename).

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/open.c
kernel/acct.c
mm/huge_memory.c
mm/swapfile.c

index ac8dedea8dafc9cc6a0551a4257770b5f22e9bb6..7254eda9f4a58a7bcd544adb6550ab9bcef58185 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -1398,14 +1398,8 @@ struct file *file_open_name(struct filename *name, int flags, umode_t mode)
  */
 struct file *filp_open(const char *filename, int flags, umode_t mode)
 {
-       struct filename *name = getname_kernel(filename);
-       struct file *file = ERR_CAST(name);
-
-       if (!IS_ERR(name)) {
-               file = file_open_name(name, flags, mode);
-               putname(name);
-       }
-       return file;
+       CLASS(filename_kernel, name)(filename);
+       return file_open_name(name, flags, mode);
 }
 EXPORT_SYMBOL(filp_open);
 
index 2a2b3c874acd57d428678a707177c86eb06f443a..812808e5b1b81d242cd7745792220ee06087628c 100644 (file)
@@ -218,7 +218,6 @@ static int acct_on(const char __user *name)
        /* Difference from BSD - they don't do O_APPEND */
        const int open_flags = O_WRONLY|O_APPEND|O_LARGEFILE;
        struct pid_namespace *ns = task_active_pid_ns(current);
-       struct filename *pathname __free(putname) = getname(name);
        struct file *original_file __free(fput) = NULL; // in that order
        struct path internal __free(path_put) = {};     // in that order
        struct file *file __free(fput_sync) = NULL;     // in that order
@@ -226,8 +225,7 @@ static int acct_on(const char __user *name)
        struct vfsmount *mnt;
        struct fs_pin *old;
 
-       if (IS_ERR(pathname))
-               return PTR_ERR(pathname);
+       CLASS(filename, pathname)(name);
        original_file = file_open_name(pathname, open_flags, 0);
        if (IS_ERR(original_file))
                return PTR_ERR(original_file);
index 40cf59301c21aa315f96e2aa732152fdf7e1feac..a6d37902b73d2becf73b5aa0eecc77ccb901dc01 100644 (file)
@@ -4692,23 +4692,18 @@ static int split_huge_pages_in_file(const char *file_path, pgoff_t off_start,
                                pgoff_t off_end, unsigned int new_order,
                                long in_folio_offset)
 {
-       struct filename *file;
        struct file *candidate;
        struct address_space *mapping;
-       int ret = -EINVAL;
        pgoff_t index;
        int nr_pages = 1;
        unsigned long total = 0, split = 0;
        unsigned int min_order;
        unsigned int target_order;
 
-       file = getname_kernel(file_path);
-       if (IS_ERR(file))
-               return ret;
-
+       CLASS(filename_kernel, file)(file_path);
        candidate = file_open_name(file, O_RDONLY, 0);
        if (IS_ERR(candidate))
-               goto out;
+               return -EINVAL;
 
        pr_debug("split file-backed THPs in file: %s, page offset: [0x%lx - 0x%lx], new_order: %u, in_folio_offset: %ld\n",
                 file_path, off_start, off_end, new_order, in_folio_offset);
@@ -4757,12 +4752,8 @@ next:
        }
 
        filp_close(candidate, NULL);
-       ret = 0;
-
        pr_debug("%lu of %lu file-backed THP split\n", split, total);
-out:
-       putname(file);
-       return ret;
+       return 0;
 }
 
 #define MAX_INPUT_BUF_SZ 255
index 46d2008e4b9960444c079138b473764cf6fd6c5e..25120cf7c4807e452f2fe5e78e9e7f2578a0e585 100644 (file)
@@ -2831,7 +2831,6 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
        struct file *swap_file, *victim;
        struct address_space *mapping;
        struct inode *inode;
-       struct filename *pathname;
        unsigned int maxpages;
        int err, found = 0;
 
@@ -2840,14 +2839,10 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
 
        BUG_ON(!current->mm);
 
-       pathname = getname(specialfile);
-       if (IS_ERR(pathname))
-               return PTR_ERR(pathname);
-
+       CLASS(filename, pathname)(specialfile);
        victim = file_open_name(pathname, O_RDWR|O_LARGEFILE, 0);
-       err = PTR_ERR(victim);
        if (IS_ERR(victim))
-               goto out;
+               return PTR_ERR(victim);
 
        mapping = victim->f_mapping;
        spin_lock(&swap_lock);
@@ -2964,8 +2959,6 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
 
 out_dput:
        filp_close(victim, NULL);
-out:
-       putname(pathname);
        return err;
 }
 
@@ -3392,7 +3385,6 @@ err:
 SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
 {
        struct swap_info_struct *si;
-       struct filename *name;
        struct file *swap_file = NULL;
        struct address_space *mapping;
        struct dentry *dentry;
@@ -3422,12 +3414,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
        INIT_WORK(&si->discard_work, swap_discard_work);
        INIT_WORK(&si->reclaim_work, swap_reclaim_work);
 
-       name = getname(specialfile);
-       if (IS_ERR(name)) {
-               error = PTR_ERR(name);
-               name = NULL;
-               goto bad_swap;
-       }
+       CLASS(filename, name)(specialfile);
        swap_file = file_open_name(name, O_RDWR | O_LARGEFILE | O_EXCL, 0);
        if (IS_ERR(swap_file)) {
                error = PTR_ERR(swap_file);
@@ -3635,8 +3622,6 @@ bad_swap:
 out:
        if (!IS_ERR_OR_NULL(folio))
                folio_release_kmap(folio, swap_header);
-       if (name)
-               putname(name);
        if (inode)
                inode_unlock(inode);
        return error;