From b53d76e392f0b88a7d135f099fe52ae933050719 Mon Sep 17 00:00:00 2001 From: Raghavendra G Date: Wed, 22 Jun 2011 02:43:30 +0000 Subject: fuse: fix inode-leaks in fuse_lookup_and_resume codepath. Signed-off-by: Raghavendra G Signed-off-by: Anand Avati BUG: 2525 ([glusterfs-3.1.3qa8]: inode leak in rdma) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=2525 --- xlators/mount/fuse/src/fuse-resolve.c | 36 ++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) (limited to 'xlators/mount/fuse/src/fuse-resolve.c') diff --git a/xlators/mount/fuse/src/fuse-resolve.c b/xlators/mount/fuse/src/fuse-resolve.c index b13cb3606..4a450b876 100644 --- a/xlators/mount/fuse/src/fuse-resolve.c +++ b/xlators/mount/fuse/src/fuse-resolve.c @@ -242,15 +242,13 @@ fuse_resolve_deep_cbk (call_frame_t *frame, void *cookie, xlator_t *this, } if (i != 0) { - inode_ref (inode); /* no linking for root inode */ link_inode = inode_link (inode, resolve->deep_loc.parent, resolve->deep_loc.name, buf); - components[i].inode = inode_ref (link_inode); + components[i].inode = link_inode; link_inode = NULL; } - inode_ref (resolve->deep_loc.parent); - inode_ref (inode); + loc_wipe (&resolve->deep_loc); i++; /* next component */ @@ -296,9 +294,6 @@ fuse_resolve_path_deep (fuse_state_t *state) /* start from the root */ active_xl = fuse_active_subvol (state->this); - resolve->deep_loc.inode = inode_ref (active_xl->itable->root); - resolve->deep_loc.path = gf_strdup ("/"); - resolve->deep_loc.name = ""; for (i = 1; components[i].basename; i++) { *(components[i].basename - 1) = '/'; @@ -306,7 +301,7 @@ fuse_resolve_path_deep (fuse_state_t *state) components[i].basename); if (!inode) break; - components[i].inode = inode_ref (inode); + components[i].inode = inode; } if (!components[i].basename) @@ -370,8 +365,18 @@ fuse_resolve_path_simple (fuse_state_t *state) goto out; } - if (components[ino_idx].inode) + if (components[ino_idx].inode) { + if (state->loc_now->inode) { + inode_unref (state->loc_now->inode); + } + state->loc_now->inode = inode_ref (components[ino_idx].inode); + } + + if (state->loc_now->parent) { + inode_unref (state->loc_now->parent); + } + state->loc_now->parent = inode_ref (components[par_idx].inode); ret = 0; @@ -413,6 +418,10 @@ fuse_resolve_entry_simple (fuse_state_t *state) } /* expected @parent was found from the inode cache */ + if (state->loc_now->parent) { + inode_unref (state->loc_now->parent); + } + state->loc_now->parent = inode_ref (parent); inode = inode_grep (active_xl->itable, parent, resolve->bname); @@ -425,6 +434,11 @@ fuse_resolve_entry_simple (fuse_state_t *state) ret = 0; + if (state->loc_now->inode) { + inode_unref (state->loc_now->inode); + state->loc_now->inode = NULL; + } + state->loc_now->inode = inode_ref (inode); out: @@ -483,6 +497,10 @@ fuse_resolve_inode_simple (fuse_state_t *state) ret = 0; + if (state->loc_now->inode) { + inode_unref (state->loc_now->inode); + } + state->loc_now->inode = inode_ref (inode); out: -- cgit