Skip to content

Commit

Permalink
9p: if v9fs_fid_lookup() gets to asking server, it'd better have hash…
Browse files Browse the repository at this point in the history
…ed dentry

... otherwise the path we'd built isn't worth much.  Don't accept such fids
obtained from paths unless dentry is still alived by the end of the work.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Al Viro committed Feb 28, 2013
1 parent a3b2157 commit 5e60867
Showing 1 changed file with 17 additions and 3 deletions.
20 changes: 17 additions & 3 deletions fs/9p/fid.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,15 @@
*
*/

static inline void __add_fid(struct dentry *dentry, struct p9_fid *fid)
{
hlist_add_head(&fid->dlist, (struct hlist_head *)&dentry->d_fsdata);
}

void v9fs_fid_add(struct dentry *dentry, struct p9_fid *fid)
{
spin_lock(&dentry->d_lock);
hlist_add_head(&fid->dlist, (struct hlist_head *)&dentry->d_fsdata);
__add_fid(dentry, fid);
spin_unlock(&dentry->d_lock);
}

Expand Down Expand Up @@ -198,8 +203,17 @@ static struct p9_fid *v9fs_fid_lookup_with_uid(struct dentry *dentry,
}
kfree(wnames);
fid_out:
if (!IS_ERR(fid))
v9fs_fid_add(dentry, fid);
if (!IS_ERR(fid)) {
spin_lock(&dentry->d_lock);
if (d_unhashed(dentry)) {
spin_unlock(&dentry->d_lock);
p9_client_clunk(fid);
fid = ERR_PTR(-ENOENT);
} else {
__add_fid(dentry, fid);
spin_unlock(&dentry->d_lock);
}
}
err_out:
up_read(&v9ses->rename_sem);
return fid;
Expand Down

0 comments on commit 5e60867

Please sign in to comment.