diff options
author | Raghavendra Bhat <raghavendra@redhat.com> | 2018-04-20 14:54:33 -0400 |
---|---|---|
committer | Amar Tumballi <amarts@redhat.com> | 2018-05-04 11:13:57 +0000 |
commit | b42a048d3a76c7f377399f18d30f0a8a930f9d05 (patch) | |
tree | b400225db569fdd1b3251105024bec73690da175 /libglusterfs | |
parent | bef654f48c14bfd7ce20702edff41052f6f54bdc (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')
-rw-r--r-- | libglusterfs/src/libglusterfs.sym | 1 | ||||
-rw-r--r-- | libglusterfs/src/syncop-utils.c | 42 | ||||
-rw-r--r-- | libglusterfs/src/syncop-utils.h | 5 |
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 */ |