diff options
| author | Pranith Kumar K <pkarampu@redhat.com> | 2017-09-05 13:30:53 +0530 | 
|---|---|---|
| committer | Shyamsundar Ranganathan <srangana@redhat.com> | 2017-09-17 12:48:06 +0000 | 
| commit | 6c6abbf2662ac48cd3626c50f7fea87bfd0f76bf (patch) | |
| tree | 8cc68b253c539374b766e34b6124f585b9546fbe | |
| parent | 78a4218c4838e4844e4ea130a1740359e459a622 (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.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 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;  | 
