diff options
Diffstat (limited to 'xlators/mount/fuse/src/fuse-resolve.c')
-rw-r--r-- | xlators/mount/fuse/src/fuse-resolve.c | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/xlators/mount/fuse/src/fuse-resolve.c b/xlators/mount/fuse/src/fuse-resolve.c index b13cb360641..4a450b87646 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: |