Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

convert tracefs

A mix of persistent and non-persistent dentries in there. Strictly
speaking, no need for kill_litter_super() anyway - it pins an internal
mount whenever a persistent dentry is created, so at fs shutdown time
there won't be any to deal with.

However, let's make it explicit - replace d_instantiate() with
d_make_persistent() + dput() (the latter in tracefs_end_creating(),
where it folds with inode_unlock() into simple_done_creating())
for dentries we want persistent and have d_make_discardable() done
either by simple_recursive_removal() (used by tracefs_remove())
or explicitly in eventfs_remove_events_dir().

Acked-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Al Viro 50d7fd3c eec876df

+8 -9
+2 -2
fs/tracefs/event_inode.c
··· 823 823 * something not worth much. Keeping directory links at 1 824 824 * tells userspace not to trust the link number. 825 825 */ 826 - d_instantiate(dentry, inode); 826 + d_make_persistent(dentry, inode); 827 827 /* The dentry of the "events" parent does keep track though */ 828 828 inc_nlink(dentry->d_parent->d_inode); 829 829 fsnotify_mkdir(dentry->d_parent->d_inode, dentry); ··· 910 910 * and destroyed dynamically. 911 911 */ 912 912 d_invalidate(dentry); 913 - dput(dentry); 913 + d_make_discardable(dentry); 914 914 }
+6 -7
fs/tracefs/inode.c
··· 538 538 .name = "tracefs", 539 539 .init_fs_context = tracefs_init_fs_context, 540 540 .parameters = tracefs_param_specs, 541 - .kill_sb = kill_litter_super, 541 + .kill_sb = kill_anon_super, 542 542 }; 543 543 MODULE_ALIAS_FS("tracefs"); 544 544 ··· 571 571 572 572 struct dentry *tracefs_failed_creating(struct dentry *dentry) 573 573 { 574 - inode_unlock(d_inode(dentry->d_parent)); 575 - dput(dentry); 574 + simple_done_creating(dentry); 576 575 simple_release_fs(&tracefs_mount, &tracefs_mount_count); 577 576 return NULL; 578 577 } 579 578 580 579 struct dentry *tracefs_end_creating(struct dentry *dentry) 581 580 { 582 - inode_unlock(d_inode(dentry->d_parent)); 583 - return dentry; 581 + simple_done_creating(dentry); 582 + return dentry; // borrowed 584 583 } 585 584 586 585 /* Find the inode that this will use for default */ ··· 660 661 inode->i_private = data; 661 662 inode->i_uid = d_inode(dentry->d_parent)->i_uid; 662 663 inode->i_gid = d_inode(dentry->d_parent)->i_gid; 663 - d_instantiate(dentry, inode); 664 + d_make_persistent(dentry, inode); 664 665 fsnotify_create(d_inode(dentry->d_parent), dentry); 665 666 return tracefs_end_creating(dentry); 666 667 } ··· 691 692 692 693 /* directory inodes start off with i_nlink == 2 (for "." entry) */ 693 694 inc_nlink(inode); 694 - d_instantiate(dentry, inode); 695 + d_make_persistent(dentry, inode); 695 696 inc_nlink(d_inode(dentry->d_parent)); 696 697 fsnotify_mkdir(d_inode(dentry->d_parent), dentry); 697 698 return tracefs_end_creating(dentry);