cluster/afr: Prevent execution of code after call_count decrementing
Problem: When call_count is decremented by one thread, another thread can go ahead with the operation leading to undefined behavior for the thread executing statements after decrementing call count. Fix: Do the operations necessary before decrementing call count. fixes bz#1598663 Change-Id: Icc90cd92ac16e5fbdfe534d9f0a61312943393fe Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
This commit is contained in:
parent
886ee4dfac
commit
03f1f5bdc4
@ -970,6 +970,14 @@ afr_nonblocking_inodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
|
||||
local = frame->local;
|
||||
int_lock = &local->internal_lock;
|
||||
|
||||
if (op_ret == 0 && local->transaction.type == AFR_DATA_TRANSACTION) {
|
||||
LOCK (&local->inode->lock);
|
||||
{
|
||||
local->inode_ctx->lock_count++;
|
||||
}
|
||||
UNLOCK (&local->inode->lock);
|
||||
}
|
||||
|
||||
LOCK (&frame->lock);
|
||||
{
|
||||
if (op_ret < 0) {
|
||||
@ -994,13 +1002,6 @@ afr_nonblocking_inodelk_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
|
||||
}
|
||||
UNLOCK (&frame->lock);
|
||||
|
||||
if (op_ret == 0 && local->transaction.type == AFR_DATA_TRANSACTION) {
|
||||
LOCK (&local->inode->lock);
|
||||
{
|
||||
local->inode_ctx->lock_count++;
|
||||
}
|
||||
UNLOCK (&local->inode->lock);
|
||||
}
|
||||
if (call_count == 0) {
|
||||
gf_msg_trace (this->name, 0,
|
||||
"Last inode locking reply received");
|
||||
|
Loading…
x
Reference in New Issue
Block a user