diff options
| author | Kevin Vigor <kvigor@fb.com> | 2017-01-23 10:27:52 -0800 |
|---|---|---|
| committer | Kevin Vigor <kvigor@fb.com> | 2017-01-23 10:27:52 -0800 |
| commit | f80281c05e3f1c0ead5910586c7e81f047add623 (patch) | |
| tree | f58cac77acef73cfdf14d420bd10613ad3dc1850 /xlators/cluster | |
| parent | 6f6a21f1bbc5131e70b42d89a5ac8d8aa709ad3f (diff) | |
| parent | b21c51e6f0baa5145923637f54e79d221ca59cff (diff) | |
Merge remote-tracking branch 'origin/release-3.8' into merge-3.8
Change-Id: Ie6c73dee0b6798af4a69c43c0b03c3d02ff36aa2
Diffstat (limited to 'xlators/cluster')
| -rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 24 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-dir-write.c | 6 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-read-txn.c | 26 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-transaction.c | 8 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr.h | 18 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-inode-read.c | 11 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-rename.c | 1 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-common.c | 21 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-common.h | 2 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-dir-write.c | 26 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-fops.h | 16 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-heal.c | 9 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-helpers.c | 5 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-locks.c | 24 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec.c | 8 |
15 files changed, 105 insertions, 100 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index 0f878a9be86..fb3318da36a 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -131,6 +131,7 @@ __afr_inode_ctx_get (xlator_t *this, inode_t *inode, afr_inode_ctx_t **ctx) out: return ret; } + /* * INODE CTX 64-bit VALUE FORMAT FOR SMALL (<= 16) SUBVOL COUNTS: * @@ -192,10 +193,7 @@ __afr_set_in_flight_sb_status (xlator_t *this, afr_local_t *local, metadatamap_old = metadatamap = (val & 0x000000000000ffff); datamap_old = datamap = (val & 0x00000000ffff0000) >> 16; - /* Hard-code event to 0 since there is a failure and the inode - * needs to be refreshed anyway. - */ - event = 0; + event = (val & 0xffffffff00000000) >> 32; if (txn_type == AFR_DATA_TRANSACTION) tmp_map = datamap; @@ -228,6 +226,8 @@ __afr_set_in_flight_sb_status (xlator_t *this, afr_local_t *local, local->transaction.in_flight_sb = _gf_true; metadatamap |= (1 << index); } + if (metadatamap_old != metadatamap) + event = 0; break; case AFR_DATA_TRANSACTION: @@ -237,10 +237,12 @@ __afr_set_in_flight_sb_status (xlator_t *this, afr_local_t *local, local->transaction.in_flight_sb = _gf_true; datamap |= (1 << index); } + if (datamap_old != datamap) + event = 0; break; default: - break; + break; } val = ((uint64_t) metadatamap) | @@ -351,7 +353,7 @@ out: } int -__afr_inode_read_subvol_reset_small (inode_t *inode, xlator_t *this) +__afr_inode_event_gen_reset_small (inode_t *inode, xlator_t *this) { int ret = -1; uint16_t datamap = 0; @@ -452,7 +454,7 @@ out: } int -__afr_inode_read_subvol_reset (inode_t *inode, xlator_t *this) +__afr_inode_event_gen_reset (inode_t *inode, xlator_t *this) { afr_private_t *priv = NULL; int ret = -1; @@ -460,7 +462,7 @@ __afr_inode_read_subvol_reset (inode_t *inode, xlator_t *this) priv = this->private; if (priv->child_count <= 16) - ret = __afr_inode_read_subvol_reset_small (inode, this); + ret = __afr_inode_event_gen_reset_small (inode, this); else ret = -1; @@ -593,7 +595,7 @@ out: int -afr_inode_read_subvol_reset (inode_t *inode, xlator_t *this) +afr_inode_event_gen_reset (inode_t *inode, xlator_t *this) { int ret = -1; @@ -601,7 +603,7 @@ afr_inode_read_subvol_reset (inode_t *inode, xlator_t *this) LOCK(&inode->lock); { - ret = __afr_inode_read_subvol_reset (inode, this); + ret = __afr_inode_event_gen_reset (inode, this); } UNLOCK(&inode->lock); out: @@ -2086,7 +2088,7 @@ afr_lookup_done (call_frame_t *frame, xlator_t *this) if (afr_replies_interpret (frame, this, local->inode, NULL)) { read_subvol = afr_read_subvol_decide (local->inode, this, &args); - afr_inode_read_subvol_reset (local->inode, this); + afr_inode_event_gen_reset (local->inode, this); goto cant_interpret; } else { read_subvol = afr_data_subvol_get (local->inode, this, diff --git a/xlators/cluster/afr/src/afr-dir-write.c b/xlators/cluster/afr/src/afr-dir-write.c index 286a5392da6..8e483c382c4 100644 --- a/xlators/cluster/afr/src/afr-dir-write.c +++ b/xlators/cluster/afr/src/afr-dir-write.c @@ -122,12 +122,12 @@ __afr_dir_write_finalize (call_frame_t *frame, xlator_t *this) continue; if (local->replies[i].op_ret < 0) { if (local->inode) - afr_inode_read_subvol_reset (local->inode, this); + afr_inode_event_gen_reset (local->inode, this); if (local->parent) - afr_inode_read_subvol_reset (local->parent, + afr_inode_event_gen_reset (local->parent, this); if (local->parent2) - afr_inode_read_subvol_reset (local->parent2, + afr_inode_event_gen_reset (local->parent2, this); continue; } diff --git a/xlators/cluster/afr/src/afr-read-txn.c b/xlators/cluster/afr/src/afr-read-txn.c index 926f7c4dc47..2390764bccd 100644 --- a/xlators/cluster/afr/src/afr-read-txn.c +++ b/xlators/cluster/afr/src/afr-read-txn.c @@ -48,17 +48,6 @@ afr_read_txn_next_subvol (call_frame_t *frame, xlator_t *this) return 0; } -#define AFR_READ_TXN_SET_ERROR_AND_GOTO(ret, errnum, index, label) \ - do { \ - local->op_ret = ret; \ - local->op_errno = errnum; \ - read_subvol = index; \ - gf_msg (this->name, GF_LOG_ERROR, EIO, AFR_MSG_SPLIT_BRAIN,\ - "Failing %s on gfid %s: split-brain observed.",\ - gf_fop_list[local->op], uuid_utoa (inode->gfid));\ - goto label; \ - } while (0) - int afr_read_txn_refresh_done (call_frame_t *frame, xlator_t *this, int err) { @@ -72,19 +61,16 @@ afr_read_txn_refresh_done (call_frame_t *frame, xlator_t *this, int err) inode = local->inode; if (err) { - local->op_errno = -err; - local->op_ret = -1; read_subvol = -1; - gf_msg (this->name, GF_LOG_ERROR, EIO, AFR_MSG_SPLIT_BRAIN, - "Failing %s on gfid %s: split-brain observed.", - gf_fop_list[local->op], uuid_utoa (inode->gfid)); goto readfn; } read_subvol = afr_read_subvol_select_by_policy (inode, this, local->readable, NULL); - if (read_subvol == -1) - AFR_READ_TXN_SET_ERROR_AND_GOTO (-1, EIO, -1, readfn); + if (read_subvol == -1) { + err = -EIO; + goto readfn; + } if (local->read_attempted[read_subvol]) { afr_read_txn_next_subvol (frame, this); @@ -99,6 +85,10 @@ readfn: if ((ret == 0) && spb_choice >= 0) read_subvol = spb_choice; } + + if (read_subvol == -1) { + AFR_SET_ERROR_AND_CHECK_SPLIT_BRAIN (-1, -err); + } local->readfn (frame, this, read_subvol); return 0; diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index 9cb735ea7fa..8178fc0d18b 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -2255,15 +2255,9 @@ int afr_write_txn_refresh_done (call_frame_t *frame, xlator_t *this, int err) { afr_local_t *local = frame->local; - afr_private_t *priv = this->private; - int ret = 0; if (err) { - local->op_errno = -err; - local->op_ret = -1; - gf_msg (this->name, GF_LOG_ERROR, -ret, AFR_MSG_SPLIT_BRAIN, - "Failing %s on gfid %s: split-brain observed.", - gf_fop_list[local->op], uuid_utoa (local->inode->gfid)); + AFR_SET_ERROR_AND_CHECK_SPLIT_BRAIN(-1, -err); goto fail; } diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index bbfa309b868..aa19f1eeb37 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -54,6 +54,18 @@ typedef int (*afr_changelog_resume_t) (call_frame_t *frame, xlator_t *this); #define AFR_CMP(a1,a2,len) ({int __cmp = 0; int __i; for (__i = 0; __i < len; __i++) if (a1[__i] != a2[__i]) { __cmp = 1; break;} __cmp;}) #define AFR_IS_ARBITER_BRICK(priv, index) ((priv->arbiter_count == 1) && (index == ARBITER_BRICK_INDEX)) +#define AFR_SET_ERROR_AND_CHECK_SPLIT_BRAIN(ret, errnum) \ + do { \ + local->op_ret = ret; \ + local->op_errno = errnum; \ + if (local->op_errno == EIO) \ + gf_msg (this->name, GF_LOG_ERROR, local->op_errno, \ + AFR_MSG_SPLIT_BRAIN, "Failing %s on gfid %s: " \ + "split-brain observed.", \ + gf_fop_list[local->op], \ + uuid_utoa (local->inode->gfid)); \ + } while (0) + typedef enum { AFR_FAV_CHILD_NONE, AFR_FAV_CHILD_BY_SIZE, @@ -882,7 +894,7 @@ afr_inode_read_subvol_set (inode_t *inode, xlator_t *this, int event_generation); int -afr_inode_read_subvol_reset (inode_t *inode, xlator_t *this); +afr_inode_event_gen_reset (inode_t *inode, xlator_t *this); int afr_read_subvol_select_by_policy (inode_t *inode, xlator_t *this, @@ -906,10 +918,6 @@ afr_read_subvol_get (inode_t *inode, xlator_t *this, int *subvol_p, afr_read_subvol_get(i, t, s, r, e, AFR_METADATA_TRANSACTION, a) int -afr_inode_ctx_reset_unreadable_subvol (inode_t *inode, xlator_t *this, - int subvol_idx, int txn_type); - -int afr_inode_refresh (call_frame_t *frame, xlator_t *this, inode_t *inode, uuid_t gfid, afr_inode_refresh_cbk_t cbk); diff --git a/xlators/cluster/dht/src/dht-inode-read.c b/xlators/cluster/dht/src/dht-inode-read.c index e320109c796..ac0f0e186fa 100644 --- a/xlators/cluster/dht/src/dht-inode-read.c +++ b/xlators/cluster/dht/src/dht-inode-read.c @@ -849,6 +849,12 @@ dht_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, dht_set_local_rebalance (this, local, NULL, prebuf, postbuf, xdata); + if ((op_ret == -1) || IS_DHT_MIGRATION_PHASE2 (postbuf)) { + ret = dht_rebalance_complete_check (this, frame); + if (!ret) + return 0; + } + /* Check if the rebalance phase1 is true */ if (IS_DHT_MIGRATION_PHASE1 (postbuf)) { @@ -870,11 +876,6 @@ dht_fsync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, } } - if (IS_DHT_MIGRATION_PHASE2 (postbuf)) { - ret = dht_rebalance_complete_check (this, frame); - if (!ret) - return 0; - } out: DHT_STRIP_PHASE1_FLAGS (postbuf); diff --git a/xlators/cluster/dht/src/dht-rename.c b/xlators/cluster/dht/src/dht-rename.c index a9ffd1d9fb5..d955ee411eb 100644 --- a/xlators/cluster/dht/src/dht-rename.c +++ b/xlators/cluster/dht/src/dht-rename.c @@ -724,6 +724,7 @@ dht_rename_cleanup (call_frame_t *frame) DHT_MARKER_DONT_ACCOUNT(xattr_new); + FRAME_SU_DO (frame, dht_local_t); STACK_WIND (frame, dht_rename_unlink_cbk, dst_hashed, dst_hashed->fops->unlink, &local->loc, 0, xattr_new); diff --git a/xlators/cluster/ec/src/ec-common.c b/xlators/cluster/ec/src/ec-common.c index 2e6759a2803..2b4cec406a9 100644 --- a/xlators/cluster/ec/src/ec-common.c +++ b/xlators/cluster/ec/src/ec-common.c @@ -788,10 +788,10 @@ void ec_lock_prepare_inode(ec_fop_data_t *fop, loc_t *loc, uint32_t flags) ec_lock_prepare_inode_internal(fop, loc, flags, NULL); } -void ec_lock_prepare_parent_inode(ec_fop_data_t *fop, loc_t *loc, +void ec_lock_prepare_parent_inode(ec_fop_data_t *fop, loc_t *loc, loc_t *base, uint32_t flags) { - loc_t tmp, *base = NULL; + loc_t tmp; int32_t err; if (fop->error != 0) { @@ -806,8 +806,9 @@ void ec_lock_prepare_parent_inode(ec_fop_data_t *fop, loc_t *loc, } if ((flags & EC_INODE_SIZE) != 0) { - base = loc; flags ^= EC_INODE_SIZE; + } else { + base = NULL; } ec_lock_prepare_inode_internal(fop, &tmp, flags, base); @@ -1442,20 +1443,21 @@ gf_boolean_t ec_lock_acquire(ec_lock_link_t *link) { ec_lock_t *lock; ec_fop_data_t *fop; + gf_lkowner_t lk_owner; lock = link->lock; fop = link->fop; if (!lock->acquired) { - ec_owner_set(fop->frame, lock); + set_lk_owner_from_ptr(&lk_owner, lock); ec_trace("LOCK_ACQUIRE", fop, "lock=%p, inode=%p", lock, lock->loc.inode); lock->flock.l_type = F_WRLCK; - ec_inodelk(fop->frame, fop->xl, -1, EC_MINIMUM_ALL, ec_locked, - link, fop->xl->name, &lock->loc, F_SETLKW, &lock->flock, - NULL); + ec_inodelk(fop->frame, fop->xl, &lk_owner, -1, EC_MINIMUM_ALL, + ec_locked, link, fop->xl->name, &lock->loc, F_SETLKW, + &lock->flock, NULL); return _gf_false; } @@ -1760,6 +1762,7 @@ void ec_unlock_lock(ec_lock_link_t *link) { ec_lock_t *lock; ec_fop_data_t *fop; + gf_lkowner_t lk_owner; lock = link->lock; fop = link->fop; @@ -1767,13 +1770,13 @@ void ec_unlock_lock(ec_lock_link_t *link) ec_clear_inode_info(fop, lock->loc.inode); if ((lock->mask != 0) && lock->acquired) { - ec_owner_set(fop->frame, lock); + set_lk_owner_from_ptr(&lk_owner, lock); lock->flock.l_type = F_UNLCK; ec_trace("UNLOCK_INODELK", fop, "lock=%p, inode=%p", lock, lock->loc.inode); - ec_inodelk(fop->frame, fop->xl, lock->mask, EC_MINIMUM_ONE, + ec_inodelk(fop->frame, fop->xl, &lk_owner, lock->mask, EC_MINIMUM_ONE, ec_unlocked, link, fop->xl->name, &lock->loc, F_SETLK, &lock->flock, NULL); } else { diff --git a/xlators/cluster/ec/src/ec-common.h b/xlators/cluster/ec/src/ec-common.h index 8e724a81380..7c096db829c 100644 --- a/xlators/cluster/ec/src/ec-common.h +++ b/xlators/cluster/ec/src/ec-common.h @@ -89,7 +89,7 @@ gf_boolean_t ec_cbk_set_error(ec_cbk_data_t *cbk, int32_t error, gf_boolean_t ro); void ec_lock_prepare_inode(ec_fop_data_t *fop, loc_t *loc, uint32_t flags); -void ec_lock_prepare_parent_inode(ec_fop_data_t *fop, loc_t *loc, +void ec_lock_prepare_parent_inode(ec_fop_data_t *fop, loc_t *loc, loc_t *base, uint32_t flags); void ec_lock_prepare_fd(ec_fop_data_t *fop, fd_t *fd, uint32_t flags); void ec_lock(ec_fop_data_t * fop); diff --git a/xlators/cluster/ec/src/ec-dir-write.c b/xlators/cluster/ec/src/ec-dir-write.c index e181170650d..e068d77c827 100644 --- a/xlators/cluster/ec/src/ec-dir-write.c +++ b/xlators/cluster/ec/src/ec-dir-write.c @@ -177,7 +177,7 @@ int32_t ec_manager_create(ec_fop_data_t * fop, int32_t state) /* Fall through */ case EC_STATE_LOCK: - ec_lock_prepare_parent_inode(fop, &fop->loc[0], + ec_lock_prepare_parent_inode(fop, &fop->loc[0], NULL, EC_UPDATE_DATA | EC_UPDATE_META); ec_lock(fop); @@ -355,9 +355,9 @@ int32_t ec_manager_link(ec_fop_data_t * fop, int32_t state) { case EC_STATE_INIT: case EC_STATE_LOCK: - ec_lock_prepare_parent_inode(fop, &fop->loc[1], EC_UPDATE_DATA | - EC_UPDATE_META | - EC_INODE_SIZE); + ec_lock_prepare_parent_inode(fop, &fop->loc[1], &fop->loc[0], + EC_UPDATE_DATA | EC_UPDATE_META | + EC_INODE_SIZE); ec_lock(fop); return EC_STATE_DISPATCH; @@ -540,7 +540,7 @@ int32_t ec_manager_mkdir(ec_fop_data_t * fop, int32_t state) /* Fall through */ case EC_STATE_LOCK: - ec_lock_prepare_parent_inode(fop, &fop->loc[0], + ec_lock_prepare_parent_inode(fop, &fop->loc[0], NULL, EC_UPDATE_DATA | EC_UPDATE_META); ec_lock(fop); @@ -746,7 +746,7 @@ int32_t ec_manager_mknod(ec_fop_data_t * fop, int32_t state) /* Fall through */ case EC_STATE_LOCK: - ec_lock_prepare_parent_inode(fop, &fop->loc[0], + ec_lock_prepare_parent_inode(fop, &fop->loc[0], NULL, EC_UPDATE_DATA | EC_UPDATE_META); ec_lock(fop); @@ -905,10 +905,10 @@ int32_t ec_manager_rename(ec_fop_data_t * fop, int32_t state) { case EC_STATE_INIT: case EC_STATE_LOCK: - ec_lock_prepare_parent_inode(fop, &fop->loc[0], EC_UPDATE_DATA | - EC_UPDATE_META | - EC_INODE_SIZE); - ec_lock_prepare_parent_inode(fop, &fop->loc[1], + ec_lock_prepare_parent_inode(fop, &fop->loc[0], &fop->loc[0], + EC_UPDATE_DATA | EC_UPDATE_META | + EC_INODE_SIZE); + ec_lock_prepare_parent_inode(fop, &fop->loc[1], NULL, EC_UPDATE_DATA | EC_UPDATE_META); ec_lock(fop); @@ -1067,7 +1067,7 @@ int32_t ec_manager_rmdir(ec_fop_data_t * fop, int32_t state) { case EC_STATE_INIT: case EC_STATE_LOCK: - ec_lock_prepare_parent_inode(fop, &fop->loc[0], + ec_lock_prepare_parent_inode(fop, &fop->loc[0], NULL, EC_UPDATE_DATA | EC_UPDATE_META); ec_lock(fop); @@ -1213,7 +1213,7 @@ int32_t ec_manager_symlink(ec_fop_data_t * fop, int32_t state) { case EC_STATE_INIT: case EC_STATE_LOCK: - ec_lock_prepare_parent_inode(fop, &fop->loc[0], + ec_lock_prepare_parent_inode(fop, &fop->loc[0], NULL, EC_UPDATE_DATA | EC_UPDATE_META); ec_lock(fop); @@ -1379,7 +1379,7 @@ int32_t ec_manager_unlink(ec_fop_data_t * fop, int32_t state) { case EC_STATE_INIT: case EC_STATE_LOCK: - ec_lock_prepare_parent_inode(fop, &fop->loc[0], + ec_lock_prepare_parent_inode(fop, &fop->loc[0], NULL, EC_UPDATE_DATA | EC_UPDATE_META); ec_lock(fop); diff --git a/xlators/cluster/ec/src/ec-fops.h b/xlators/cluster/ec/src/ec-fops.h index 8d938427a18..bbacedc0140 100644 --- a/xlators/cluster/ec/src/ec-fops.h +++ b/xlators/cluster/ec/src/ec-fops.h @@ -63,16 +63,16 @@ void ec_fheal(call_frame_t * frame, xlator_t * this, uintptr_t target, int32_t minimum, fop_fheal_cbk_t func, void *data, fd_t * fd, int32_t partial, dict_t *xdata); -void ec_inodelk(call_frame_t * frame, xlator_t * this, uintptr_t target, - int32_t minimum, fop_inodelk_cbk_t func, void *data, - const char * volume, loc_t * loc, int32_t cmd, - struct gf_flock * flock, dict_t * xdata); - -void ec_finodelk(call_frame_t * frame, xlator_t * this, uintptr_t target, - int32_t minimum, fop_finodelk_cbk_t func, void *data, - const char * volume, fd_t * fd, int32_t cmd, +void ec_inodelk (call_frame_t *frame, xlator_t *this, gf_lkowner_t *owner, + uintptr_t target, int32_t minimum, fop_inodelk_cbk_t func, + void *data, const char *volume, loc_t *loc, int32_t cmd, struct gf_flock * flock, dict_t * xdata); +void ec_finodelk(call_frame_t *frame, xlator_t *this, gf_lkowner_t *owner, + uintptr_t target, int32_t minimum, fop_finodelk_cbk_t func, + void *data, const char *volume, fd_t *fd, int32_t cmd, + struct gf_flock *flock, dict_t *xdata); + void ec_link(call_frame_t * frame, xlator_t * this, uintptr_t target, int32_t minimum, fop_link_cbk_t func, void *data, loc_t * oldloc, loc_t * newloc, dict_t * xdata); diff --git a/xlators/cluster/ec/src/ec-heal.c b/xlators/cluster/ec/src/ec-heal.c index 051d218331a..da08f6c9a75 100644 --- a/xlators/cluster/ec/src/ec-heal.c +++ b/xlators/cluster/ec/src/ec-heal.c @@ -177,14 +177,17 @@ void ec_heal_lock(ec_heal_t *heal, int32_t type, fd_t *fd, loc_t *loc, if (fd != NULL) { - ec_finodelk(heal->fop->frame, heal->xl, heal->fop->mask, + ec_finodelk(heal->fop->frame, heal->xl, + &heal->fop->frame->root->lk_owner, heal->fop->mask, EC_MINIMUM_ALL, cbk, heal, heal->xl->name, fd, F_SETLKW, &flock, NULL); } else { - ec_inodelk(heal->fop->frame, heal->xl, heal->fop->mask, EC_MINIMUM_ALL, - cbk, heal, heal->xl->name, loc, F_SETLKW, &flock, NULL); + ec_inodelk(heal->fop->frame, heal->xl, + &heal->fop->frame->root->lk_owner, heal->fop->mask, + EC_MINIMUM_ALL, cbk, heal, heal->xl->name, loc, F_SETLKW, + &flock, NULL); } } diff --git a/xlators/cluster/ec/src/ec-helpers.c b/xlators/cluster/ec/src/ec-helpers.c index 7cf8232353d..7df83126ae5 100644 --- a/xlators/cluster/ec/src/ec-helpers.c +++ b/xlators/cluster/ec/src/ec-helpers.c @@ -643,10 +643,9 @@ void ec_owner_set(call_frame_t * frame, void * owner) set_lk_owner_from_ptr(&frame->root->lk_owner, owner); } -void ec_owner_copy(call_frame_t * frame, gf_lkowner_t * owner) +void ec_owner_copy(call_frame_t *frame, gf_lkowner_t *owner) { - frame->root->lk_owner.len = owner->len; - memcpy(frame->root->lk_owner.data, owner->data, owner->len); + lk_owner_copy (&frame->root->lk_owner, owner); } ec_inode_t * __ec_inode_get(inode_t * inode, xlator_t * xl) diff --git a/xlators/cluster/ec/src/ec-locks.c b/xlators/cluster/ec/src/ec-locks.c index ed835f1aadc..bd525723ddf 100644 --- a/xlators/cluster/ec/src/ec-locks.c +++ b/xlators/cluster/ec/src/ec-locks.c @@ -608,12 +608,14 @@ int32_t ec_manager_inodelk(ec_fop_data_t * fop, int32_t state) flock.l_owner.len = 0; if (fop->id == GF_FOP_INODELK) { - ec_inodelk(fop->frame, fop->xl, mask, 1, + ec_inodelk(fop->frame, fop->xl, + &fop->frame->root->lk_owner, mask, 1, ec_lock_unlocked, NULL, fop->str[0], &fop->loc[0], F_SETLK, &flock, fop->xdata); } else { - ec_finodelk(fop->frame, fop->xl, mask, 1, + ec_finodelk(fop->frame, fop->xl, + &fop->frame->root->lk_owner, mask, 1, ec_lock_unlocked, NULL, fop->str[0], fop->fd, F_SETLK, &flock, fop->xdata); } @@ -692,10 +694,10 @@ int32_t ec_manager_inodelk(ec_fop_data_t * fop, int32_t state) } } -void ec_inodelk(call_frame_t * frame, xlator_t * this, uintptr_t target, - int32_t minimum, fop_inodelk_cbk_t func, void * data, - const char * volume, loc_t * loc, int32_t cmd, - struct gf_flock * flock, dict_t * xdata) +void ec_inodelk (call_frame_t *frame, xlator_t *this, gf_lkowner_t *owner, + uintptr_t target, int32_t minimum, fop_inodelk_cbk_t func, + void *data, const char *volume, loc_t *loc, int32_t cmd, + struct gf_flock *flock, dict_t *xdata) { ec_cbk_t callback = { .inodelk = func }; ec_fop_data_t * fop = NULL; @@ -715,6 +717,7 @@ void ec_inodelk(call_frame_t * frame, xlator_t * this, uintptr_t target, } fop->int32 = cmd; + ec_owner_copy (fop->frame, owner); if (volume != NULL) { fop->str[0] = gf_strdup(volume); @@ -828,10 +831,10 @@ void ec_wind_finodelk(ec_t * ec, ec_fop_data_t * fop, int32_t idx) fop->xdata); } -void ec_finodelk(call_frame_t * frame, xlator_t * this, uintptr_t target, - int32_t minimum, fop_finodelk_cbk_t func, void * data, - const char * volume, fd_t * fd, int32_t cmd, - struct gf_flock * flock, dict_t * xdata) +void ec_finodelk(call_frame_t *frame, xlator_t *this, gf_lkowner_t *owner, + uintptr_t target, int32_t minimum, fop_finodelk_cbk_t func, + void *data, const char *volume, fd_t *fd, int32_t cmd, + struct gf_flock *flock, dict_t *xdata) { ec_cbk_t callback = { .finodelk = func }; ec_fop_data_t * fop = NULL; @@ -853,6 +856,7 @@ void ec_finodelk(call_frame_t * frame, xlator_t * this, uintptr_t target, fop->use_fd = 1; fop->int32 = cmd; + ec_owner_copy (fop->frame, owner); if (volume != NULL) { fop->str[0] = gf_strdup(volume); diff --git a/xlators/cluster/ec/src/ec.c b/xlators/cluster/ec/src/ec.c index 94d1241b364..b5e6bc08216 100644 --- a/xlators/cluster/ec/src/ec.c +++ b/xlators/cluster/ec/src/ec.c @@ -839,8 +839,8 @@ int32_t ec_gf_inodelk(call_frame_t * frame, xlator_t * this, if (flock->l_type == F_UNLCK) minimum = EC_MINIMUM_ONE; - ec_inodelk(frame, this, -1, minimum, default_inodelk_cbk, NULL, - volume, loc, cmd, flock, xdata); + ec_inodelk(frame, this, &frame->root->lk_owner, -1, minimum, + default_inodelk_cbk, NULL, volume, loc, cmd, flock, xdata); return 0; } @@ -852,8 +852,8 @@ int32_t ec_gf_finodelk(call_frame_t * frame, xlator_t * this, int32_t minimum = EC_MINIMUM_ALL; if (flock->l_type == F_UNLCK) minimum = EC_MINIMUM_ONE; - ec_finodelk(frame, this, -1, minimum, default_finodelk_cbk, NULL, - volume, fd, cmd, flock, xdata); + ec_finodelk(frame, this, &frame->root->lk_owner, -1, minimum, + default_finodelk_cbk, NULL, volume, fd, cmd, flock, xdata); return 0; } |
