Tejun Heo <htejun@xxxxxxxxx> writes: > Yeah, I think using -ENOENT is better; otherwise, my little head feels > like exploding. :-) Ok. I think I know the feeling. > More importantly, sysfs_get_dentry() seems like it > would deference ERR_PTR() value. No? I'm confused where you are referring to but I will try answer this. __sysfs_get_dentry always returns a dentry or NULL if it can't find the dentry. I have quoted my final version of sysfs_get_dentry below for discussion. > struct dentry *sysfs_get_dentry(struct super_block *sb, struct sysfs_dirent *sd) > { > struct sysfs_dirent *cur; > struct dentry *parent_dentry, *dentry; > > /* Bail if this sd won't show up in this superblock */ > if (sd->s_parent && sd->s_parent->s_flags & SYSFS_FLAG_TAGGED) { > const void *tag; > tag = sysfs_lookup_tag(sd->s_parent, sb); > if (sd->s_tag.tag != tag) > return NULL; > } This is the only location where could return NULL the early check if this operation is possible. > /* Find the first parent which has valid dentry. > */ > dentry = NULL; > cur = sd; > while (!(dentry = __sysfs_get_dentry(sb, cur))) { > if (cur->s_flags & SYSFS_FLAG_REMOVED) { > dentry = ERR_PTR(-ENOENT); > break; > } > cur = cur->s_parent; > } Here we depend on the fact that sysfs_root is pointed to by sb->s_root so we know it will always have a dentry. > /* from the found dentry, look up depth times */ > while (dentry->d_fsdata != sd) { > /* Find the first ancestor I have not looked up */ > cur = sd; > while (cur->s_parent != dentry->d_fsdata) > cur = cur->s_parent; > > /* look it up */ > parent_dentry = dentry; > dentry = sysfs_add_dentry(parent_dentry, cur); > dput(parent_dentry); > > if (IS_ERR(dentry)) > break; > } > return dentry; > } Eric _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers