diff options
-rw-r--r-- | xlators/cluster/afr/src/afr-lk-common.c | 22 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-transaction.c | 45 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr.h | 2 |
3 files changed, 28 insertions, 41 deletions
diff --git a/xlators/cluster/afr/src/afr-lk-common.c b/xlators/cluster/afr/src/afr-lk-common.c index 92356c82e4c..555a9b9faf6 100644 --- a/xlators/cluster/afr/src/afr-lk-common.c +++ b/xlators/cluster/afr/src/afr-lk-common.c @@ -589,7 +589,6 @@ afr_unlock_inodelk (call_frame_t *frame, xlator_t *this) int i = 0; int piggyback = 0; afr_fd_ctx_t *fd_ctx = NULL; - gf_boolean_t fd_lock_owner = _gf_false; local = frame->local; @@ -624,11 +623,6 @@ afr_unlock_inodelk (call_frame_t *frame, xlator_t *this) if (local->fd) { flock_use = &flock; if (!local->transaction.eager_lock[i]) { - if (fd_lock_owner) { - afr_set_lk_owner (frame, this, - frame->root); - fd_lock_owner = _gf_false; - } goto wind; } @@ -645,10 +639,6 @@ afr_unlock_inodelk (call_frame_t *frame, xlator_t *this) } UNLOCK (&local->fd->lock); - if (!fd_lock_owner) { - afr_set_lk_owner (frame, this, local->fd); - fd_lock_owner = _gf_true; - } if (piggyback) { afr_unlock_inodelk_cbk (frame, (void *) (long) i, this, 1, 0, NULL); @@ -1432,7 +1422,6 @@ afr_nonblocking_inodelk (call_frame_t *frame, xlator_t *this) struct gf_flock full_flock = {0,}; struct gf_flock *flock_use = NULL; int piggyback = 0; - gf_boolean_t fd_lock_owner = _gf_false; local = frame->local; int_lock = &local->internal_lock; @@ -1482,11 +1471,6 @@ afr_nonblocking_inodelk (call_frame_t *frame, xlator_t *this) flock_use = &flock; if (!priv->eager_lock) { - if (fd_lock_owner) { - afr_set_lk_owner (frame, this, - frame->root); - fd_lock_owner = _gf_false; - } goto wind; } @@ -1502,11 +1486,6 @@ afr_nonblocking_inodelk (call_frame_t *frame, xlator_t *this) } UNLOCK (&local->fd->lock); - if (!fd_lock_owner) { - afr_set_lk_owner (frame, this, local->fd); - fd_lock_owner = _gf_true; - } - if (piggyback) { /* (op_ret == 1) => indicate piggybacked lock */ afr_nonblocking_inodelk_cbk (frame, (void *) (long) i, @@ -1761,7 +1740,6 @@ afr_unlock (call_frame_t *frame, xlator_t *this) local = frame->local; if (transaction_lk_op (local)) { - afr_set_lk_owner (frame, this, frame->root); if (is_afr_lock_transaction (local)) afr_unlock_inodelk (frame, this); else diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index 6634b3102a1..0e9956d7bed 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -72,24 +72,24 @@ afr_fd_ctx_get (fd_t *fd, xlator_t *this) static void -afr_pid_save (call_frame_t *frame) +afr_save_lk_owner (call_frame_t *frame) { afr_local_t * local = NULL; local = frame->local; - local->saved_pid = frame->root->pid; + local->saved_lk_owner = frame->root->lk_owner; } static void -afr_pid_restore (call_frame_t *frame) +afr_restore_lk_owner (call_frame_t *frame) { afr_local_t * local = NULL; local = frame->local; - frame->root->pid = local->saved_pid; + frame->root->lk_owner = local->saved_lk_owner; } @@ -780,7 +780,13 @@ afr_changelog_pre_op_cbk (call_frame_t *frame, void *cookie, xlator_t *this, __mark_all_success (local->pending, priv->child_count, local->transaction.type); - afr_pid_restore (frame); + /* Perform fops with the lk-owner from top xlator. + * Eg: lk-owner of posix-lk and flush should be same, + * flush cant clear the posix-lks without that lk-owner. + */ + afr_save_lk_owner (frame); + frame->root->lk_owner = + local->transaction.main_frame->root->lk_owner; local->transaction.fop (frame, this); } @@ -1035,7 +1041,6 @@ afr_post_nonblocking_inodelk_cbk (call_frame_t *frame, xlator_t *this) gf_log (this->name, GF_LOG_DEBUG, "Non blocking inodelks failed. Proceeding to blocking"); int_lock->lock_cbk = afr_post_blocking_inodelk_cbk; - afr_set_lk_owner (frame, this, frame->root); afr_blocking_lock (frame, this); } else { @@ -1199,12 +1204,6 @@ afr_lock_rec (call_frame_t *frame, xlator_t *this) int afr_lock (call_frame_t *frame, xlator_t *this) { - afr_pid_save (frame); - - frame->root->pid = (long) frame->root; - - afr_set_lk_owner (frame, this, frame->root); - afr_set_lock_number (frame, this); return afr_lock_rec (frame, this); @@ -1222,18 +1221,20 @@ afr_internal_lock_finish (call_frame_t *frame, xlator_t *this) priv = this->private; local = frame->local; - /* Perform fops with the lk-owner from top xlator. - * Eg: lk-owner of posix-lk and flush should be same, - * flush cant clear the posix-lks without that lk-owner. - */ - frame->root->lk_owner = local->transaction.main_frame->root->lk_owner; if (__fop_changelog_needed (frame, this)) { afr_changelog_pre_op (frame, this); } else { __mark_all_success (local->pending, priv->child_count, local->transaction.type); - afr_pid_restore (frame); + + /* Perform fops with the lk-owner from top xlator. + * Eg: lk-owner of posix-lk and flush should be same, + * flush cant clear the posix-lks without that lk-owner. + */ + afr_save_lk_owner (frame); + frame->root->lk_owner = + local->transaction.main_frame->root->lk_owner; local->transaction.fop (frame, this); } @@ -1253,6 +1254,8 @@ afr_transaction_resume (call_frame_t *frame, xlator_t *this) int_lock = &local->internal_lock; priv = this->private; + afr_restore_lk_owner (frame); + if (__fop_changelog_needed (frame, this)) { afr_changelog_post_op (frame, this); } else { @@ -1294,6 +1297,12 @@ afr_transaction (call_frame_t *frame, xlator_t *this, afr_transaction_type type) local = frame->local; priv = this->private; + if (local->fd && priv->eager_lock && + local->transaction.type == AFR_DATA_TRANSACTION) + afr_set_lk_owner (frame, this, local->fd); + else + afr_set_lk_owner (frame, this, frame->root); + afr_transaction_local_init (local, this); local->transaction.resume = afr_transaction_resume; diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index c8e01fcb841..e9867cb826d 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -380,7 +380,7 @@ typedef struct _afr_local { unsigned char read_child_returned; unsigned int first_up_child; - pid_t saved_pid; + gf_lkowner_t saved_lk_owner; int32_t op_ret; int32_t op_errno; |