diff options
author | Anand Avati <avati@redhat.com> | 2012-10-03 00:26:01 -0700 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2012-10-03 15:04:09 -0700 |
commit | 6c2e3e6a651e0f507e812114ada00cc5f505b4f2 (patch) | |
tree | e57fcd2978298d3208ba589df9f9d039cfebbca6 | |
parent | 43514de5c0bf498a774bb197e5ab8c0833e72b70 (diff) |
glfs-resolve: fix resolution of "/"
Change-Id: I78d63b39dde14a9a32ea197cf0dedeb5695b35c9
BUG: 839950
Signed-off-by: Anand Avati <avati@redhat.com>
Reviewed-on: http://review.gluster.org/4021
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Amar Tumballi <amarts@redhat.com>
-rw-r--r-- | api/src/glfs-resolve.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/api/src/glfs-resolve.c b/api/src/glfs-resolve.c index 181d1788875..f7754d2019b 100644 --- a/api/src/glfs-resolve.c +++ b/api/src/glfs-resolve.c @@ -109,6 +109,28 @@ out: } +void +glfs_resolve_base (struct glfs *fs, xlator_t *subvol, inode_t *inode, + struct iatt *iatt) +{ + loc_t loc = {0, }; + int ret = -1; + char *path = NULL; + + loc.inode = inode_ref (inode); + uuid_copy (loc.gfid, inode->gfid); + + ret = inode_path (loc.inode, NULL, &path); + loc.path = path; + if (ret < 0) + goto out; + + ret = syncop_lookup (subvol, &loc, NULL, iatt, NULL, NULL); +out: + loc_wipe (&loc); +} + + inode_t * glfs_resolve_component (struct glfs *fs, xlator_t *subvol, inode_t *parent, const char *component, struct iatt *iatt) @@ -208,14 +230,17 @@ glfs_resolve_at (struct glfs *fs, xlator_t *subvol, inode_t *at, } parent = NULL; - if (at && path[0] != '/') + if (at && path[0] != '/') { /* A relative resolution of a path which starts with '/' is equal to an absolute path resolution. */ inode = inode_ref (at); - else + } else { inode = inode_ref (subvol->itable->root); + glfs_resolve_base (fs, subvol, inode, &ciatt); + } + for (component = strtok_r (path, "/", &saveptr); component; component = next_component) { |