On Tue, Nov 24, 2015 at 12:16:10PM -0500, Tejun Heo wrote: > Hello, > > On Mon, Nov 16, 2015 at 01:51:44PM -0600, se...@hallyn.com wrote: > > +struct dentry *kernfs_obtain_root(struct super_block *sb, > > + struct kernfs_node *kn) > > +{ > > + struct dentry *dentry; > > + struct inode *inode; > > + > > + BUG_ON(sb->s_op != &kernfs_sops); > > + > > + /* inode for the given kernfs_node should already exist. */ > > + inode = ilookup(sb, kn->ino); > > + if (!inode) { > > + pr_debug("kernfs: could not get inode for '"); > > + pr_cont_kernfs_path(kn); > > + pr_cont("'.\n"); > > + return ERR_PTR(-EINVAL); > > + } > > Hmmm... but inode might not have been instantiated yet. Why not use > kernfs_get_inode()? > > > + /* instantiate and link root dentry */ > > + dentry = d_obtain_root(inode); > > + if (!dentry) { > > + pr_debug("kernfs: could not get dentry for '"); > > + pr_cont_kernfs_path(kn); > > + pr_cont("'.\n"); > > + return ERR_PTR(-ENOMEM); > > + } > > + > > + /* If this is a new dentry, set it up. We need kernfs_mutex because this > > + * may be called by callers other than kernfs_fill_super. */ > > Formatting. > > > + mutex_lock(&kernfs_mutex); > > + if (!dentry->d_fsdata) { > > + kernfs_get(kn); > > + dentry->d_fsdata = kn; > > + } else { > > + WARN_ON(dentry->d_fsdata != kn); > > + } > > + mutex_unlock(&kernfs_mutex); > > + > > + return dentry; > > +} > > Wouldn't it be simpler to walk dentry from kernfs root than > duplicating dentry instantiation?
Sorry I don't think I'm following. Are you suggesting walking the kn->parent chain backward and doing d_lookup() at each point starting with sb->s_root? -- To unsubscribe from this list: send the line "unsubscribe linux-api" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html