summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xtests/basic/ec/quota.t2
-rw-r--r--xlators/cluster/ec/src/ec-common.c3
-rw-r--r--xlators/cluster/ec/src/ec-helpers.c13
3 files changed, 16 insertions, 2 deletions
diff --git a/tests/basic/ec/quota.t b/tests/basic/ec/quota.t
index f093085bde0..b023240b87e 100755
--- a/tests/basic/ec/quota.t
+++ b/tests/basic/ec/quota.t
@@ -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
diff --git a/xlators/cluster/ec/src/ec-common.c b/xlators/cluster/ec/src/ec-common.c
index bfb2294017d..8c6ff78c27e 100644
--- a/xlators/cluster/ec/src/ec-common.c
+++ b/xlators/cluster/ec/src/ec-common.c
@@ -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");
diff --git a/xlators/cluster/ec/src/ec-helpers.c b/xlators/cluster/ec/src/ec-helpers.c
index d05c74e6724..28641cec5f7 100644
--- a/xlators/cluster/ec/src/ec-helpers.c
+++ b/xlators/cluster/ec/src/ec-helpers.c
@@ -307,6 +307,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)