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>
*/
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);
/* 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
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);
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);
}
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
struct file *swap_file, *victim;
struct address_space *mapping;
struct inode *inode;
- struct filename *pathname;
unsigned int maxpages;
int err, found = 0;
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);
out_dput:
filp_close(victim, NULL);
-out:
- putname(pathname);
return 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;
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);
out:
if (!IS_ERR_OR_NULL(folio))
folio_release_kmap(folio, swap_header);
- if (name)
- putname(name);
if (inode)
inode_unlock(inode);
return error;