summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src
diff options
context:
space:
mode:
authorRaghavendra Bhat <raghavendra@redhat.com>2018-04-20 14:54:33 -0400
committerAmar Tumballi <amarts@redhat.com>2018-05-04 11:13:57 +0000
commitb42a048d3a76c7f377399f18d30f0a8a930f9d05 (patch)
treeb400225db569fdd1b3251105024bec73690da175 /libglusterfs/src
parentbef654f48c14bfd7ce20702edff41052f6f54bdc (diff)
features/bitrot: print the path of the corrupted objects
Currently "gluster volume bitrot <volume name> scrub status" gives the list of the corrupted objects (files as of now). But only the gfids of those corrupted objects are seen and one has to do getfattr, find etc operations to get the actual path of those objects for removal etc. This change makes an attempt to print the path of those files as much as possible. * Try to get the path using the on disk gfid2path xattr. * If the above operation fails, then go for in memory path (provided that the object has its dentry properly created and linked in the inode table of the brick where the corrupted object is present) So the gfid to path resolution is a soft resolution, i.e. based on the inode and dentry cache in the brick's memory. If the path cannot be obtained via inode table also, then only gfid is printed. Change-Id: Ie9a30307f43a49a2a9225821803c7d40d231de68 fixes: bz#1570962 Signed-off-by: Raghavendra Bhat <raghavendra@redhat.com>
Diffstat (limited to 'libglusterfs/src')
-rw-r--r--libglusterfs/src/libglusterfs.sym1
-rw-r--r--libglusterfs/src/syncop-utils.c42
-rw-r--r--libglusterfs/src/syncop-utils.h5
3 files changed, 42 insertions, 6 deletions
diff --git a/libglusterfs/src/libglusterfs.sym b/libglusterfs/src/libglusterfs.sym
index d2d25838647..8b2567a4c62 100644
--- a/libglusterfs/src/libglusterfs.sym
+++ b/libglusterfs/src/libglusterfs.sym
@@ -944,6 +944,7 @@ syncop_fxattrop
syncop_getactivelk
syncop_getxattr
syncop_gfid_to_path
+syncop_gfid_to_path_hard
syncop_inode_find
syncop_inodelk
syncop_entrylk
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)
diff --git a/libglusterfs/src/syncop-utils.h b/libglusterfs/src/syncop-utils.h
index 4761371c120..97b35046780 100644
--- a/libglusterfs/src/syncop-utils.h
+++ b/libglusterfs/src/syncop-utils.h
@@ -47,4 +47,9 @@ int
syncop_inode_find (xlator_t *this, xlator_t *subvol,
uuid_t gfid, inode_t **inode,
dict_t *xdata, dict_t **rsp_dict);
+
+int
+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);
#endif /* _SYNCOP_H */