diff options
Diffstat (limited to 'xlators/mount/fuse')
-rw-r--r-- | xlators/mount/fuse/src/fuse-resolve.c | 198 |
1 files changed, 6 insertions, 192 deletions
diff --git a/xlators/mount/fuse/src/fuse-resolve.c b/xlators/mount/fuse/src/fuse-resolve.c index 602cc075d45..aa9bf460ee6 100644 --- a/xlators/mount/fuse/src/fuse-resolve.c +++ b/xlators/mount/fuse/src/fuse-resolve.c @@ -27,10 +27,6 @@ static int gf_resolve_all (fuse_state_t *state); static int -resolve_entry_simple (fuse_state_t *state); -static int -resolve_inode_simple (fuse_state_t *state); -static int resolve_path_simple (fuse_state_t *state); static int @@ -203,11 +199,7 @@ resolve_deep_continue (fuse_state_t *state) resolve->op_ret = 0; resolve->op_errno = 0; - if (resolve->par) - ret = resolve_entry_simple (state); - else if (resolve->ino) - ret = resolve_inode_simple (state); - else if (resolve->path) + if (resolve->path) ret = resolve_path_simple (state); if (ret) gf_log ("resolve", GF_LOG_TRACE, @@ -396,176 +388,6 @@ out: */ static int -resolve_entry_simple (fuse_state_t *state) -{ - xlator_t *this = NULL; - xlator_t *active_xl = NULL; - gf_resolve_t *resolve = NULL; - inode_t *parent = NULL; - inode_t *inode = NULL; - int ret = 0; - - this = state->this; - resolve = state->resolve_now; - - active_xl = fuse_active_subvol (this); - - parent = inode_get (active_xl->itable, resolve->par, 0); - if (!parent) { - /* simple resolution is indecisive. need to perform - deep resolution */ - resolve->op_ret = -1; - resolve->op_errno = ENOENT; - ret = 1; - - inode = inode_grep (active_xl->itable, parent, resolve->bname); - if (inode != NULL) { - gf_log (this->name, GF_LOG_DEBUG, "%"PRId64": inode " - "(pointer:%p ino: %"PRIu64") present but parent" - " is NULL for path (%s)", 0L, - inode, inode->ino, resolve->path); - inode_unref (inode); - } - goto out; - } - - /* expected @parent was found from the inode cache */ - state->loc_now->parent = inode_ref (parent); - - inode = inode_grep (active_xl->itable, parent, resolve->bname); - if (!inode) { - switch (resolve->type) { - case RESOLVE_DONTCARE: - case RESOLVE_NOT: - ret = 0; - break; - case RESOLVE_MAY: - ret = 1; - break; - default: - resolve->op_ret = -1; - resolve->op_errno = ENOENT; - ret = 1; - break; - } - - goto out; - } - - if (resolve->type == RESOLVE_NOT) { - gf_log (this->name, GF_LOG_DEBUG, "inode (pointer: %p ino:%" - PRIu64") found for path (%s) while type is RESOLVE_NOT", - inode, inode->ino, resolve->path); - resolve->op_ret = -1; - resolve->op_errno = EEXIST; - ret = -1; - goto out; - } - - ret = 0; - - state->loc_now->inode = inode_ref (inode); - -out: - if (parent) - inode_unref (parent); - - if (inode) - inode_unref (inode); - - return ret; -} - - -static int -gf_resolve_entry (fuse_state_t *state) -{ - int ret = 0; - loc_t *loc = NULL; - - loc = state->loc_now; - - ret = resolve_entry_simple (state); - - if (ret > 0) { - loc_wipe (loc); - resolve_path_deep (state); - return 0; - } - - if (ret == 0) - resolve_loc_touchup (state); - - gf_resolve_all (state); - - return 0; -} - - -static int -resolve_inode_simple (fuse_state_t *state) -{ - xlator_t *active_xl = NULL; - gf_resolve_t *resolve = NULL; - inode_t *inode = NULL; - int ret = 0; - - resolve = state->resolve_now; - - active_xl = fuse_active_subvol (state->this); - - if (resolve->type == RESOLVE_EXACT) { - inode = inode_get (active_xl->itable, resolve->ino, - resolve->gen); - } else { - inode = inode_get (active_xl->itable, resolve->ino, 0); - } - - if (!inode) { - resolve->op_ret = -1; - resolve->op_errno = ENOENT; - ret = 1; - goto out; - } - - ret = 0; - - state->loc_now->inode = inode_ref (inode); - -out: - if (inode) - inode_unref (inode); - - return ret; -} - - -static int -gf_resolve_inode (fuse_state_t *state) -{ - int ret = 0; - loc_t *loc = NULL; - - loc = state->loc_now; - - ret = resolve_inode_simple (state); - - if (ret > 0) { - loc_wipe (loc); - resolve_path_deep (state); - return 0; - } - - if (ret == 0) - resolve_loc_touchup (state); - - gf_resolve_all (state); - - return 0; -} - - -static int gf_resolve_fd (fuse_state_t *state) { gf_resolve_t *resolve = NULL; @@ -615,23 +437,15 @@ gf_resolve (fuse_state_t *state) resolve = state->resolve_now; - if (resolve->fd) { - - gf_resolve_fd (state); - - } else if (resolve->par) { + if (resolve->path) { - gf_resolve_entry (state); - - } else if (resolve->ino) { - - gf_resolve_inode (state); + resolve_path_deep (state); - } else if (resolve->path) { + } else if (resolve->fd) { - resolve_path_deep (state); + gf_resolve_fd (state); - } else { + } else { resolve->op_ret = 0; resolve->op_errno = EINVAL; |