diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2010-05-10 11:59:37 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-05-10 14:20:42 +0200 | 
| commit | dbb6be6d5e974c42bbecd183effaa0df69e1dd8b (patch) | |
| tree | 5735cb47e70853d057a9881dd0ce44b83e88fa63 /fs/9p/fid.c | |
| parent | 6a867a395558a7f882d041783e4cdea6744ca2bf (diff) | |
| parent | b57f95a38233a2e73b679bea4a5453a1cc2a1cc9 (diff) | |
| download | olio-linux-3.10-dbb6be6d5e974c42bbecd183effaa0df69e1dd8b.tar.xz olio-linux-3.10-dbb6be6d5e974c42bbecd183effaa0df69e1dd8b.zip  | |
Merge branch 'linus' into timers/core
Reason: Further posix_cpu_timer patches depend on mainline changes
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'fs/9p/fid.c')
| -rw-r--r-- | fs/9p/fid.c | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/fs/9p/fid.c b/fs/9p/fid.c index 08b2eb15704..7317b39b281 100644 --- a/fs/9p/fid.c +++ b/fs/9p/fid.c @@ -24,6 +24,7 @@  #include <linux/module.h>  #include <linux/errno.h>  #include <linux/fs.h> +#include <linux/slab.h>  #include <linux/sched.h>  #include <linux/idr.h>  #include <net/9p/9p.h> @@ -110,7 +111,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 +184,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;  	}  |