@@ -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-
493464void 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
508469static 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