diff options
| -rw-r--r-- | glusterfsd/src/glusterfsd-mgmt.c | 17 | ||||
| -rw-r--r-- | libglusterfs/src/event-epoll.c | 4 | ||||
| -rw-r--r-- | libglusterfs/src/fd.c | 10 | ||||
| -rw-r--r-- | libglusterfs/src/gidcache.c | 4 | ||||
| -rw-r--r-- | libglusterfs/src/rbthash.c | 5 | ||||
| -rw-r--r-- | rpc/rpc-lib/src/rpc-drc.c | 30 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 15 | ||||
| -rw-r--r-- | xlators/cluster/afr/src/afr-inode-read.c | 10 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 103 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-hashfn.c | 11 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-helper.c | 20 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-inode-read.c | 6 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-inode-write.c | 22 | ||||
| -rw-r--r-- | xlators/features/barrier/src/barrier.c | 9 | ||||
| -rw-r--r-- | xlators/features/bit-rot/src/bitd/bit-rot-scrub.c | 2 | ||||
| -rw-r--r-- | xlators/features/locks/src/posix.c | 2 | ||||
| -rw-r--r-- | xlators/features/quota/src/quota.c | 27 | ||||
| -rw-r--r-- | xlators/lib/src/libxlator.c | 7 | ||||
| -rw-r--r-- | xlators/meta/src/frames-file.c | 3 | 
19 files changed, 155 insertions, 152 deletions
diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c index 6dec11b2bc2..a78acb602a0 100644 --- a/glusterfsd/src/glusterfsd-mgmt.c +++ b/glusterfsd/src/glusterfsd-mgmt.c @@ -2008,10 +2008,11 @@ volfile:              if (!strcmp(volfile_id, volfile_obj->vol_id)) {                  if (!memcmp(sha256_hash, volfile_obj->volfile_checksum,                              sizeof(volfile_obj->volfile_checksum))) { +                    UNLOCK(&ctx->volfile_lock);                      gf_log(frame->this->name, GF_LOG_INFO,                             "No change in volfile,"                             "continuing"); -                    goto out; +                    goto post_unlock;                  }                  volfile_tmp = volfile_obj;                  break; @@ -2021,10 +2022,11 @@ volfile:          /* coverity[secure_temp] mkstemp uses 0600 as the mode */          tmp_fd = mkstemp(template);          if (-1 == tmp_fd) { +            UNLOCK(&ctx->volfile_lock);              gf_msg(frame->this->name, GF_LOG_ERROR, 0, glusterfsd_msg_39,                     "Unable to create temporary file: %s", template);              ret = -1; -            goto out; +            goto post_unlock;          }          /* Calling unlink so that when the file is closed or program @@ -2065,11 +2067,11 @@ volfile:                     "No need to re-load volfile, reconfigure done");              if (!volfile_tmp) {                  ret = -1; +                UNLOCK(&ctx->volfile_lock);                  gf_log("mgmt", GF_LOG_ERROR, -                       "Graph " -                       "reconfigure succeeded with out having " +                       "Graph reconfigure succeeded with out having "                         "checksum."); -                goto out; +                goto post_unlock;              }              memcpy(volfile_tmp->volfile_checksum, sha256_hash,                     sizeof(volfile_tmp->volfile_checksum)); @@ -2077,8 +2079,9 @@ volfile:          }          if (ret < 0) { +            UNLOCK(&ctx->volfile_lock);              gf_log("glusterfsd-mgmt", GF_LOG_DEBUG, "Reconfigure failed !!"); -            goto out; +            goto post_unlock;          }          ret = glusterfs_process_volfp(ctx, tmpfp); @@ -2118,7 +2121,7 @@ out:      if (locked)          UNLOCK(&ctx->volfile_lock); - +post_unlock:      GF_FREE(frame->local);      frame->local = NULL;      STACK_DESTROY(frame->root); diff --git a/libglusterfs/src/event-epoll.c b/libglusterfs/src/event-epoll.c index dcaf9804529..be8b204b7a7 100644 --- a/libglusterfs/src/event-epoll.c +++ b/libglusterfs/src/event-epoll.c @@ -1018,7 +1018,7 @@ event_handled_epoll(struct event_pool *event_pool, int fd, int idx, int gen)                           " from gen=%d to slot->gen=%d, fd=%d, "                           "slot->fd=%d",                           idx, gen, slot->gen, fd, slot->fd); -            goto post_unlock; +            goto unlock;          }          /* This call also picks up the changes made by another @@ -1033,7 +1033,7 @@ event_handled_epoll(struct event_pool *event_pool, int fd, int idx, int gen)              ret = epoll_ctl(event_pool->fd, EPOLL_CTL_MOD, fd, &epoll_event);          }      } -post_unlock: +unlock:      UNLOCK(&slot->lock);      event_slot_unref(event_pool, slot, idx); diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c index 44a9ee69d67..b8aac726093 100644 --- a/libglusterfs/src/fd.c +++ b/libglusterfs/src/fd.c @@ -766,13 +766,13 @@ fd_anonymous_with_flags(inode_t *inode, int32_t flags)  {      fd_t *fd = NULL; +    if (flags & O_DIRECT) +        flags = GF_ANON_FD_FLAGS | O_DIRECT; +    else +        flags = GF_ANON_FD_FLAGS; +      LOCK(&inode->lock);      { -        if (flags & O_DIRECT) -            flags = GF_ANON_FD_FLAGS | O_DIRECT; -        else -            flags = GF_ANON_FD_FLAGS; -          fd = __fd_anonymous(inode, flags);      }      UNLOCK(&inode->lock); diff --git a/libglusterfs/src/gidcache.c b/libglusterfs/src/gidcache.c index 87147163e9e..40fcffbb35e 100644 --- a/libglusterfs/src/gidcache.c +++ b/libglusterfs/src/gidcache.c @@ -64,8 +64,8 @@ gid_cache_lookup(gid_cache_t *cache, uint64_t id, uint64_t uid, uint64_t gid)      time_t now;      const gid_list_t *agl; -    LOCK(&cache->gc_lock);      now = time(NULL); +    LOCK(&cache->gc_lock);      bucket = id % cache->gc_nbuckets;      agl = BUCKET_START(cache->gc_cache, bucket);      for (i = 0; i < AUX_GID_CACHE_ASSOC; i++, agl++) { @@ -132,8 +132,8 @@ gid_cache_add(gid_cache_t *cache, gid_list_t *gl)      if (!cache->gc_max_age)          return 0; -    LOCK(&cache->gc_lock);      now = time(NULL); +    LOCK(&cache->gc_lock);      /*       * Scan for the first free entry or one that matches this id. The id diff --git a/libglusterfs/src/rbthash.c b/libglusterfs/src/rbthash.c index 1bdd45f9fae..ae2e158d61e 100644 --- a/libglusterfs/src/rbthash.c +++ b/libglusterfs/src/rbthash.c @@ -252,10 +252,11 @@ rbthash_insert_entry(rbthash_table_t *tbl, rbthash_entry_t *entry)      LOCK(&bucket->bucketlock);      {          if (!rb_probe(bucket->bucket, (void *)entry)) { +            UNLOCK(&bucket->bucketlock);              gf_msg(GF_RBTHASH, GF_LOG_ERROR, 0, LG_MSG_RBTHASH_INSERT_FAILED, -                   "Failed to insert" -                   " entry"); +                   "Failed to insert entry");              ret = -1; +            goto err;          }      }      UNLOCK(&bucket->bucketlock); diff --git a/rpc/rpc-lib/src/rpc-drc.c b/rpc/rpc-lib/src/rpc-drc.c index e2a448fa640..bd8695c5ccf 100644 --- a/rpc/rpc-lib/src/rpc-drc.c +++ b/rpc/rpc-lib/src/rpc-drc.c @@ -699,47 +699,42 @@ rpcsvc_drc_init(rpcsvc_t *svc, dict_t *options)      LOCK_INIT(&drc->lock);      svc->drc = drc; -    LOCK(&drc->lock); -      /* Specify type of DRC to be used */      ret = dict_get_uint32(options, "nfs.drc-type", &drc_type);      if (ret) {          gf_log(GF_RPCSVC, GF_LOG_DEBUG, -               "drc type not set." -               " Continuing with default"); +               "drc type not set. Continuing with default");          drc_type = DRC_DEFAULT_TYPE;      } -    drc->type = drc_type; -      /* Set the global cache size (no. of ops to cache) */      ret = dict_get_uint32(options, "nfs.drc-size", &drc_size);      if (ret) {          gf_log(GF_RPCSVC, GF_LOG_DEBUG, -               "drc size not set." -               " Continuing with default size"); +               "drc size not set. Continuing with default size");          drc_size = DRC_DEFAULT_CACHE_SIZE;      } +    LOCK(&drc->lock); + +    drc->type = drc_type;      drc->global_cache_size = drc_size;      /* Mempool for cached ops */      drc->mempool = mem_pool_new(drc_cached_op_t, drc->global_cache_size);      if (!drc->mempool) { +        UNLOCK(&drc->lock);          gf_log(GF_RPCSVC, GF_LOG_ERROR, -               "Failed to get mempool for" -               " DRC, drc-size: %d", -               drc->global_cache_size); +               "Failed to get mempool for DRC, drc-size: %d", drc_size);          ret = -1; -        goto out; +        goto post_unlock;      }      /* What percent of cache to be evicted whenever it fills up */      ret = dict_get_uint32(options, "nfs.drc-lru-factor", &drc_factor);      if (ret) {          gf_log(GF_RPCSVC, GF_LOG_DEBUG, -               "drc lru factor not set." -               " Continuing with policy default"); +               "drc lru factor not set. Continuing with policy default");          drc_factor = DRC_DEFAULT_LRU_FACTOR;      } @@ -750,15 +745,16 @@ rpcsvc_drc_init(rpcsvc_t *svc, dict_t *options)      ret = rpcsvc_register_notify(svc, rpcsvc_drc_notify, THIS);      if (ret) { +        UNLOCK(&drc->lock);          gf_log(GF_RPCSVC, GF_LOG_ERROR,                 "registration of drc_notify function failed"); -        goto out; +        goto post_unlock;      } -    gf_log(GF_RPCSVC, GF_LOG_DEBUG, "drc init successful");      drc->status = DRC_INITIATED; -out:      UNLOCK(&drc->lock); +    gf_log(GF_RPCSVC, GF_LOG_DEBUG, "drc init successful"); +post_unlock:      if (ret == -1) {          if (drc->mempool) {              mem_pool_destroy(drc->mempool); diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index dceab865fab..d9e4796cc5a 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -263,11 +263,7 @@ __afr_set_in_flight_sb_status(xlator_t *this, afr_local_t *local,      count = gf_bits_count(tmp_map); -    if (count == 1) -        index = gf_bits_index(tmp_map); -      for (i = 0; i < priv->child_count; i++) { -        mask = 0;          if (!local->transaction.failed_subvols[i])              continue; @@ -281,6 +277,7 @@ __afr_set_in_flight_sb_status(xlator_t *this, afr_local_t *local,      switch (txn_type) {          case AFR_METADATA_TRANSACTION:              if ((metadatamap_old != 0) && (metadatamap == 0) && (count == 1)) { +                index = gf_bits_index(tmp_map);                  local->transaction.in_flight_sb_errno = local->replies[index]                                                              .op_errno;                  local->transaction.in_flight_sb = _gf_true; @@ -293,6 +290,7 @@ __afr_set_in_flight_sb_status(xlator_t *this, afr_local_t *local,          case AFR_DATA_TRANSACTION:              if ((datamap_old != 0) && (datamap == 0) && (count == 1)) { +                index = gf_bits_index(tmp_map);                  local->transaction.in_flight_sb_errno = local->replies[index]                                                              .op_errno;                  local->transaction.in_flight_sb = _gf_true; @@ -776,6 +774,7 @@ afr_spb_choice_timeout_cancel(xlator_t *this, inode_t *inode)      {          ret = __afr_inode_ctx_get(this, inode, &ctx);          if (ret < 0 || !ctx) { +            UNLOCK(&inode->lock);              gf_msg(this->name, GF_LOG_WARNING, 0,                     AFR_MSG_SPLIT_BRAIN_CHOICE_ERROR,                     "Failed to cancel split-brain choice timer."); @@ -788,8 +787,8 @@ afr_spb_choice_timeout_cancel(xlator_t *this, inode_t *inode)          }          ret = 0;      } -out:      UNLOCK(&inode->lock); +out:      return ret;  } @@ -865,10 +864,11 @@ afr_set_split_brain_choice(int ret, call_frame_t *frame, void *opaque)      {          ret = __afr_inode_ctx_get(this, inode, &ctx);          if (ret) { +            UNLOCK(&inode->lock);              gf_msg(this->name, GF_LOG_ERROR, 0,                     AFR_MSG_SPLIT_BRAIN_CHOICE_ERROR,                     "Failed to get inode_ctx for %s", loc->name); -            goto unlock; +            goto post_unlock;          }          old_spb_choice = ctx->spb_choice; @@ -936,6 +936,7 @@ afr_set_split_brain_choice(int ret, call_frame_t *frame, void *opaque)      }  unlock:      UNLOCK(&inode->lock); +post_unlock:      if (!timer_set)          inode_unref(inode);      if (timer_cancelled) @@ -3264,7 +3265,6 @@ afr_lookup_do(call_frame_t *frame, xlator_t *this, int err)      if (err < 0) {          local->op_errno = err; -        ret = -1;          goto out;      } @@ -3275,7 +3275,6 @@ afr_lookup_do(call_frame_t *frame, xlator_t *this, int err)                                         &local->loc);      if (ret) {          local->op_errno = -ret; -        ret = -1;          goto out;      } diff --git a/xlators/cluster/afr/src/afr-inode-read.c b/xlators/cluster/afr/src/afr-inode-read.c index 1dcef5c44d2..523a5b48880 100644 --- a/xlators/cluster/afr/src/afr-inode-read.c +++ b/xlators/cluster/afr/src/afr-inode-read.c @@ -1158,16 +1158,17 @@ afr_fgetxattr_pathinfo_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          ret = dict_set_dynstrn(local->dict, xattr_cky, xattr_cky_len, xattr);          if (ret) { +            UNLOCK(&frame->lock);              gf_msg(this->name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,                     "Cannot set xattr cookie key"); -            goto unlock; +            goto post_unlock;          }          local->cont.getxattr.xattr_len += strlen(xattr) + 1;      }  unlock:      UNLOCK(&frame->lock); - +post_unlock:      if (!callcnt) {          if (!local->cont.getxattr.xattr_len)              goto unwind; @@ -1281,16 +1282,17 @@ afr_getxattr_pathinfo_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          ret = dict_set_dynstrn(local->dict, xattr_cky, xattr_cky_len, xattr);          if (ret) { +            UNLOCK(&frame->lock);              gf_msg(this->name, GF_LOG_ERROR, -ret, AFR_MSG_DICT_SET_FAILED,                     "Cannot set xattr cookie key"); -            goto unlock; +            goto post_unlock;          }          local->cont.getxattr.xattr_len += strlen(xattr) + 1;      }  unlock:      UNLOCK(&frame->lock); - +post_unlock:      if (!callcnt) {          if (!local->cont.getxattr.xattr_len)              goto unwind; diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 912e3c6e104..5ce1864007b 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -3569,18 +3569,16 @@ dht_unlink_linkfile_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          if ((op_ret == -1) &&              !((op_errno == ENOENT) || (op_errno == ENOTCONN))) {              local->op_errno = op_errno; +            UNLOCK(&frame->lock);              gf_msg_debug(this->name, op_errno, -                         "Unlink link: subvolume %s" -                         " returned -1", -                         prev->name); -            goto unlock; +                         "Unlink link: subvolume %s returned -1", prev->name); +            goto post_unlock;          }          local->op_ret = 0;      } -unlock:      UNLOCK(&frame->lock); - +post_unlock:      dht_set_fixed_dir_stat(&local->preparent);      dht_set_fixed_dir_stat(&local->postparent);      DHT_STACK_UNWIND(unlink, frame, local->op_ret, local->op_errno, @@ -3610,9 +3608,10 @@ dht_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,              } else {                  local->op_ret = 0;              } +            UNLOCK(&frame->lock);              gf_msg_debug(this->name, op_errno,                           "Unlink: subvolume %s returned -1", prev->name); -            goto unlock; +            goto post_unlock;          }          local->op_ret = 0; @@ -3627,9 +3626,8 @@ dht_unlink_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,                                        &local->postparent, 1);          }      } -unlock:      UNLOCK(&frame->lock); - +post_unlock:      if (!local->op_ret) {          hashed_subvol = dht_subvol_get_hashed(this, &local->loc);          if (hashed_subvol && hashed_subvol != local->cached_subvol) { @@ -3695,16 +3693,16 @@ dht_err_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,      {          if (op_ret == -1) {              local->op_errno = op_errno; +            UNLOCK(&frame->lock);              gf_msg_debug(this->name, op_errno, "subvolume %s returned -1",                           prev->name); -            goto unlock; +            goto post_unlock;          }          local->op_ret = 0;      } -unlock:      UNLOCK(&frame->lock); - +post_unlock:      this_call_cnt = dht_frame_return(frame);      if (is_last_call(this_call_cnt)) {          if ((local->fop == GF_FOP_SETXATTR) || @@ -3816,11 +3814,14 @@ dht_setxattr_non_mds_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          if (op_ret && !local->op_ret) {              local->op_ret = op_ret;              local->op_errno = op_errno; +            UNLOCK(&frame->lock);              gf_msg_debug(this->name, op_errno, "subvolume %s returned -1",                           prev->this->name); +            goto post_unlock;          }      }      UNLOCK(&frame->lock); +post_unlock:      this_call_cnt = dht_frame_return(frame);      if (is_last_call(this_call_cnt)) { @@ -4249,11 +4250,12 @@ dht_find_local_subvol_cbk(call_frame_t *frame, void *cookie, xlator_t *this,      {          this_call_cnt = --local->call_cnt;          if (op_ret < 0) { -            gf_msg(this->name, GF_LOG_ERROR, op_errno, DHT_MSG_GET_XATTR_FAILED, -                   "getxattr err for dir");              local->op_ret = -1;              local->op_errno = op_errno; -            goto unlock; +            UNLOCK(&frame->lock); +            gf_msg(this->name, GF_LOG_ERROR, op_errno, DHT_MSG_GET_XATTR_FAILED, +                   "getxattr err for dir"); +            goto post_unlock;          }          ret = dict_get_str(xattr, local->xsel, &uuid_list); @@ -4279,13 +4281,12 @@ dht_find_local_subvol_cbk(call_frame_t *frame, void *cookie, xlator_t *this,               uuid_str = next_uuid_str) {              next_uuid_str = strtok_r(NULL, " ", &saveptr);              if (gf_uuid_parse(uuid_str, node_uuid)) { -                gf_msg(this->name, GF_LOG_ERROR, 0, DHT_MSG_UUID_PARSE_ERROR, -                       "Failed to parse uuid" -                       " for %s", -                       prev->name);                  local->op_ret = -1;                  local->op_errno = EINVAL; -                goto unlock; +                UNLOCK(&frame->lock); +                gf_msg(this->name, GF_LOG_ERROR, 0, DHT_MSG_UUID_PARSE_ERROR, +                       "Failed to parse uuid for %s", prev->name); +                goto post_unlock;              }              count++; @@ -4342,7 +4343,7 @@ dht_find_local_subvol_cbk(call_frame_t *frame, void *cookie, xlator_t *this,      local->op_ret = 0;  unlock:      UNLOCK(&frame->lock); - +post_unlock:      if (!is_last_call(this_call_cnt))          goto out; @@ -4383,23 +4384,28 @@ dht_vgetxattr_dir_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          this_call_cnt = --local->call_cnt;          if (op_ret < 0) {              if (op_errno != ENOTCONN) { -                gf_msg(this->name, GF_LOG_ERROR, op_errno, -                       DHT_MSG_GET_XATTR_FAILED, "getxattr err for dir");                  local->op_ret = -1;                  local->op_errno = op_errno; +                UNLOCK(&frame->lock); +                gf_msg(this->name, GF_LOG_ERROR, op_errno, +                       DHT_MSG_GET_XATTR_FAILED, "getxattr err for dir"); +                goto post_unlock;              }              goto unlock;          }          ret = dht_vgetxattr_alloc_and_fill(local, xattr, this, op_errno); -        if (ret) +        if (ret) { +            UNLOCK(&frame->lock);              gf_msg(this->name, GF_LOG_ERROR, op_errno, DHT_MSG_DICT_SET_FAILED,                     "alloc or fill failure"); +            goto post_unlock; +        }      }  unlock:      UNLOCK(&frame->lock); - +post_unlock:      if (!is_last_call(this_call_cnt))          goto out; @@ -4511,9 +4517,7 @@ dht_mds_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          local->op_ret = op_ret;          goto out;      } -    if (dict_get(xattr, conf->xattr_name)) { -        dict_del(xattr, conf->xattr_name); -    } +    dict_del(xattr, conf->xattr_name);      local->op_ret = 0;      if (!local->xattr) { @@ -4551,13 +4555,8 @@ dht_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,              goto unlock;          } -        if (dict_get(xattr, conf->xattr_name)) { -            dict_del(xattr, conf->xattr_name); -        } - -        if (dict_get(xattr, conf->mds_xattr_key)) { -            dict_del(xattr, conf->mds_xattr_key); -        } +        dict_del(xattr, conf->xattr_name); +        dict_del(xattr, conf->mds_xattr_key);          /* filter out following two xattrs that need not           * be visible on the mount point for geo-rep - @@ -4565,9 +4564,7 @@ dht_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,           * trusted.tier.tier-dht.commithash           */ -        if (dict_get(xattr, conf->commithash_xattr_name)) { -            dict_del(xattr, conf->commithash_xattr_name); -        } +        dict_del(xattr, conf->commithash_xattr_name);          if (frame->root->pid >= 0 && dht_is_tier_xlator(this)) {              dict_del(xattr, GF_XATTR_TIER_LAYOUT_FIXED_KEY); @@ -4660,13 +4657,14 @@ dht_getxattr_get_real_filename_cbk(call_frame_t *frame, void *cookie,                  local->op_ret = op_ret;                  local->op_errno = op_errno; +                UNLOCK(&frame->lock);                  gf_msg(this->name, GF_LOG_WARNING, op_errno,                         DHT_MSG_UPGRADE_BRICKS,                         "At least "                         "one of the bricks does not support "                         "this operation. Please upgrade all "                         "bricks."); -                goto unlock; +                goto post_unlock;              }              if (op_errno == ENOENT) { @@ -4681,9 +4679,10 @@ dht_getxattr_get_real_filename_cbk(call_frame_t *frame, void *cookie,               * down subvol and return a good result(if any)               * from other subvol.               */ +            UNLOCK(&frame->lock);              gf_msg(this->name, GF_LOG_WARNING, op_errno,                     DHT_MSG_GET_XATTR_FAILED, "Failed to get real filename."); -            goto unlock; +            goto post_unlock;          }          /* This subvol has the required file. @@ -4704,13 +4703,13 @@ dht_getxattr_get_real_filename_cbk(call_frame_t *frame, void *cookie,          local->op_ret = op_ret;          local->op_errno = 0; -        gf_msg_debug(this->name, 0, -                     "Found a matching " -                     "file."); +        UNLOCK(&frame->lock); +        gf_msg_debug(this->name, 0, "Found a matching file."); +        goto post_unlock;      }  unlock:      UNLOCK(&frame->lock); - +post_unlock:      this_call_cnt = dht_frame_return(frame);      if (is_last_call(this_call_cnt)) {          DHT_STACK_UNWIND(getxattr, frame, local->op_ret, local->op_errno, @@ -6061,16 +6060,16 @@ dht_removexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,      {          if (op_ret == -1) {              local->op_errno = op_errno; +            UNLOCK(&frame->lock);              gf_msg_debug(this->name, op_errno, "subvolume %s returned -1",                           prev->name); -            goto unlock; +            goto post_unlock;          }          local->op_ret = 0;      } -unlock:      UNLOCK(&frame->lock); - +post_unlock:      this_call_cnt = dht_frame_return(frame);      if (is_last_call(this_call_cnt)) {          DHT_STACK_UNWIND(removexattr, frame, local->op_ret, local->op_errno, @@ -6257,16 +6256,16 @@ dht_fd_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,      {          if (op_ret == -1) {              local->op_errno = op_errno; +            UNLOCK(&frame->lock);              gf_msg_debug(this->name, op_errno, "subvolume %s returned -1",                           prev->name); -            goto unlock; +            goto post_unlock;          }          local->op_ret = 0;      } -unlock:      UNLOCK(&frame->lock); - +post_unlock:      this_call_cnt = dht_frame_return(frame);      if (is_last_call(this_call_cnt))          DHT_STACK_UNWIND(open, frame, local->op_ret, local->op_errno, local->fd, @@ -7146,12 +7145,10 @@ dht_fsyncdir_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,      {          if (op_ret == -1)              local->op_errno = op_errno; - -        if (op_ret == 0) +        else if (op_ret == 0)              local->op_ret = 0;      }      UNLOCK(&frame->lock); -      this_call_cnt = dht_frame_return(frame);      if (is_last_call(this_call_cnt))          DHT_STACK_UNWIND(fsyncdir, frame, local->op_ret, local->op_errno, diff --git a/xlators/cluster/dht/src/dht-hashfn.c b/xlators/cluster/dht/src/dht-hashfn.c index 16ee6d2d405..3def6b17666 100644 --- a/xlators/cluster/dht/src/dht-hashfn.c +++ b/xlators/cluster/dht/src/dht-hashfn.c @@ -74,29 +74,30 @@ dht_hash_compute(xlator_t *this, int type, const char *name, uint32_t *hash_p)      priv = this->private; +    len = strlen(name) + 1; +    rsync_friendly_name = alloca(len); +      LOCK(&priv->lock);      {          if (priv->extra_regex_valid) { -            len = strlen(name) + 1; -            rsync_friendly_name = alloca(len);              munged = dht_munge_name(name, rsync_friendly_name, len,                                      &priv->extra_regex);          }          if (!munged && priv->rsync_regex_valid) { -            len = strlen(name) + 1; -            rsync_friendly_name = alloca(len);              gf_msg_trace(this->name, 0, "trying regex for %s", name);              munged = dht_munge_name(name, rsync_friendly_name, len,                                      &priv->rsync_regex);              if (munged) { +                UNLOCK(&priv->lock);                  gf_msg_debug(this->name, 0, "munged down to %s",                               rsync_friendly_name); +                goto post_unlock;              }          }      }      UNLOCK(&priv->lock); - +post_unlock:      if (!munged) {          rsync_friendly_name = (char *)name;      } diff --git a/xlators/cluster/dht/src/dht-helper.c b/xlators/cluster/dht/src/dht-helper.c index 12e7a4fd2c2..1a5ba256ffd 100644 --- a/xlators/cluster/dht/src/dht-helper.c +++ b/xlators/cluster/dht/src/dht-helper.c @@ -94,12 +94,13 @@ dht_fd_ctx_set(xlator_t *this, fd_t *fd, xlator_t *dst)                  goto unlock;              } else {                  /* This would be a big problem*/ +                /* Overwrite and hope for the best*/ +                fd_ctx->opened_on_dst = (uint64_t)(uintptr_t)dst; +                UNLOCK(&fd->lock);                  gf_msg(this->name, GF_LOG_WARNING, 0, DHT_MSG_INVALID_VALUE,                         "Different dst found in the fd ctx"); -                /* Overwrite and hope for the best*/ -                fd_ctx->opened_on_dst = (uint64_t)(uintptr_t)dst; -                goto unlock; +                goto out;              }          }          ret = __dht_fd_ctx_set(this, fd, dst); @@ -124,13 +125,13 @@ dht_fd_ctx_get(xlator_t *this, fd_t *fd)      {          ret = __fd_ctx_get(fd, this, &tmp_val);          if ((ret < 0) || (tmp_val == 0)) { -            UNLOCK(&fd->lock); -            goto out; +            goto unlock;          }          fd_ctx = (dht_fd_ctx_t *)(uintptr_t)tmp_val;          GF_REF_GET(fd_ctx);      } +unlock:      UNLOCK(&fd->lock);  out: @@ -2134,16 +2135,15 @@ dht_get_lock_subvolume(xlator_t *this, struct gf_flock *lock,          ret = __dht_lock_subvol_set(inode, this, cached_subvol);          if (ret) {              gf_uuid_unparse(inode->gfid, gfid); +            UNLOCK(&inode->lock);              gf_msg(this->name, GF_LOG_WARNING, 0, DHT_MSG_SET_INODE_CTX_FAILED, -                   "Failed to set lock_subvol in " -                   "inode ctx for gfid %s", -                   gfid); -            goto unlock; +                   "Failed to set lock_subvol in inode ctx for gfid %s", gfid); +            goto post_unlock;          }          subvol = cached_subvol;      } -unlock:      UNLOCK(&inode->lock); +post_unlock:      if (!subvol && inode && lock->l_type != F_UNLCK) {          inode_unref(inode);      } diff --git a/xlators/cluster/dht/src/dht-inode-read.c b/xlators/cluster/dht/src/dht-inode-read.c index f46370a9208..cacfe353272 100644 --- a/xlators/cluster/dht/src/dht-inode-read.c +++ b/xlators/cluster/dht/src/dht-inode-read.c @@ -272,19 +272,19 @@ dht_attr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,      {          if (op_ret == -1) {              local->op_errno = op_errno; +            UNLOCK(&frame->lock);              gf_msg_debug(this->name, op_errno, "subvolume %s returned -1",                           prev->name); -            goto unlock; +            goto post_unlock;          }          dht_iatt_merge(this, &local->stbuf, stbuf);          local->op_ret = 0;      } -unlock:      UNLOCK(&frame->lock); - +post_unlock:      this_call_cnt = dht_frame_return(frame);      if (is_last_call(this_call_cnt)) {          DHT_STACK_UNWIND(stat, frame, local->op_ret, local->op_errno, diff --git a/xlators/cluster/dht/src/dht-inode-write.c b/xlators/cluster/dht/src/dht-inode-write.c index d0d12fd7658..b26b7058d3e 100644 --- a/xlators/cluster/dht/src/dht-inode-write.c +++ b/xlators/cluster/dht/src/dht-inode-write.c @@ -1113,9 +1113,10 @@ dht_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,      {          if (op_ret == -1) {              local->op_errno = op_errno; +            UNLOCK(&frame->lock);              gf_msg_debug(this->name, op_errno, "subvolume %s returned -1",                           prev->name); -            goto unlock; +            goto post_unlock;          }          dht_iatt_merge(this, &local->prebuf, statpre); @@ -1124,9 +1125,8 @@ dht_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,          local->op_ret = 0;          local->op_errno = 0;      } -unlock:      UNLOCK(&frame->lock); - +post_unlock:      this_call_cnt = dht_frame_return(frame);      if (is_last_call(this_call_cnt)) {          if (local->op_ret == 0) @@ -1151,24 +1151,22 @@ dht_non_mds_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,      local = frame->local;      prev = cookie; +    if (op_ret == -1) { +        gf_msg(this->name, op_errno, 0, 0, "subvolume %s returned -1", +               prev->name); +        goto post_unlock; +    } +      LOCK(&frame->lock);      { -        if (op_ret == -1) { -            gf_msg(this->name, op_errno, 0, 0, "subvolume %s returned -1", -                   prev->name); - -            goto unlock; -        } -          dht_iatt_merge(this, &local->prebuf, statpre);          dht_iatt_merge(this, &local->stbuf, statpost);          local->op_ret = 0;          local->op_errno = 0;      } -unlock:      UNLOCK(&frame->lock); - +post_unlock:      this_call_cnt = dht_frame_return(frame);      if (is_last_call(this_call_cnt)) {          dht_inode_ctx_time_set(local->loc.inode, this, &local->stbuf); diff --git a/xlators/features/barrier/src/barrier.c b/xlators/features/barrier/src/barrier.c index 4f8fa211d0b..a601c7fa04f 100644 --- a/xlators/features/barrier/src/barrier.c +++ b/xlators/features/barrier/src/barrier.c @@ -461,7 +461,7 @@ out:  int  notify(xlator_t *this, int event, void *data, ...)  { -    barrier_priv_t *priv = NULL; +    barrier_priv_t *priv = this->private;      dict_t *dict = NULL;      int ret = -1;      int barrier_enabled = _gf_false; @@ -469,7 +469,6 @@ notify(xlator_t *this, int event, void *data, ...)          0,      }; -    priv = this->private;      GF_ASSERT(priv);      INIT_LIST_HEAD(&queue); @@ -491,19 +490,23 @@ notify(xlator_t *this, int event, void *data, ...)                      if (barrier_enabled) {                          ret = __barrier_enable(this, priv);                      } else { +                        UNLOCK(&priv->lock);                          gf_log(this->name, GF_LOG_ERROR, "Already disabled."); +                        goto post_unlock;                      }                  } else {                      if (!barrier_enabled) {                          __barrier_disable(this, &queue);                          ret = 0;                      } else { +                        UNLOCK(&priv->lock);                          gf_log(this->name, GF_LOG_ERROR, "Already enabled"); +                        goto post_unlock;                      }                  }              }              UNLOCK(&priv->lock); - +        post_unlock:              if (!list_empty(&queue))                  barrier_dequeue_all(this, &queue); diff --git a/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c b/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c index 35318dcfa4e..a6beb2edb92 100644 --- a/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c +++ b/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c @@ -720,8 +720,10 @@ br_scrubber_exit_control(xlator_t *this)          if (scrub_monitor->state == BR_SCRUB_STATE_ACTIVE) {              (void)br_fsscan_activate(this);          } else { +            UNLOCK(&scrub_monitor->lock);              gf_msg(this->name, GF_LOG_INFO, 0, BRB_MSG_SCRUB_INFO,                     "Volume waiting to get rescheduled.."); +            return;          }      }      UNLOCK(&scrub_monitor->lock); diff --git a/xlators/features/locks/src/posix.c b/xlators/features/locks/src/posix.c index 0feb11e3b78..3f1c7a733ff 100644 --- a/xlators/features/locks/src/posix.c +++ b/xlators/features/locks/src/posix.c @@ -504,7 +504,9 @@ pl_check_n_create_fdctx(xlator_t *this, fd_t *fd)          if (ret != 0) {              GF_FREE(fdctx);              fdctx = NULL; +            UNLOCK(&fd->lock);              gf_log(this->name, GF_LOG_DEBUG, "failed to set fd ctx"); +            goto out;          }      }  unlock: diff --git a/xlators/features/quota/src/quota.c b/xlators/features/quota/src/quota.c index 8812a301924..a0c236d4cf6 100644 --- a/xlators/features/quota/src/quota.c +++ b/xlators/features/quota/src/quota.c @@ -3292,12 +3292,11 @@ quota_stat_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          goto out;      } -    LOCK(&ctx->lock); -    { -        if (buf) -            ctx->buf = *buf; +    if (buf) { +        LOCK(&ctx->lock); +        ctx->buf = *buf; +        UNLOCK(&ctx->lock);      } -    UNLOCK(&ctx->lock);  out:      QUOTA_STACK_UNWIND(stat, frame, op_ret, op_errno, buf, xdata); @@ -3371,12 +3370,11 @@ quota_fstat_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          goto out;      } -    LOCK(&ctx->lock); -    { -        if (buf) -            ctx->buf = *buf; +    if (buf) { +        LOCK(&ctx->lock); +        ctx->buf = *buf; +        UNLOCK(&ctx->lock);      } -    UNLOCK(&ctx->lock);  out:      QUOTA_STACK_UNWIND(fstat, frame, op_ret, op_errno, buf, xdata); @@ -3666,12 +3664,11 @@ quota_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          goto out;      } -    LOCK(&ctx->lock); -    { -        if (statpost) -            ctx->buf = *statpost; +    if (statpost) { +        LOCK(&ctx->lock); +        ctx->buf = *statpost; +        UNLOCK(&ctx->lock);      } -    UNLOCK(&ctx->lock);  out:      QUOTA_STACK_UNWIND(setattr, frame, op_ret, op_errno, statpre, statpost, diff --git a/xlators/lib/src/libxlator.c b/xlators/lib/src/libxlator.c index e1a22b60340..075229dae76 100644 --- a/xlators/lib/src/libxlator.c +++ b/xlators/lib/src/libxlator.c @@ -198,10 +198,11 @@ cluster_markerxtime_cbk(call_frame_t *frame, void *cookie, xlator_t *this,          }          if (dict_get_ptr(dict, marker_xattr, (void **)&net_timebuf)) { +            local->count[MCNT_NOTFOUND]++; +            UNLOCK(&frame->lock);              gf_log(this->name, GF_LOG_WARNING,                     "Unable to get <uuid>.xtime attr"); -            local->count[MCNT_NOTFOUND]++; -            goto unlock; +            goto post_unlock;          }          if (local->count[MCNT_FOUND]) { @@ -221,7 +222,7 @@ cluster_markerxtime_cbk(call_frame_t *frame, void *cookie, xlator_t *this,      }  unlock:      UNLOCK(&frame->lock); - +post_unlock:      if (callcnt == 0)          cluster_marker_unwind(frame, marker_xattr, local->net_timebuf, 8, dict); diff --git a/xlators/meta/src/frames-file.c b/xlators/meta/src/frames-file.c index 995d7680e9b..9a13db9a934 100644 --- a/xlators/meta/src/frames-file.c +++ b/xlators/meta/src/frames-file.c @@ -30,9 +30,10 @@ frames_file_fill(xlator_t *this, inode_t *file, strfd_t *strfd)      pool = this->ctx->pool; +    strprintf(strfd, "{ \n\t\"Stack\": [\n"); +      LOCK(&pool->lock);      { -        strprintf(strfd, "{ \n\t\"Stack\": [\n");          list_for_each_entry(stack, &pool->all_frames, all_frames)          {              strprintf(strfd, "\t   {\n");  | 
