cluster/ec: Fix invalid config check for directories
The trusted.ec.config xattr is not defined for directories. However sometimes it could be requested because the inode type of a directory can temporarily be IA_INVAL. Requesting such xattr using the xattrop fop when it doesn't exist, returns a config value full of 0's, which is invalid and caused some fops to fail. This patch filters out this case by ignoring config xattr == 0. Change-Id: Ied51c35b313ea8c3eeae27812f9bae61d3808e92 BUG: 1293223 Signed-off-by: Xavier Hernandez <xhernandez@datalab.es> Reviewed-on: http://review.gluster.org/13446 Smoke: Gluster Build System <jenkins@build.gluster.com> CentOS-regression: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Ashish Pandey <aspandey@redhat.com> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
This commit is contained in:
parent
b1cb581424
commit
9afe93bee8
@ -15,7 +15,7 @@ EXPECT 'Created' volinfo_field $V0 'Status'
|
||||
TEST $CLI volume start $V0
|
||||
EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status'
|
||||
TEST $GFS --volfile-id=/$V0 --volfile-server=$H0 $M0
|
||||
EXPECT_WITHIN $CHILD_UP_TIMEOUT "$DISPERSE" ec_child_up_count $V0 0
|
||||
EXPECT_WITHIN $CHILD_UP_TIMEOUT "3" ec_child_up_count $V0 0
|
||||
|
||||
TEST mkdir -p $M0/test
|
||||
|
||||
|
@ -955,7 +955,8 @@ ec_prepare_update_cbk (call_frame_t *frame, void *cookie,
|
||||
|
||||
op_errno = -ec_dict_del_config(dict, EC_XATTR_CONFIG, &ctx->config);
|
||||
if (op_errno != 0) {
|
||||
if (lock->loc.inode->ia_type == IA_IFREG) {
|
||||
if ((lock->loc.inode->ia_type == IA_IFREG) ||
|
||||
(op_errno != ENODATA)) {
|
||||
gf_msg (this->name, GF_LOG_ERROR, op_errno,
|
||||
EC_MSG_CONFIG_XATTR_GET_FAIL,
|
||||
"Unable to get config xattr");
|
||||
|
@ -321,6 +321,19 @@ int32_t ec_dict_del_config(dict_t * dict, char * key, ec_config_t * config)
|
||||
}
|
||||
|
||||
data = ntoh64(*(uint64_t *)ptr);
|
||||
/* Currently we need to get the config xattr for entries of type IA_INVAL.
|
||||
* These entries can later become IA_DIR entries (after inode_link()),
|
||||
* which don't have a config xattr. However, since the xattr is requested
|
||||
* using an xattrop() fop, it will always return a config full of 0's
|
||||
* instead of saying that it doesn't exist.
|
||||
*
|
||||
* We need to filter out this case and consider that a config xattr == 0 is
|
||||
* the same than a non-existant xattr. Otherwise ec_config_check() will
|
||||
* fail.
|
||||
*/
|
||||
if (data == 0) {
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
config->version = (data >> 56) & 0xff;
|
||||
if (config->version > EC_CONFIG_VERSION)
|
||||
|
Loading…
x
Reference in New Issue
Block a user