On Wed, 2026-02-04 at 15:57 +1100, NeilBrown wrote: > From: NeilBrown <[email protected]> > > Instead of explicitly locking the parent and performing a lookup in > selinux, use simple_start_creating(), and then use > simple_done_creating() to unlock. > > This extends the region that the directory is locked for, and also > performs a lookup. > The lock extension is of no real consequence. > The lookup uses simple_lookup() and so always succeeds. Thus when > d_make_persistent() is called the dentry will already be hashed. > d_make_persistent() handles this case. > > Signed-off-by: NeilBrown <[email protected]> > --- > security/selinux/selinuxfs.c | 15 +++++++-------- > 1 file changed, 7 insertions(+), 8 deletions(-) > > diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c > index 896acad1f5f7..97e02cd5a9dc 100644 > --- a/security/selinux/selinuxfs.c > +++ b/security/selinux/selinuxfs.c > @@ -1930,15 +1930,16 @@ static const struct inode_operations > swapover_dir_inode_operations = { > static struct dentry *sel_make_swapover_dir(struct super_block *sb, > unsigned long *ino) > { > - struct dentry *dentry = d_alloc_name(sb->s_root, ".swapover"); > + struct dentry *dentry; > struct inode *inode; > > - if (!dentry) > + inode = sel_make_inode(sb, S_IFDIR); > + if (!inode) > return ERR_PTR(-ENOMEM); > > - inode = sel_make_inode(sb, S_IFDIR); > - if (!inode) { > - dput(dentry); > + dentry = simple_start_creating(sb->s_root, ".swapover"); > + if (!dentry) { > + iput(inode); > return ERR_PTR(-ENOMEM); > } > > @@ -1946,11 +1947,9 @@ static struct dentry *sel_make_swapover_dir(struct > super_block *sb, > inode->i_ino = ++(*ino); > /* directory inodes start off with i_nlink == 2 (for "." entry) */ > inc_nlink(inode); > - inode_lock(sb->s_root->d_inode); > d_make_persistent(dentry, inode); > inc_nlink(sb->s_root->d_inode); > - inode_unlock(sb->s_root->d_inode); > - dput(dentry); > + simple_done_creating(dentry); > return dentry; // borrowed > } >
Reviewed-by: Jeff Layton <[email protected]>
