diff options
author | Raghavendra Bhat <raghavendra@redhat.com> | 2018-11-29 12:04:45 -0500 |
---|---|---|
committer | Shyamsundar Ranganathan <srangana@redhat.com> | 2018-12-12 12:59:18 +0000 |
commit | cc0da4931533d21dbc3b9478984e24a7056dc835 (patch) | |
tree | 1c84dc64e7648104f169e96e1ba082c83227c669 | |
parent | fbdaffdb6d90409124507b3d9b15fc5d6b3ed8e6 (diff) |
features/bitrot: compare the signature with proper length
* The scrubber was comparing the checksum of the file that it
calculated (by reading the file) with the on disk signature
(stored via xattr) wrongly. It was using strlen to calculate
the signature, while the actual length of the signature is
given by the brick. Just use the actual length that the brick
provides instead of trying to calculate the signature length via
strlen API.
* In posix, gfid2path was using the same string that contains the
list of all the xattrs of file to save the value of the gfid2path
xattr as well. This causes confusion when gfid2path xattr is queried
by scrubber for getting the actual path of a corrupted file. Use
separate string to fetch the value of the xattr instead of the string
that contains the list of xattrs.
Backport of:
> Patch: https://review.gluster.org/21752/
> BUG: 1654805
> Change-Id: I2d664ab524d2b312233476cb35863dde3122e9a9
(cherry picked from commit f77fb6d568616592ab25501c402c140d15235ca9)
Change-Id: I2d664ab524d2b312233476cb35863dde3122e9a9
fixes: bz#1654370
Signed-off-by: Raghavendra Bhat <raghavendra@redhat.com>
-rw-r--r-- | xlators/features/bit-rot/src/bitd/bit-rot-scrub.c | 4 | ||||
-rw-r--r-- | xlators/storage/posix/src/posix-gfid-path.c | 18 |
2 files changed, 14 insertions, 8 deletions
diff --git a/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c b/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c index b856c168eb7..63903b0d235 100644 --- a/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c +++ b/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c @@ -130,6 +130,8 @@ bitd_scrub_post_compute_check(xlator_t *this, br_child_t *child, fd_t *fd, (void)memcpy(*signature, signptr, sizeof(br_isignature_out_t) + signlen); + (*signature)->signaturelen = signlen; + unref_dict: dict_unref(xattr); out: @@ -222,7 +224,7 @@ bitd_compare_ckum(xlator_t *this, br_isignature_out_t *sign, unsigned char *md, GF_VALIDATE_OR_GOTO(this->name, md, out); GF_VALIDATE_OR_GOTO(this->name, entry, out); - if (strncmp(sign->signature, (char *)md, strlen(sign->signature)) == 0) { + if (strncmp(sign->signature, (char *)md, sign->signaturelen) == 0) { gf_msg_debug(this->name, 0, "%s [GFID: %s | Brick: %s] " "matches calculated checksum", diff --git a/xlators/storage/posix/src/posix-gfid-path.c b/xlators/storage/posix/src/posix-gfid-path.c index 4a81be28169..de8b4d70c07 100644 --- a/xlators/storage/posix/src/posix-gfid-path.c +++ b/xlators/storage/posix/src/posix-gfid-path.c @@ -128,9 +128,7 @@ posix_get_gfid2path(xlator_t *this, inode_t *inode, const char *real_path, char keybuffer[4096] = { 0, }; - char value_buf[8192] = { - 0, - }; + uuid_t pargfid = { 0, }; @@ -161,6 +159,12 @@ posix_get_gfid2path(xlator_t *this, inode_t *inode, const char *real_path, } found = _gf_true; } else { + char value_buf[8192] = { + 0, + }; + char xattr_value[8192] = { + 0, + }; have_val = _gf_false; size = sys_llistxattr(real_path, value_buf, sizeof(value_buf) - 1); if (size > 0) { @@ -216,8 +220,8 @@ posix_get_gfid2path(xlator_t *this, inode_t *inode, const char *real_path, } found = _gf_true; - size = sys_lgetxattr(real_path, keybuffer, value_buf, - sizeof(value_buf) - 1); + size = sys_lgetxattr(real_path, keybuffer, xattr_value, + sizeof(xattr_value) - 1); if (size == -1) { ret = -1; *op_errno = errno; @@ -229,13 +233,13 @@ posix_get_gfid2path(xlator_t *this, inode_t *inode, const char *real_path, } /* Parse pargfid from xattr value*/ - strncpy(pargfid_str, value_buf, 36); + strncpy(pargfid_str, xattr_value, 36); pargfid_str[36] = '\0'; gf_uuid_parse(pargfid_str, pargfid); /* Convert pargfid to path */ ret = posix_resolve_dirgfid_to_path(pargfid, priv->base_path, - &value_buf[37], &paths[i]); + &xattr_value[37], &paths[i]); i++; ignore: |