diff options
-rw-r--r-- | api/src/glfs-internal.h | 1 | ||||
-rw-r--r-- | api/src/glfs-resolve.c | 36 |
2 files changed, 35 insertions, 2 deletions
diff --git a/api/src/glfs-internal.h b/api/src/glfs-internal.h index 6b964b57304..14268f4b3b2 100644 --- a/api/src/glfs-internal.h +++ b/api/src/glfs-internal.h @@ -363,6 +363,7 @@ int __glfs_cwd_set (struct glfs *fs, inode_t *inode); int glfs_resolve_base (struct glfs *fs, xlator_t *subvol, inode_t *inode, struct iatt *iatt); + int glfs_resolve_at (struct glfs *fs, xlator_t *subvol, inode_t *at, const char *origpath, loc_t *loc, struct iatt *iatt, int follow, int reval) diff --git a/api/src/glfs-resolve.c b/api/src/glfs-resolve.c index a2be87f1c1e..44d013ce0bc 100644 --- a/api/src/glfs-resolve.c +++ b/api/src/glfs-resolve.c @@ -227,7 +227,39 @@ out: return ret; } +/* + * This function can be used to call named lookup on root. + * If you use glfs_resolve_base, that will be a nameless lookup. + */ +static int +glfs_resolve_root (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); + + ret = inode_path (loc.inode, NULL, &path); + loc.path = path; + loc.name = ""; + /* Having a value in loc.name will help to bypass md-cache check for + * nameless lookup. + * TODO: Re-visit on nameless lookup and md-cache. + * Github issue : https://github.com/gluster/glusterfs/issues/232 + */ + loc.parent = inode_ref (inode); + if (ret < 0) + goto out; + ret = syncop_lookup (subvol, &loc, iatt, NULL, NULL, NULL); + DECODE_SYNCOP_ERR (ret); +out: + loc_wipe (&loc); + + return ret; +} inode_t * glfs_resolve_component (struct glfs *fs, xlator_t *subvol, inode_t *parent, @@ -255,7 +287,7 @@ glfs_resolve_component (struct glfs *fs, xlator_t *subvol, inode_t *parent, if (!force_lookup) { inode = inode_ref (parent); } else { - ret = glfs_resolve_base (fs, subvol, parent, &ciatt); + ret = glfs_resolve_root (fs, subvol, parent, &ciatt); if (!ret) inode = inode_ref (parent); } @@ -398,7 +430,7 @@ priv_glfs_resolve_at (struct glfs *fs, xlator_t *subvol, inode_t *at, inode = inode_ref (subvol->itable->root); if (strcmp (path, "/") == 0) - glfs_resolve_base (fs, subvol, inode, &ciatt); + glfs_resolve_root (fs, subvol, inode, &ciatt); } for (component = strtok_r (path, "/", &saveptr); |