fs/9p: Clunk the fid resulting from partial walk of the name
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Fri, 19 Mar 2010 12:47:26 +0000 (12:47 +0000)
committerEric Van Hensbergen <ericvh@gmail.com>
Mon, 5 Apr 2010 15:37:36 +0000 (10:37 -0500)
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
fs/9p/fid.c

index 08b2eb157048b26aafd052daaeba4c8e38239f0a..b0a23c7e736e6aeff9f95be9a11d9686baf2cf89 100644 (file)
@@ -110,7 +110,7 @@ struct p9_fid *v9fs_fid_lookup(struct dentry *dentry)
 {
        int i, n, l, clone, any, access;
        u32 uid;
-       struct p9_fid *fid;
+       struct p9_fid *fid, *old_fid = NULL;
        struct dentry *d, *ds;
        struct v9fs_session_info *v9ses;
        char **wnames, *uname;
@@ -183,10 +183,18 @@ struct p9_fid *v9fs_fid_lookup(struct dentry *dentry)
                l = min(n - i, P9_MAXWELEM);
                fid = p9_client_walk(fid, l, &wnames[i], clone);
                if (IS_ERR(fid)) {
+                       if (old_fid) {
+                               /*
+                                * If we fail, clunk fid which are mapping
+                                * to path component and not the last component
+                                * of the path.
+                                */
+                               p9_client_clunk(old_fid);
+                       }
                        kfree(wnames);
                        return fid;
                }
-
+               old_fid = fid;
                i += l;
                clone = 0;
        }