mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull more vfs stuff from Al Viro: "O_TMPFILE ABI changes, Oleg's fput() series, misc cleanups, including making simple_lookup() usable for filesystems with non-NULL s_d_op, which allows us to get rid of quite a bit of ugliness" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: sunrpc: now we can just set ->s_d_op cgroup: we can use simple_lookup() now efivarfs: we can use simple_lookup() now make simple_lookup() usable for filesystems that set ->s_d_op configfs: don't open-code d_alloc_name() __rpc_lookup_create_exclusive: pass string instead of qstr rpc_create_*_dir: don't bother with qstr llist: llist_add() can use llist_add_batch() llist: fix/simplify llist_add() and llist_add_batch() fput: turn "list_head delayed_fput_list" into llist_head fs/file_table.c:fput(): add comment Safer ABI for O_TMPFILE
This commit is contained in:
commit
41d9884c44
18 changed files with 73 additions and 137 deletions
|
|
@ -660,19 +660,15 @@ static int create_default_group(struct config_group *parent_group,
|
|||
struct config_group *group)
|
||||
{
|
||||
int ret;
|
||||
struct qstr name;
|
||||
struct configfs_dirent *sd;
|
||||
/* We trust the caller holds a reference to parent */
|
||||
struct dentry *child, *parent = parent_group->cg_item.ci_dentry;
|
||||
|
||||
if (!group->cg_item.ci_name)
|
||||
group->cg_item.ci_name = group->cg_item.ci_namebuf;
|
||||
name.name = group->cg_item.ci_name;
|
||||
name.len = strlen(name.name);
|
||||
name.hash = full_name_hash(name.name, name.len);
|
||||
|
||||
ret = -ENOMEM;
|
||||
child = d_alloc(parent, &name);
|
||||
child = d_alloc_name(parent, group->cg_item.ci_name);
|
||||
if (child) {
|
||||
d_add(child, NULL);
|
||||
|
||||
|
|
@ -1650,7 +1646,6 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys)
|
|||
{
|
||||
int err;
|
||||
struct config_group *group = &subsys->su_group;
|
||||
struct qstr name;
|
||||
struct dentry *dentry;
|
||||
struct dentry *root;
|
||||
struct configfs_dirent *sd;
|
||||
|
|
@ -1667,12 +1662,8 @@ int configfs_register_subsystem(struct configfs_subsystem *subsys)
|
|||
|
||||
mutex_lock_nested(&root->d_inode->i_mutex, I_MUTEX_PARENT);
|
||||
|
||||
name.name = group->cg_item.ci_name;
|
||||
name.len = strlen(name.name);
|
||||
name.hash = full_name_hash(name.name, name.len);
|
||||
|
||||
err = -ENOMEM;
|
||||
dentry = d_alloc(root, &name);
|
||||
dentry = d_alloc_name(root, group->cg_item.ci_name);
|
||||
if (dentry) {
|
||||
d_add(dentry, NULL);
|
||||
|
||||
|
|
|
|||
|
|
@ -155,20 +155,8 @@ static int efivarfs_unlink(struct inode *dir, struct dentry *dentry)
|
|||
return 0;
|
||||
};
|
||||
|
||||
/*
|
||||
* Handle negative dentry.
|
||||
*/
|
||||
static struct dentry *efivarfs_lookup(struct inode *dir, struct dentry *dentry,
|
||||
unsigned int flags)
|
||||
{
|
||||
if (dentry->d_name.len > NAME_MAX)
|
||||
return ERR_PTR(-ENAMETOOLONG);
|
||||
d_add(dentry, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const struct inode_operations efivarfs_dir_inode_operations = {
|
||||
.lookup = efivarfs_lookup,
|
||||
.lookup = simple_lookup,
|
||||
.unlink = efivarfs_unlink,
|
||||
.create = efivarfs_create,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -265,18 +265,15 @@ static void __fput(struct file *file)
|
|||
mntput(mnt);
|
||||
}
|
||||
|
||||
static DEFINE_SPINLOCK(delayed_fput_lock);
|
||||
static LIST_HEAD(delayed_fput_list);
|
||||
static LLIST_HEAD(delayed_fput_list);
|
||||
static void delayed_fput(struct work_struct *unused)
|
||||
{
|
||||
LIST_HEAD(head);
|
||||
spin_lock_irq(&delayed_fput_lock);
|
||||
list_splice_init(&delayed_fput_list, &head);
|
||||
spin_unlock_irq(&delayed_fput_lock);
|
||||
while (!list_empty(&head)) {
|
||||
struct file *f = list_first_entry(&head, struct file, f_u.fu_list);
|
||||
list_del_init(&f->f_u.fu_list);
|
||||
__fput(f);
|
||||
struct llist_node *node = llist_del_all(&delayed_fput_list);
|
||||
struct llist_node *next;
|
||||
|
||||
for (; node; node = next) {
|
||||
next = llist_next(node);
|
||||
__fput(llist_entry(node, struct file, f_u.fu_llist));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -306,18 +303,22 @@ void fput(struct file *file)
|
|||
{
|
||||
if (atomic_long_dec_and_test(&file->f_count)) {
|
||||
struct task_struct *task = current;
|
||||
unsigned long flags;
|
||||
|
||||
file_sb_list_del(file);
|
||||
if (likely(!in_interrupt() && !(task->flags & PF_KTHREAD))) {
|
||||
init_task_work(&file->f_u.fu_rcuhead, ____fput);
|
||||
if (!task_work_add(task, &file->f_u.fu_rcuhead, true))
|
||||
return;
|
||||
/*
|
||||
* After this task has run exit_task_work(),
|
||||
* task_work_add() will fail. free_ipc_ns()->
|
||||
* shm_destroy() can do this. Fall through to delayed
|
||||
* fput to avoid leaking *file.
|
||||
*/
|
||||
}
|
||||
spin_lock_irqsave(&delayed_fput_lock, flags);
|
||||
list_add(&file->f_u.fu_list, &delayed_fput_list);
|
||||
schedule_work(&delayed_fput_work);
|
||||
spin_unlock_irqrestore(&delayed_fput_lock, flags);
|
||||
|
||||
if (llist_add(&file->f_u.fu_llist, &delayed_fput_list))
|
||||
schedule_work(&delayed_fput_work);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -61,7 +61,8 @@ struct dentry *simple_lookup(struct inode *dir, struct dentry *dentry, unsigned
|
|||
|
||||
if (dentry->d_name.len > NAME_MAX)
|
||||
return ERR_PTR(-ENAMETOOLONG);
|
||||
d_set_d_op(dentry, &simple_dentry_operations);
|
||||
if (!dentry->d_sb->s_d_op)
|
||||
d_set_d_op(dentry, &simple_dentry_operations);
|
||||
d_add(dentry, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2977,7 +2977,7 @@ static struct file *path_openat(int dfd, struct filename *pathname,
|
|||
|
||||
file->f_flags = op->open_flag;
|
||||
|
||||
if (unlikely(file->f_flags & O_TMPFILE)) {
|
||||
if (unlikely(file->f_flags & __O_TMPFILE)) {
|
||||
error = do_tmpfile(dfd, pathname, nd, flags, op, file, &opened);
|
||||
goto out;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -840,8 +840,8 @@ static inline int build_open_flags(int flags, umode_t mode, struct open_flags *o
|
|||
if (flags & __O_SYNC)
|
||||
flags |= O_DSYNC;
|
||||
|
||||
if (flags & O_TMPFILE) {
|
||||
if (!(flags & O_CREAT))
|
||||
if (flags & __O_TMPFILE) {
|
||||
if ((flags & O_TMPFILE_MASK) != O_TMPFILE)
|
||||
return -EINVAL;
|
||||
acc_mode = MAY_OPEN | ACC_MODE(flags);
|
||||
} else if (flags & O_PATH) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue