Al Viro <v...@zeniv.linux.org.uk> writes:

> On Tue, Apr 19, 2016 at 10:04:20PM -0500, Eric W. Biederman wrote:
>> +#ifdef CONFIG_UNIX98_PTYS
>> +int path_pts(struct path *path)
>> +{
>> +    /* Find "pts" in the same directory as the input path */
>> +    struct dentry *child, *parent;
>> +    struct qstr this;
>> +    int ret;
>> +
>> +    ret = path_parent_directory(path);
>> +    if (ret)
>> +            return ret;
>> +
>> +    parent = path->dentry;
>> +    if (!d_can_lookup(parent))
>> +            return -ENOENT;
>
> And how, pray tell, would a parent of anything fail to be a directory?

It is to make that function be visually distinct from path_parentat
which does something rather different. 

>> +    this.name = "pts";
>> +    this.len = 3;
>> +    this.hash = full_name_hash(this.name, this.len);
>> +    if (parent->d_flags & DCACHE_OP_HASH) {
>> +            int err = parent->d_op->d_hash(parent, &this);
>> +            if (err < 0)
>> +                    return err;
>> +    }
>> +    inode_lock(parent->d_inode);
>
> What the hell for?  What does that lock on parent change for the
> dcache lookup you are doing here?

Good point. That is overkill. As we know the dentry is a mount point and
must be in the dcache, the customary lock for performing a lookup from
the disk is not necessary.

>> +    child = d_lookup(parent, &this);
>> +    inode_unlock(parent->d_inode);
>> +    if (!child)
>> +            return -ENOENT;
>
> Take a look at d_hash_and_lookup(), BTW...

Yes.  That does look like a reasonable simplification.

Eric

Reply via email to