Tejun Heo <[EMAIL PROTECTED]> 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
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to