From 7b0781a45bba826a790aa4d5a125693ac2be28ab Mon Sep 17 00:00:00 2001 From: Ravishankar N Date: Mon, 16 Apr 2018 15:38:34 +0530 Subject: afr: fixes to afr-eager locking 1. If pre-op fails on all bricks,set lock->release to true in afr_handle_lock_acquire_failure so that the GF_ASSERT in afr_unlock() does not crash. 2. Added a missing 'return' after handling pre-op failure in afr_transaction_perform_fop(), fixing a use-after-free issue. Change-Id: If0627a9124cb5d6405037cab3f17f8325eed2d83 fixes: bz#1561129 Signed-off-by: Ravishankar N --- xlators/cluster/afr/src/afr-transaction.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'xlators') diff --git a/xlators/cluster/afr/src/afr-transaction.c b/xlators/cluster/afr/src/afr-transaction.c index b5132a22d5b..8bb096775c2 100644 --- a/xlators/cluster/afr/src/afr-transaction.c +++ b/xlators/cluster/afr/src/afr-transaction.c @@ -285,6 +285,7 @@ afr_handle_lock_acquire_failure (afr_local_t *local, gf_boolean_t locked) INIT_LIST_HEAD (&shared); LOCK (&local->inode->lock); { + lock->release = _gf_true; list_splice_init (&lock->waiting, &shared); } UNLOCK (&local->inode->lock); @@ -510,6 +511,7 @@ afr_transaction_perform_fop (call_frame_t *frame, xlator_t *this) priv->child_count); if (failure_count == priv->child_count) { afr_handle_lock_acquire_failure (local, _gf_true); + return 0; } else { lock = &local->inode_ctx->lock[local->transaction.type]; LOCK (&local->inode->lock); -- cgit