diff options
author | Pranith Kumar K <pkarampu@redhat.com> | 2017-09-05 13:30:53 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2017-09-06 02:31:29 +0000 |
commit | e50fc8f4e7eb51386f47bea9e6ca8d8490c09003 (patch) | |
tree | 32bb1c642c183f3d5f37d9020cc24733a5ae624e | |
parent | 91430817ce5bcbeabf057e9c978485728a85fb2b (diff) |
features/shard: Increment counts in locks
Problem:
Because create_count/eexist_count are incremented without locks, all the shards may not
be created because call_count will be lesser than what it needs to be. This can lead
to crash in shard_common_inode_write_do() because inode on which we want to do
fd_anonymous() is NULL
Fix:
Increment the counts in frame->lock
Change-Id: Ibc87dcb1021e9f4ac2929f662da07aa7662ab0d6
BUG: 1488354
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: https://review.gluster.org/18203
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Krutika Dhananjay <kdhananj@redhat.com>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
-rw-r--r-- | xlators/features/shard/src/shard.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c index adf5da0d398..2892bded312 100644 --- a/xlators/features/shard/src/shard.c +++ b/xlators/features/shard/src/shard.c @@ -1703,7 +1703,11 @@ shard_common_lookup_shards_cbk (call_frame_t *frame, void *cookie, case GF_FOP_FALLOCATE: if ((!local->first_lookup_done) && (op_errno == ENOENT)) { - local->create_count++; + LOCK (&frame->lock); + { + local->create_count++; + } + UNLOCK (&frame->lock); goto done; } break; @@ -3270,7 +3274,11 @@ shard_common_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (op_ret < 0) { if (op_errno == EEXIST) { - local->eexist_count++; + LOCK (&frame->lock); + { + local->eexist_count++; + } + UNLOCK (&frame->lock); } else { local->op_ret = op_ret; local->op_errno = op_errno; |