Skip to content

Commit 564e87b

Browse files
Al ViroKernel Patches Daemon
authored andcommitted
convert rust_binderfs
Parallel to binderfs stuff: * use simple_start_creating()/simple_done_creating()/d_make_persistent() instead of manual inode_lock()/lookup_noperm()/d_instanitate()/inode_unlock(). * allocate inode first - simpler cleanup that way. * use simple_recursive_removal() instead of open-coding it. * switch to kill_anon_super() Signed-off-by: Al Viro <[email protected]>
1 parent 72401fe commit 564e87b

File tree

1 file changed

+33
-88
lines changed

1 file changed

+33
-88
lines changed

drivers/android/binder/rust_binderfs.c

Lines changed: 33 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -178,28 +178,17 @@ static int binderfs_binder_device_create(struct inode *ref_inode,
178178
}
179179

180180
root = sb->s_root;
181-
inode_lock(d_inode(root));
182-
183-
/* look it up */
184-
dentry = lookup_noperm(&QSTR(req->name), root);
181+
dentry = simple_start_creating(root, req->name);
185182
if (IS_ERR(dentry)) {
186-
inode_unlock(d_inode(root));
187183
ret = PTR_ERR(dentry);
188184
goto err;
189185
}
190186

191-
if (d_really_is_positive(dentry)) {
192-
/* already exists */
193-
dput(dentry);
194-
inode_unlock(d_inode(root));
195-
ret = -EEXIST;
196-
goto err;
197-
}
198-
199187
inode->i_private = device;
200-
d_instantiate(dentry, inode);
188+
d_make_persistent(dentry, inode);
189+
201190
fsnotify_create(root->d_inode, dentry);
202-
inode_unlock(d_inode(root));
191+
simple_done_creating(dentry);
203192

204193
return 0;
205194

@@ -472,69 +461,33 @@ static struct inode *binderfs_make_inode(struct super_block *sb, int mode)
472461
return ret;
473462
}
474463

475-
static struct dentry *binderfs_create_dentry(struct dentry *parent,
476-
const char *name)
477-
{
478-
struct dentry *dentry;
479-
480-
dentry = lookup_noperm(&QSTR(name), parent);
481-
if (IS_ERR(dentry))
482-
return dentry;
483-
484-
/* Return error if the file/dir already exists. */
485-
if (d_really_is_positive(dentry)) {
486-
dput(dentry);
487-
return ERR_PTR(-EEXIST);
488-
}
489-
490-
return dentry;
491-
}
492-
493464
void rust_binderfs_remove_file(struct dentry *dentry)
494465
{
495-
struct inode *parent_inode;
496-
497-
parent_inode = d_inode(dentry->d_parent);
498-
inode_lock(parent_inode);
499-
if (simple_positive(dentry)) {
500-
dget(dentry);
501-
simple_unlink(parent_inode, dentry);
502-
d_delete(dentry);
503-
dput(dentry);
504-
}
505-
inode_unlock(parent_inode);
466+
simple_recursive_removal(dentry, NULL);
506467
}
507468

508469
static struct dentry *rust_binderfs_create_file(struct dentry *parent, const char *name,
509470
const struct file_operations *fops,
510471
void *data)
511472
{
512473
struct dentry *dentry;
513-
struct inode *new_inode, *parent_inode;
514-
struct super_block *sb;
515-
516-
parent_inode = d_inode(parent);
517-
inode_lock(parent_inode);
518-
519-
dentry = binderfs_create_dentry(parent, name);
520-
if (IS_ERR(dentry))
521-
goto out;
522-
523-
sb = parent_inode->i_sb;
524-
new_inode = binderfs_make_inode(sb, S_IFREG | 0444);
525-
if (!new_inode) {
526-
dput(dentry);
527-
dentry = ERR_PTR(-ENOMEM);
528-
goto out;
529-
}
474+
struct inode *new_inode;
530475

476+
new_inode = binderfs_make_inode(parent->d_sb, S_IFREG | 0444);
477+
if (!new_inode)
478+
return ERR_PTR(-ENOMEM);
531479
new_inode->i_fop = fops;
532480
new_inode->i_private = data;
533-
d_instantiate(dentry, new_inode);
534-
fsnotify_create(parent_inode, dentry);
535481

536-
out:
537-
inode_unlock(parent_inode);
482+
dentry = simple_start_creating(parent, name);
483+
if (IS_ERR(dentry)) {
484+
iput(new_inode);
485+
return dentry;
486+
}
487+
488+
d_make_persistent(dentry, new_inode);
489+
fsnotify_create(parent->d_inode, dentry);
490+
simple_done_creating(dentry);
538491
return dentry;
539492
}
540493

@@ -556,34 +509,26 @@ static struct dentry *binderfs_create_dir(struct dentry *parent,
556509
const char *name)
557510
{
558511
struct dentry *dentry;
559-
struct inode *new_inode, *parent_inode;
560-
struct super_block *sb;
561-
562-
parent_inode = d_inode(parent);
563-
inode_lock(parent_inode);
564-
565-
dentry = binderfs_create_dentry(parent, name);
566-
if (IS_ERR(dentry))
567-
goto out;
512+
struct inode *new_inode;
568513

569-
sb = parent_inode->i_sb;
570-
new_inode = binderfs_make_inode(sb, S_IFDIR | 0755);
571-
if (!new_inode) {
572-
dput(dentry);
573-
dentry = ERR_PTR(-ENOMEM);
574-
goto out;
575-
}
514+
new_inode = binderfs_make_inode(parent->d_sb, S_IFDIR | 0755);
515+
if (!new_inode)
516+
return ERR_PTR(-ENOMEM);
576517

577518
new_inode->i_fop = &simple_dir_operations;
578519
new_inode->i_op = &simple_dir_inode_operations;
579520

580-
set_nlink(new_inode, 2);
581-
d_instantiate(dentry, new_inode);
582-
inc_nlink(parent_inode);
583-
fsnotify_mkdir(parent_inode, dentry);
521+
dentry = simple_start_creating(parent, name);
522+
if (IS_ERR(dentry)) {
523+
iput(new_inode);
524+
return dentry;
525+
}
584526

585-
out:
586-
inode_unlock(parent_inode);
527+
inc_nlink(parent->d_inode);
528+
set_nlink(new_inode, 2);
529+
d_make_persistent(dentry, new_inode);
530+
fsnotify_mkdir(parent->d_inode, dentry);
531+
simple_done_creating(dentry);
587532
return dentry;
588533
}
589534

@@ -802,7 +747,7 @@ static void binderfs_kill_super(struct super_block *sb)
802747
* During inode eviction struct binderfs_info is needed.
803748
* So first wipe the super_block then free struct binderfs_info.
804749
*/
805-
kill_litter_super(sb);
750+
kill_anon_super(sb);
806751

807752
if (info && info->ipc_ns)
808753
put_ipc_ns(info->ipc_ns);

0 commit comments

Comments
 (0)