diff options
-rw-r--r-- | xlators/cluster/ec/src/ec-common.c | 47 | ||||
-rw-r--r-- | xlators/cluster/ec/src/ec-data.h | 8 | ||||
-rw-r--r-- | xlators/cluster/ec/src/ec-dir-write.c | 14 | ||||
-rw-r--r-- | xlators/cluster/ec/src/ec-generic.c | 6 | ||||
-rw-r--r-- | xlators/cluster/ec/src/ec-heal.c | 6 | ||||
-rw-r--r-- | xlators/cluster/ec/src/ec-helpers.c | 46 | ||||
-rw-r--r-- | xlators/cluster/ec/src/ec-helpers.h | 4 | ||||
-rw-r--r-- | xlators/cluster/ec/src/ec.h | 2 |
8 files changed, 104 insertions, 29 deletions
diff --git a/xlators/cluster/ec/src/ec-common.c b/xlators/cluster/ec/src/ec-common.c index 897dbe830ab..5422944cfef 100644 --- a/xlators/cluster/ec/src/ec-common.c +++ b/xlators/cluster/ec/src/ec-common.c @@ -1022,7 +1022,8 @@ int32_t ec_get_size_version_set(call_frame_t * frame, void * cookie, if (ctx != NULL) { if (ctx->inode_lock != NULL) { lock = ctx->inode_lock; - lock->version = fop->answer->version; + lock->version[0] = fop->answer->version[0]; + lock->version[1] = fop->answer->version[1]; if (buf->ia_type == IA_IFREG) { lock->have_size = 1; @@ -1031,7 +1032,8 @@ int32_t ec_get_size_version_set(call_frame_t * frame, void * cookie, } if (ctx->entry_lock != NULL) { lock = ctx->entry_lock; - lock->version = fop->answer->version; + lock->version[0] = fop->answer->version[0]; + lock->version[1] = fop->answer->version[1]; } } @@ -1084,7 +1086,7 @@ ec_prepare_update_cbk (call_frame_t *frame, void *cookie, ec_fop_data_t *fop = cookie, *parent; ec_lock_t *lock = NULL; uint64_t size = 0; - uint64_t version = 0; + uint64_t version[EC_VERSION_SIZE] = {0, 0}; if (op_ret >= 0) { parent = fop->parent; @@ -1106,9 +1108,10 @@ ec_prepare_update_cbk (call_frame_t *frame, void *cookie, } } - if (ec_dict_del_number(dict, EC_XATTR_VERSION, &version) != 0) { - ec_fop_set_error(fop, EIO); - return 0; + if (ec_dict_del_array(dict, EC_XATTR_VERSION, version, + EC_VERSION_SIZE) != 0) { + ec_fop_set_error(fop, EIO); + return 0; } LOCK(&lock->loc.inode->lock); @@ -1118,7 +1121,8 @@ ec_prepare_update_cbk (call_frame_t *frame, void *cookie, fop->parent->pre_size = fop->parent->post_size = size; fop->parent->have_size = lock->have_size = 1; } - lock->version = version; + lock->version[0] = version[0]; + lock->version[1] = version[1]; UNLOCK(&lock->loc.inode->lock); @@ -1143,6 +1147,7 @@ void ec_get_size_version(ec_fop_data_t * fop) uid_t uid; gid_t gid; int32_t error = ENOMEM; + uint64_t version[EC_VERSION_SIZE] = {0, 0}; if (fop->have_size) { @@ -1171,7 +1176,8 @@ void ec_get_size_version(ec_fop_data_t * fop) { goto out; } - if ((ec_dict_set_number(xdata, EC_XATTR_VERSION, 0) != 0) || + if ((ec_dict_set_array(xdata, EC_XATTR_VERSION, + version, EC_VERSION_SIZE) != 0) || (ec_dict_set_number(xdata, EC_XATTR_SIZE, 0) != 0) || (ec_dict_set_number(xdata, EC_XATTR_CONFIG, 0) != 0) || (ec_dict_set_number(xdata, EC_XATTR_DIRTY, 0) != 0)) @@ -1240,6 +1246,7 @@ void ec_prepare_update(ec_fop_data_t *fop) ec_lock_t *lock; uid_t uid; gid_t gid; + uint64_t version[2] = {0, 0}; int32_t error = ENOMEM; tmp = fop; @@ -1266,7 +1273,8 @@ void ec_prepare_update(ec_fop_data_t *fop) if (xdata == NULL) { goto out; } - if ((ec_dict_set_number(xdata, EC_XATTR_VERSION, 0) != 0) || + if ((ec_dict_set_array(xdata, EC_XATTR_VERSION, + version, EC_VERSION_SIZE) != 0) || (ec_dict_set_number(xdata, EC_XATTR_SIZE, 0) != 0) || (ec_dict_set_number(xdata, EC_XATTR_CONFIG, 0) != 0) || (ec_dict_set_number(xdata, EC_XATTR_DIRTY, 1) != 0)) { @@ -1383,7 +1391,7 @@ int32_t ec_update_size_version_done(call_frame_t * frame, void * cookie, return 0; } -void ec_update_size_version(ec_fop_data_t *fop, loc_t *loc, uint64_t version, +void ec_update_size_version(ec_fop_data_t *fop, loc_t *loc, uint64_t version[2], uint64_t size, gf_boolean_t dirty, ec_lock_t *lock) { dict_t * dict; @@ -1406,8 +1414,9 @@ void ec_update_size_version(ec_fop_data_t *fop, loc_t *loc, uint64_t version, goto out; } - if (version != 0) { - if (ec_dict_set_number(dict, EC_XATTR_VERSION, version) != 0) { + if (version[0] != 0 || version[1] != 0) { + if (ec_dict_set_array(dict, EC_XATTR_VERSION, + version, EC_VERSION_SIZE) != 0) { goto out; } } @@ -1568,7 +1577,7 @@ void ec_unlock(ec_fop_data_t *fop) void ec_flush_size_version(ec_fop_data_t * fop) { ec_lock_t * lock; - uint64_t version, delta; + uint64_t version[2], delta; GF_ASSERT(fop->lock_count == 1); @@ -1578,9 +1587,11 @@ void ec_flush_size_version(ec_fop_data_t * fop) GF_ASSERT(lock->owner == fop); - version = lock->version_delta; + version[0] = lock->version_delta[0]; + version[1] = lock->version_delta[1]; delta = lock->size_delta; - lock->version_delta = 0; + lock->version_delta[0] = 0; + lock->version_delta[1] = 0; lock->size_delta = 0; UNLOCK(&lock->loc.inode->lock); @@ -1615,7 +1626,11 @@ void ec_lock_reuse(ec_fop_data_t *fop) if (((fop->locks_update >> i) & 1) != 0) { if (fop->error == 0) { - lock->version_delta++; + if (fop->id == GF_FOP_SETXATTR || fop->id == GF_FOP_SETATTR) { + lock->version_delta[1]++; + } else { + lock->version_delta[0]++; + } lock->size_delta += fop->post_size - fop->pre_size; if (fop->have_size) { lock->size = fop->post_size; diff --git a/xlators/cluster/ec/src/ec-data.h b/xlators/cluster/ec/src/ec-data.h index 80936aeaada..85037f62bb4 100644 --- a/xlators/cluster/ec/src/ec-data.h +++ b/xlators/cluster/ec/src/ec-data.h @@ -143,8 +143,8 @@ struct _ec_lock int32_t have_size; uint64_t size; uint64_t size_delta; - uint64_t version; - uint64_t version_delta; + uint64_t version[2]; + uint64_t version_delta[2]; ec_fop_data_t *owner; loc_t loc; union @@ -249,7 +249,7 @@ struct _ec_cbk_data int32_t int32; uintptr_t uintptr[3]; uint64_t size; - uint64_t version; + uint64_t version[2]; inode_t * inode; fd_t * fd; struct statvfs statvfs; @@ -282,7 +282,7 @@ struct _ec_heal uintptr_t fixed; uint64_t offset; uint64_t size; - uint64_t version; + uint64_t version[2]; uint64_t raw_size; }; diff --git a/xlators/cluster/ec/src/ec-dir-write.c b/xlators/cluster/ec/src/ec-dir-write.c index 866f5120bf6..ffc96bf4351 100644 --- a/xlators/cluster/ec/src/ec-dir-write.c +++ b/xlators/cluster/ec/src/ec-dir-write.c @@ -103,6 +103,7 @@ int32_t ec_manager_create(ec_fop_data_t * fop, int32_t state) ec_t * ec; ec_cbk_data_t * cbk; ec_fd_t * ctx; + uint64_t version[2] = {0, 0}; switch (state) { @@ -151,7 +152,8 @@ int32_t ec_manager_create(ec_fop_data_t * fop, int32_t state) return EC_STATE_REPORT; } - if (ec_dict_set_number(fop->xdata, EC_XATTR_VERSION, 0) != 0) { + if (ec_dict_set_array(fop->xdata, EC_XATTR_VERSION, + version, EC_VERSION_SIZE) != 0) { fop->error = EIO; return EC_STATE_REPORT; @@ -565,7 +567,7 @@ void ec_wind_mkdir(ec_t * ec, ec_fop_data_t * fop, int32_t idx) int32_t ec_manager_mkdir(ec_fop_data_t * fop, int32_t state) { ec_cbk_data_t * cbk; - + uint64_t version[2] = {0, 0}; switch (state) { case EC_STATE_INIT: @@ -578,9 +580,9 @@ int32_t ec_manager_mkdir(ec_fop_data_t * fop, int32_t state) } } - if (ec_dict_set_number(fop->xdata, EC_XATTR_VERSION, 0) != 0) { + if (ec_dict_set_array(fop->xdata, EC_XATTR_VERSION, + version, EC_VERSION_SIZE) != 0) { fop->error = EIO; - return EC_STATE_REPORT; } @@ -764,6 +766,7 @@ int32_t ec_manager_mknod(ec_fop_data_t * fop, int32_t state) { ec_t *ec; ec_cbk_data_t * cbk; + uint64_t version[2] = {0, 0}; switch (state) { @@ -794,7 +797,8 @@ int32_t ec_manager_mknod(ec_fop_data_t * fop, int32_t state) return EC_STATE_REPORT; } - if (ec_dict_set_number(fop->xdata, EC_XATTR_VERSION, 0) != 0) { + if (ec_dict_set_array(fop->xdata, EC_XATTR_VERSION, + version, EC_VERSION_SIZE) != 0) { fop->error = EIO; return EC_STATE_REPORT; diff --git a/xlators/cluster/ec/src/ec-generic.c b/xlators/cluster/ec/src/ec-generic.c index fdab9ec2ae9..4cf5a50ecbd 100644 --- a/xlators/cluster/ec/src/ec-generic.c +++ b/xlators/cluster/ec/src/ec-generic.c @@ -717,7 +717,8 @@ void ec_lookup_rebuild(ec_t * ec, ec_fop_data_t * fop, ec_cbk_data_t * cbk) return; } - ec_dict_del_number(cbk->xdata, EC_XATTR_VERSION, &cbk->version); + ec_dict_del_array(cbk->xdata, EC_XATTR_VERSION, + cbk->version, EC_VERSION_SIZE); if (ec_loc_update(fop->xl, &fop->loc[0], cbk->inode, &cbk->iatt[0]) != 0) { cbk->op_ret = -1; @@ -732,7 +733,8 @@ void ec_lookup_rebuild(ec_t * ec, ec_fop_data_t * fop, ec_cbk_data_t * cbk) if ((ctx != NULL) && (ctx->inode_lock != NULL)) { lock = ctx->inode_lock; - cbk->version = lock->version; + cbk->version[0] = lock->version[0]; + cbk->version[1] = lock->version[1]; if (lock->have_size) { size = lock->size; diff --git a/xlators/cluster/ec/src/ec-heal.c b/xlators/cluster/ec/src/ec-heal.c index b8560005b94..6148df904a4 100644 --- a/xlators/cluster/ec/src/ec-heal.c +++ b/xlators/cluster/ec/src/ec-heal.c @@ -79,7 +79,8 @@ void ec_heal_lookup_resume(ec_fop_data_t * fop) if (cbk->op_ret >= 0) { heal->iatt = cbk->iatt[0]; - heal->version = cbk->version; + heal->version[0] = cbk->version[0]; + heal->version[1] = cbk->version[1]; heal->raw_size = cbk->size; heal->fop->pre_size = cbk->iatt[0].ia_size; heal->fop->post_size = cbk->iatt[0].ia_size; @@ -856,7 +857,8 @@ void ec_heal_setxattr_others(ec_heal_t * heal) if ((cbk->iatt[0].ia_type == IA_IFREG) || (cbk->iatt[0].ia_type == IA_IFDIR)) { - if (ec_dict_set_number(xdata, EC_XATTR_VERSION, cbk->version) != 0) + if (ec_dict_set_array(xdata, EC_XATTR_VERSION, + cbk->version, EC_VERSION_SIZE) != 0) { goto out; } diff --git a/xlators/cluster/ec/src/ec-helpers.c b/xlators/cluster/ec/src/ec-helpers.c index 65deba63959..e9d842fcfa9 100644 --- a/xlators/cluster/ec/src/ec-helpers.c +++ b/xlators/cluster/ec/src/ec-helpers.c @@ -157,6 +157,52 @@ size_t ec_iov_copy_to(void * dst, struct iovec * vector, int32_t count, return total; } +int32_t ec_dict_set_array(dict_t *dict, char *key, uint64_t value[], + int32_t size) +{ + uint64_t *ptr = NULL; + int32_t vindex; + if (value == NULL) + return -1; + ptr = GF_MALLOC(sizeof(uint64_t) * size, gf_common_mt_char); + if (ptr == NULL) { + return -1; + } + for (vindex = 0; vindex < size; vindex++) { + ptr[vindex] = hton64(value[vindex]); + } + return dict_set_bin(dict, key, ptr, sizeof(uint64_t) * size); +} + + +int32_t ec_dict_del_array(dict_t *dict, char *key, uint64_t value[], + int32_t size) +{ + void *ptr; + int32_t len; + int32_t vindex; + + if ((dict == NULL) || (dict_get_ptr_and_len(dict, key, &ptr, &len) != 0)) { + return -1; + } + + if (len > (size * sizeof(uint64_t)) || + (len % sizeof (uint64_t))) + return -1; + + memset (value, 0, size * sizeof(uint64_t)); + /* 3.6 version ec would have stored version in 64 bit. In that case treat + * metadata versions as 0*/ + size = min (size, len/sizeof(uint64_t)); + for (vindex = 0; vindex < size; vindex++) { + value[vindex] = ntoh64(*((uint64_t *)ptr + vindex)); + } + dict_del(dict, key); + + return 0; +} + + int32_t ec_dict_set_number(dict_t * dict, char * key, uint64_t value) { uint64_t * ptr; diff --git a/xlators/cluster/ec/src/ec-helpers.h b/xlators/cluster/ec/src/ec-helpers.h index 11d2707b3c0..df4495138fe 100644 --- a/xlators/cluster/ec/src/ec-helpers.h +++ b/xlators/cluster/ec/src/ec-helpers.h @@ -22,6 +22,10 @@ int32_t ec_bits_consume(uint64_t * n); size_t ec_iov_copy_to(void * dst, struct iovec * vector, int32_t count, off_t offset, size_t size); +int32_t ec_dict_set_array(dict_t *dict, char *key, + uint64_t *value, int32_t size); +int32_t ec_dict_del_array(dict_t *dict, char *key, + uint64_t *value, int32_t size); int32_t ec_dict_set_number(dict_t * dict, char * key, uint64_t value); int32_t ec_dict_del_number(dict_t * dict, char * key, uint64_t * value); int32_t ec_dict_set_config(dict_t * dict, char * key, ec_config_t * config); diff --git a/xlators/cluster/ec/src/ec.h b/xlators/cluster/ec/src/ec.h index 54c13077993..b8f3e288197 100644 --- a/xlators/cluster/ec/src/ec.h +++ b/xlators/cluster/ec/src/ec.h @@ -23,6 +23,8 @@ #define EC_XATTR_HEAL EC_XATTR_PREFIX"heal" #define EC_XATTR_DIRTY EC_XATTR_PREFIX"dirty" +#define EC_VERSION_SIZE 2 + struct _ec { xlator_t * xl; |