mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 11:03:43 +02:00
convert binderfs
Objects are created either by d_alloc_name()+d_add() (in binderfs_ctl_create()) or by simple_start_creating()+d_instantiate(). Removals are by simple_recurisive_removal(). Switch d_add()/d_instantiate() to d_make_persistent() + dput(). Voila - kill_litter_super() is not needed anymore. Fold dput()+unlocking the parent into simple_done_creating(), while we are at it. NOTE: return value of binderfs_create_file() is borrowed; it may get stored in proc->binderfs_entry. See binder_release()... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
02da8d2c09
commit
b89aa54482
|
|
@ -189,9 +189,9 @@ static int binderfs_binder_device_create(struct inode *ref_inode,
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
inode->i_private = device;
|
inode->i_private = device;
|
||||||
d_instantiate(dentry, inode);
|
d_make_persistent(dentry, inode);
|
||||||
fsnotify_create(root->d_inode, dentry);
|
fsnotify_create(root->d_inode, dentry);
|
||||||
inode_unlock(d_inode(root));
|
simple_done_creating(dentry);
|
||||||
|
|
||||||
binder_add_device(device);
|
binder_add_device(device);
|
||||||
|
|
||||||
|
|
@ -432,7 +432,8 @@ static int binderfs_binder_ctl_create(struct super_block *sb)
|
||||||
|
|
||||||
inode->i_private = device;
|
inode->i_private = device;
|
||||||
info->control_dentry = dentry;
|
info->control_dentry = dentry;
|
||||||
d_add(dentry, inode);
|
d_make_persistent(dentry, inode);
|
||||||
|
dput(dentry);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
@ -479,19 +480,16 @@ struct dentry *binderfs_create_file(struct dentry *parent, const char *name,
|
||||||
sb = parent_inode->i_sb;
|
sb = parent_inode->i_sb;
|
||||||
new_inode = binderfs_make_inode(sb, S_IFREG | 0444);
|
new_inode = binderfs_make_inode(sb, S_IFREG | 0444);
|
||||||
if (!new_inode) {
|
if (!new_inode) {
|
||||||
dput(dentry);
|
simple_done_creating(dentry);
|
||||||
dentry = ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
new_inode->i_fop = fops;
|
new_inode->i_fop = fops;
|
||||||
new_inode->i_private = data;
|
new_inode->i_private = data;
|
||||||
d_instantiate(dentry, new_inode);
|
d_make_persistent(dentry, new_inode);
|
||||||
fsnotify_create(parent_inode, dentry);
|
fsnotify_create(parent_inode, dentry);
|
||||||
|
simple_done_creating(dentry);
|
||||||
out:
|
return dentry; // borrowed
|
||||||
inode_unlock(parent_inode);
|
|
||||||
return dentry;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct dentry *binderfs_create_dir(struct dentry *parent,
|
static struct dentry *binderfs_create_dir(struct dentry *parent,
|
||||||
|
|
@ -510,21 +508,18 @@ static struct dentry *binderfs_create_dir(struct dentry *parent,
|
||||||
sb = parent_inode->i_sb;
|
sb = parent_inode->i_sb;
|
||||||
new_inode = binderfs_make_inode(sb, S_IFDIR | 0755);
|
new_inode = binderfs_make_inode(sb, S_IFDIR | 0755);
|
||||||
if (!new_inode) {
|
if (!new_inode) {
|
||||||
dput(dentry);
|
simple_done_creating(dentry);
|
||||||
dentry = ERR_PTR(-ENOMEM);
|
return ERR_PTR(-ENOMEM);
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
new_inode->i_fop = &simple_dir_operations;
|
new_inode->i_fop = &simple_dir_operations;
|
||||||
new_inode->i_op = &simple_dir_inode_operations;
|
new_inode->i_op = &simple_dir_inode_operations;
|
||||||
|
|
||||||
set_nlink(new_inode, 2);
|
set_nlink(new_inode, 2);
|
||||||
d_instantiate(dentry, new_inode);
|
d_make_persistent(dentry, new_inode);
|
||||||
inc_nlink(parent_inode);
|
inc_nlink(parent_inode);
|
||||||
fsnotify_mkdir(parent_inode, dentry);
|
fsnotify_mkdir(parent_inode, dentry);
|
||||||
|
simple_done_creating(dentry);
|
||||||
out:
|
|
||||||
inode_unlock(parent_inode);
|
|
||||||
return dentry;
|
return dentry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -740,7 +735,7 @@ static void binderfs_kill_super(struct super_block *sb)
|
||||||
* During inode eviction struct binderfs_info is needed.
|
* During inode eviction struct binderfs_info is needed.
|
||||||
* So first wipe the super_block then free struct binderfs_info.
|
* So first wipe the super_block then free struct binderfs_info.
|
||||||
*/
|
*/
|
||||||
kill_litter_super(sb);
|
kill_anon_super(sb);
|
||||||
|
|
||||||
if (info && info->ipc_ns)
|
if (info && info->ipc_ns)
|
||||||
put_ipc_ns(info->ipc_ns);
|
put_ipc_ns(info->ipc_ns);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user