diff options
Diffstat (limited to 'api/src/glfs-resolve.c')
| -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) {  | 
