summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/syncop-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'libglusterfs/src/syncop-utils.c')
-rw-r--r--libglusterfs/src/syncop-utils.c42
1 files changed, 36 insertions, 6 deletions
diff --git a/libglusterfs/src/syncop-utils.c b/libglusterfs/src/syncop-utils.c
index b743bdfae88..40ced03cb45 100644
--- a/libglusterfs/src/syncop-utils.c
+++ b/libglusterfs/src/syncop-utils.c
@@ -554,9 +554,20 @@ out:
return ret;
}
+/**
+ * For hard resove, it it telling posix to make use of the
+ * gfid2path extended attribute stored on disk. Otherwise
+ * posix xlator (with GFID_TO_PATH_KEY as the key) will just
+ * do a in memory inode_path to get the path. Depending upon
+ * the consumer of this function, they can choose how they want
+ * to proceed. If doing a xattr operation sounds costly, then
+ * use GFID_TO_PATH_KEY as the key for getxattr.
+ **/
+
int
-syncop_gfid_to_path (inode_table_t *itable, xlator_t *subvol, uuid_t gfid,
- char **path_p)
+syncop_gfid_to_path_hard (inode_table_t *itable, xlator_t *subvol, uuid_t gfid,
+ inode_t *inode, char **path_p,
+ gf_boolean_t hard_resolve)
{
int ret = 0;
char *path = NULL;
@@ -564,14 +575,25 @@ syncop_gfid_to_path (inode_table_t *itable, xlator_t *subvol, uuid_t gfid,
dict_t *xattr = NULL;
gf_uuid_copy (loc.gfid, gfid);
- loc.inode = inode_new (itable);
- ret = syncop_getxattr (subvol, &loc, &xattr, GFID_TO_PATH_KEY, NULL,
- NULL);
+ if (!inode)
+ loc.inode = inode_new (itable);
+ else
+ loc.inode = inode_ref (inode);
+
+ if (!hard_resolve)
+ ret = syncop_getxattr (subvol, &loc, &xattr, GFID_TO_PATH_KEY,
+ NULL, NULL);
+ else
+ ret = syncop_getxattr (subvol, &loc, &xattr,
+ GFID2PATH_VIRT_XATTR_KEY, NULL, NULL);
+
if (ret < 0)
goto out;
- ret = dict_get_str (xattr, GFID_TO_PATH_KEY, &path);
+ ret = dict_get_str (xattr, hard_resolve ?
+ GFID2PATH_VIRT_XATTR_KEY : GFID_TO_PATH_KEY,
+ &path);
if (ret || !path) {
ret = -EINVAL;
goto out;
@@ -596,6 +618,14 @@ out:
}
int
+syncop_gfid_to_path (inode_table_t *itable, xlator_t *subvol, uuid_t gfid,
+ char **path_p)
+{
+ return syncop_gfid_to_path_hard (itable, subvol, gfid, NULL, path_p,
+ _gf_false);
+}
+
+int
syncop_inode_find (xlator_t *this, xlator_t *subvol,
uuid_t gfid, inode_t **inode,
dict_t *xdata, dict_t **rsp_dict)