summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPranith Kumar K <pkarampu@redhat.com>2017-09-05 13:30:53 +0530
committerShyamsundar Ranganathan <srangana@redhat.com>2017-09-17 12:48:06 +0000
commit6c6abbf2662ac48cd3626c50f7fea87bfd0f76bf (patch)
tree8cc68b253c539374b766e34b6124f585b9546fbe
parent78a4218c4838e4844e4ea130a1740359e459a622 (diff)
features/shard: Increment counts in locks
Backport of https://review.gluster.org/18203 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> Change-Id: Ibc87dcb1021e9f4ac2929f662da07aa7662ab0d6 BUG: 1488391 Signed-off-by: Pranith Kumar K <pkarampu@redhat.com> Reviewed-on: https://review.gluster.org/18206 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.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/xlators/features/shard/src/shard.c b/xlators/features/shard/src/shard.c
index 6af02b698b2..2a2a7b1f4bf 100644
--- a/xlators/features/shard/src/shard.c
+++ b/xlators/features/shard/src/shard.c
@@ -1708,7 +1708,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;
@@ -3228,7 +3232,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;