diff options
Diffstat (limited to 'fs/9p/vfs_inode.c')
| -rw-r--r-- | fs/9p/vfs_inode.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 133db366d306..2cb87ba4b1c1 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
| @@ -270,7 +270,10 @@ v9fs_create(struct v9fs_session_info *v9ses, u32 pfid, char *name, u32 perm, | |||
| 270 | err = v9fs_t_walk(v9ses, pfid, fid, NULL, &fcall); | 270 | err = v9fs_t_walk(v9ses, pfid, fid, NULL, &fcall); |
| 271 | if (err < 0) { | 271 | if (err < 0) { |
| 272 | PRINT_FCALL_ERROR("clone error", fcall); | 272 | PRINT_FCALL_ERROR("clone error", fcall); |
| 273 | goto put_fid; | 273 | if (fcall && fcall->id == RWALK) |
| 274 | goto clunk_fid; | ||
| 275 | else | ||
| 276 | goto put_fid; | ||
| 274 | } | 277 | } |
| 275 | kfree(fcall); | 278 | kfree(fcall); |
| 276 | 279 | ||
| @@ -322,6 +325,9 @@ v9fs_clone_walk(struct v9fs_session_info *v9ses, u32 fid, struct dentry *dentry) | |||
| 322 | &fcall); | 325 | &fcall); |
| 323 | 326 | ||
| 324 | if (err < 0) { | 327 | if (err < 0) { |
| 328 | if (fcall && fcall->id == RWALK) | ||
| 329 | goto clunk_fid; | ||
| 330 | |||
| 325 | PRINT_FCALL_ERROR("walk error", fcall); | 331 | PRINT_FCALL_ERROR("walk error", fcall); |
| 326 | v9fs_put_idpool(nfid, &v9ses->fidpool); | 332 | v9fs_put_idpool(nfid, &v9ses->fidpool); |
| 327 | goto error; | 333 | goto error; |
| @@ -640,19 +646,26 @@ static struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry, | |||
| 640 | } | 646 | } |
| 641 | 647 | ||
| 642 | result = v9fs_t_walk(v9ses, dirfidnum, newfid, | 648 | result = v9fs_t_walk(v9ses, dirfidnum, newfid, |
| 643 | (char *)dentry->d_name.name, NULL); | 649 | (char *)dentry->d_name.name, &fcall); |
| 650 | |||
| 644 | if (result < 0) { | 651 | if (result < 0) { |
| 645 | v9fs_put_idpool(newfid, &v9ses->fidpool); | 652 | if (fcall && fcall->id == RWALK) |
| 653 | v9fs_t_clunk(v9ses, newfid); | ||
| 654 | else | ||
| 655 | v9fs_put_idpool(newfid, &v9ses->fidpool); | ||
| 656 | |||
| 646 | if (result == -ENOENT) { | 657 | if (result == -ENOENT) { |
| 647 | d_add(dentry, NULL); | 658 | d_add(dentry, NULL); |
| 648 | dprintk(DEBUG_VFS, | 659 | dprintk(DEBUG_VFS, |
| 649 | "Return negative dentry %p count %d\n", | 660 | "Return negative dentry %p count %d\n", |
| 650 | dentry, atomic_read(&dentry->d_count)); | 661 | dentry, atomic_read(&dentry->d_count)); |
| 662 | kfree(fcall); | ||
| 651 | return NULL; | 663 | return NULL; |
| 652 | } | 664 | } |
| 653 | dprintk(DEBUG_ERROR, "walk error:%d\n", result); | 665 | dprintk(DEBUG_ERROR, "walk error:%d\n", result); |
| 654 | goto FreeFcall; | 666 | goto FreeFcall; |
| 655 | } | 667 | } |
| 668 | kfree(fcall); | ||
| 656 | 669 | ||
| 657 | result = v9fs_t_stat(v9ses, newfid, &fcall); | 670 | result = v9fs_t_stat(v9ses, newfid, &fcall); |
| 658 | if (result < 0) { | 671 | if (result < 0) { |
