From 3a141cda38cd6908dc3f1103a02eb38007552e87 Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Wed, 6 Feb 2013 12:34:17 +0530 Subject: cluster/afr: Avoid priv->eager_lock value update race Change-Id: I7049c0c64e36a9dfa4cc0e0b34de7ec111d2f6c1 BUG: 908302 Signed-off-by: Pranith Kumar K Reviewed-on: http://review.gluster.org/4076 Tested-by: Gluster Build System Reviewed-by: Jeff Darcy Reviewed-by: Anand Avati --- xlators/cluster/afr/src/afr-common.c | 1 + xlators/cluster/afr/src/afr-lk-common.c | 2 +- xlators/cluster/afr/src/afr-transaction.c | 6 +++--- xlators/cluster/afr/src/afr.h | 1 + 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index 424a69971..801346406 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -4024,6 +4024,7 @@ afr_transaction_local_init (afr_local_t *local, xlator_t *this) AFR_NUM_CHANGE_LOGS); if (!local->transaction.txn_changelog) goto out; + local->transaction.eager_lock_on = priv->eager_lock; ret = 0; out: return ret; diff --git a/xlators/cluster/afr/src/afr-lk-common.c b/xlators/cluster/afr/src/afr-lk-common.c index 542b2959d..75df3bb3d 100644 --- a/xlators/cluster/afr/src/afr-lk-common.c +++ b/xlators/cluster/afr/src/afr-lk-common.c @@ -1554,7 +1554,7 @@ afr_nonblocking_inodelk (call_frame_t *frame, xlator_t *this) continue; flock_use = &flock; - if (!priv->eager_lock) { + if (!local->transaction.eager_lock_on) { goto wind; } diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index c0316f86a..a8b317878 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -1291,10 +1291,10 @@ afr_set_delayed_post_op (call_frame_t *frame, xlator_t *this) if (!priv->post_op_delay_secs) return; - if (!priv->eager_lock) + local = frame->local; + if (!local->transaction.eager_lock_on) return; - local = frame->local; if (!local) return; @@ -1477,7 +1477,7 @@ afr_transaction (call_frame_t *frame, xlator_t *this, afr_transaction_type type) local->transaction.resume = afr_transaction_resume; local->transaction.type = type; - if (local->fd && priv->eager_lock && + if (local->fd && local->transaction.eager_lock_on && local->transaction.type == AFR_DATA_TRANSACTION) afr_set_lk_owner (frame, this, local->fd); else diff --git a/xlators/cluster/afr/src/afr.h b/xlators/cluster/afr/src/afr.h index 9405ff295..cc0d01077 100644 --- a/xlators/cluster/afr/src/afr.h +++ b/xlators/cluster/afr/src/afr.h @@ -655,6 +655,7 @@ typedef struct _afr_local { struct { off_t start, len; + gf_boolean_t eager_lock_on; int *eager_lock; char *basename; -- cgit