diff options
-rw-r--r-- | api/src/glfs-resolve.c | 29 | ||||
-rw-r--r-- | libglusterfs/src/xlator.c | 33 | ||||
-rw-r--r-- | libglusterfs/src/xlator.h | 3 | ||||
-rw-r--r-- | xlators/mount/fuse/src/fuse-resolve.c | 18 | ||||
-rw-r--r-- | xlators/protocol/server/src/server-resolve.c | 14 |
5 files changed, 45 insertions, 52 deletions
diff --git a/api/src/glfs-resolve.c b/api/src/glfs-resolve.c index 9aeac57b75e..3c69d78e487 100644 --- a/api/src/glfs-resolve.c +++ b/api/src/glfs-resolve.c @@ -139,30 +139,15 @@ __glfs_refresh_inode (struct glfs *fs, xlator_t *subvol, inode_t *inode) int priv_glfs_loc_touchup (loc_t *loc) { - char *path = NULL; - int ret = -1; - char *bn = NULL; + int ret = 0; - if (loc->parent) - ret = inode_path (loc->parent, loc->name, &path); - else - ret = inode_path (loc->inode, 0, &path); - - loc->path = path; - - if (ret < 0 || !path) { - ret = -1; - errno = ENOMEM; - goto out; - } + ret = loc_touchup (loc, loc->name); + if (ret < 0) { + errno = -ret; + ret = -1; + } - bn = strrchr (path, '/'); - if (bn) - bn++; - loc->name = bn; - ret = 0; -out: - return ret; + return ret; } GFAPI_SYMVER_PRIVATE_DEFAULT(glfs_loc_touchup, 3.4.0); diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index 3378a35d54a..23cf89af026 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -735,6 +735,39 @@ loc_gfid_utoa (loc_t *loc) } int +loc_touchup (loc_t *loc, const char *name) +{ + char *path = NULL; + int ret = 0; + + if (loc->path) + goto out; + + if (loc->parent && name && strlen (name)) { + ret = inode_path (loc->parent, name, &path); + if (path) /*Guaranteed to have trailing '/' */ + loc->name = strrchr (path, '/') + 1; + + if (uuid_is_null (loc->pargfid)) + uuid_copy (loc->pargfid, loc->parent->gfid); + } else if (loc->inode) { + ret = inode_path (loc->inode, 0, &path); + if (uuid_is_null (loc->gfid)) + uuid_copy (loc->gfid, loc->inode->gfid); + } + + if (ret < 0 || !path) { + ret = -ENOMEM; + goto out; + } + + loc->path = path; + ret = 0; +out: + return ret; +} + +int loc_copy_overload_parent (loc_t *dst, loc_t *src, inode_t *parent) { int ret = -1; diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h index c1813abe6a2..8e52bbb3010 100644 --- a/libglusterfs/src/xlator.h +++ b/libglusterfs/src/xlator.h @@ -964,4 +964,7 @@ is_graph_topology_equal (glusterfs_graph_t *graph1, glusterfs_graph_t *graph2); int glusterfs_volfile_reconfigure (int oldvollen, FILE *newvolfile_fp, glusterfs_ctx_t *ctx, const char *oldvolfile); + +int +loc_touchup (loc_t *loc, const char *name); #endif /* _XLATOR_H */ diff --git a/xlators/mount/fuse/src/fuse-resolve.c b/xlators/mount/fuse/src/fuse-resolve.c index 25abe162e6c..5aaa32ea660 100644 --- a/xlators/mount/fuse/src/fuse-resolve.c +++ b/xlators/mount/fuse/src/fuse-resolve.c @@ -33,27 +33,11 @@ fuse_resolve_loc_touchup (fuse_state_t *state) { fuse_resolve_t *resolve = NULL; loc_t *loc = NULL; - char *path = NULL; - int ret = 0; resolve = state->resolve_now; loc = state->loc_now; - if (!loc->path) { - if (loc->parent && resolve->bname) { - ret = inode_path (loc->parent, resolve->bname, &path); - uuid_copy (loc->pargfid, loc->parent->gfid); - loc->name = resolve->bname; - } else if (loc->inode) { - ret = inode_path (loc->inode, NULL, &path); - uuid_copy (loc->gfid, loc->inode->gfid); - } - if (ret) - gf_log (THIS->name, GF_LOG_TRACE, - "return value inode_path %d", ret); - loc->path = path; - } - + loc_touchup (loc, resolve->bname); return 0; } diff --git a/xlators/protocol/server/src/server-resolve.c b/xlators/protocol/server/src/server-resolve.c index 3b787c61734..9528259970a 100644 --- a/xlators/protocol/server/src/server-resolve.c +++ b/xlators/protocol/server/src/server-resolve.c @@ -42,19 +42,7 @@ resolve_loc_touchup (call_frame_t *frame) resolve = state->resolve_now; loc = state->loc_now; - if (!loc->path) { - if (loc->parent && resolve->bname) { - ret = inode_path (loc->parent, resolve->bname, &path); - loc->name = resolve->bname; - } else if (loc->inode) { - ret = inode_path (loc->inode, NULL, &path); - } - if (ret) - gf_log (frame->this->name, GF_LOG_TRACE, - "return value inode_path %d", ret); - loc->path = path; - } - + loc_touchup (loc, resolve->bname); return 0; } |