diff options
author | Anand Avati <avati@gluster.com> | 2010-11-22 10:52:51 +0000 |
---|---|---|
committer | Anand V. Avati <avati@dev.gluster.com> | 2010-11-24 00:33:35 -0800 |
commit | 7f68e386132af9e02bf37a3b4d0653de000bdefe (patch) | |
tree | 89acf2c2d3df6694a194fe0c1ae98ac283ab7075 /xlators | |
parent | f1205225417b3e0d5cf27f5ba85ccdfe0ef6b246 (diff) |
resolver: handle corner cases of handling root inode better
- changes in deep resolution and simple resolution of pure paths
to handle resolution of "/"
- warn on pure path resolution
Signed-off-by: Anand V. Avati <avati@amp.gluster.com>
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 971 (dynamic volume management)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=971
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/protocol/server/src/server-resolve.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/xlators/protocol/server/src/server-resolve.c b/xlators/protocol/server/src/server-resolve.c index ec1d6554b..4f9d97394 100644 --- a/xlators/protocol/server/src/server-resolve.c +++ b/xlators/protocol/server/src/server-resolve.c @@ -83,8 +83,17 @@ prepare_components (call_frame_t *frame) i = 1; for (trav = resolved; *trav; trav++) { if (*trav == '/') { - components[i].basename = trav + 1; *trav = 0; + + if (!(*(trav + 1))) { + /* Skip trailing "/" in a path. + This is the check which prevents + inode_link'age of itable->root + */ + break; + } + + components[i].basename = trav + 1; i++; } } @@ -238,7 +247,7 @@ resolve_path_deep (call_frame_t *frame) state = CALL_STATE (frame); resolve = state->resolve_now; - gf_log (BOUND_XL (frame)->name, GF_LOG_TRACE, + gf_log (BOUND_XL (frame)->name, GF_LOG_DEBUG, "RESOLVE %s() seeking deep resolution of %s", gf_fop_list[frame->root->op], resolve->path); @@ -268,8 +277,8 @@ resolve_path_simple (call_frame_t *frame) server_resolve_t *resolve = NULL; struct resolve_comp *components = NULL; int ret = -1; - int par_idx = 0; - int ino_idx = 0; + int par_idx = -1; + int ino_idx = -1; int i = 0; state = CALL_STATE (frame); @@ -287,11 +296,22 @@ resolve_path_simple (call_frame_t *frame) ino_idx = i; } + if (ino_idx == -1) { + resolve->op_ret = -1; + resolve->op_errno = EINVAL; + goto out; + } + + if (par_idx == -1) + /* "/" will not have a parent */ + goto noparent; + if (!components[par_idx].inode) { resolve->op_ret = -1; resolve->op_errno = ENOENT; goto out; } +noparent: if (!components[ino_idx].inode && (resolve->type == RESOLVE_MUST || resolve->type == RESOLVE_EXACT)) { @@ -540,6 +560,9 @@ server_resolve (call_frame_t *frame) } else if (resolve->path) { + gf_log (frame->this->name, GF_LOG_WARNING, + "pure path resolution for %s (%s)", + resolve->path, gf_fop_list[frame->root->op]); resolve_path_deep (frame); } else { |