diff options
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 27 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-common.h | 19 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-helper.c | 29 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-inode-read.c | 42 | ||||
| -rw-r--r-- | xlators/cluster/dht/src/dht-inode-write.c | 16 | 
5 files changed, 116 insertions, 17 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index d9c6af27298..0ce2da34cb7 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -51,6 +51,17 @@ dht_set_dir_xattr_req(xlator_t *this, loc_t *loc, dict_t *xattr_req);  int  dht_do_fresh_lookup(call_frame_t *frame, xlator_t *this, loc_t *loc); +/* Check the xdata to make sure EBADF has been set by client xlator */ +int32_t +dht_check_remote_fd_failed_error(dht_local_t *local, int op_ret, int op_errno) +{ +    if (op_ret == -1 && (op_errno == EBADF || op_errno == EBADFD) && +        !(local->fd_checked)) { +        return 1; +    } +    return 0; +} +  /* Sets the blocks and size values to fixed values. This is to be called   * only for dirs. The caller is responsible for checking the type   */ @@ -4527,6 +4538,7 @@ dht_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,      int this_call_cnt = 0;      dht_local_t *local = NULL;      dht_conf_t *conf = NULL; +    int ret = 0;      VALIDATE_OR_GOTO(frame, err);      VALIDATE_OR_GOTO(frame->local, err); @@ -4535,6 +4547,13 @@ dht_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,      conf = this->private;      local = frame->local; +    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) { +        ret = dht_check_and_open_fd_on_subvol(this, frame); +        if (ret) +            goto err; +        return 0; +    } +      LOCK(&frame->lock);      {          if (!xattr || (op_ret == -1)) { @@ -5202,8 +5221,8 @@ dht_file_setxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,      local->op_errno = op_errno; -    if ((local->fop == GF_FOP_FSETXATTR) && op_ret == -1 && -        (op_errno == EBADF) && !(local->fd_checked)) { +    if ((local->fop == GF_FOP_FSETXATTR) && +        dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {          ret = dht_check_and_open_fd_on_subvol(this, frame);          if (ret)              goto out; @@ -5927,8 +5946,8 @@ dht_file_removexattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,      local->op_errno = op_errno; -    if ((local->fop == GF_FOP_FREMOVEXATTR) && (op_ret == -1) && -        (op_errno == EBADF) && !(local->fd_checked)) { +    if ((local->fop == GF_FOP_FREMOVEXATTR) && +        dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {          ret = dht_check_and_open_fd_on_subvol(this, frame);          if (ret)              goto out; diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index 0389b534d5f..4147f8f5b0c 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -1228,6 +1228,22 @@ dht_newfile_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,                  struct iatt *preparent, struct iatt *postparent, dict_t *xdata);  int +dht_finodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this, +                 int32_t op_ret, int32_t op_errno, dict_t *xdata); + +int +dht_getxattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret, +                 int op_errno, dict_t *xattr, dict_t *xdata); + +int +dht_common_xattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this, +                       int32_t op_ret, int32_t op_errno, dict_t *dict, +                       dict_t *xdata); +int +dht_fxattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this, +                 int32_t op_ret, int32_t op_errno, dict_t *dict, dict_t *xdata); + +int  gf_defrag_status_get(dht_conf_t *conf, dict_t *dict);  void @@ -1523,4 +1539,7 @@ int  dht_pt_rename(call_frame_t *frame, xlator_t *this, loc_t *oldloc, loc_t *newloc,                dict_t *xdata); +int32_t +dht_check_remote_fd_failed_error(dht_local_t *local, int op_ret, int op_errno); +  #endif /* _DHT_H */ diff --git a/xlators/cluster/dht/src/dht-helper.c b/xlators/cluster/dht/src/dht-helper.c index c7bc8c3aaf2..8a54355f92b 100644 --- a/xlators/cluster/dht/src/dht-helper.c +++ b/xlators/cluster/dht/src/dht-helper.c @@ -365,6 +365,23 @@ dht_check_and_open_fd_on_subvol_complete(int ret, call_frame_t *frame,              break; +        case GF_FOP_FXATTROP: +            STACK_WIND(frame, dht_common_xattrop_cbk, subvol, +                       subvol->fops->fxattrop, local->fd, +                       local->rebalance.flags, local->rebalance.xattr, +                       local->xattr_req); +            break; + +        case GF_FOP_FGETXATTR: +            STACK_WIND(frame, dht_getxattr_cbk, subvol, subvol->fops->fgetxattr, +                       local->fd, local->key, NULL); +            break; + +        case GF_FOP_FINODELK: +            STACK_WIND(frame, dht_finodelk_cbk, subvol, subvol->fops->finodelk, +                       local->key, local->fd, local->rebalance.lock_cmd, +                       &local->rebalance.flock, local->xattr_req); +            break;          default:              gf_msg(this->name, GF_LOG_ERROR, 0, DHT_MSG_UNKNOWN_FOP,                     "Unknown FOP on fd (%p) on file %s @ %s", fd, @@ -428,6 +445,18 @@ handle_err:              DHT_STACK_UNWIND(fremovexattr, frame, -1, op_errno, NULL);              break; +        case GF_FOP_FXATTROP: +            DHT_STACK_UNWIND(fxattrop, frame, -1, op_errno, NULL, NULL); +            break; + +        case GF_FOP_FGETXATTR: +            DHT_STACK_UNWIND(fgetxattr, frame, -1, op_errno, NULL, NULL); +            break; + +        case GF_FOP_FINODELK: +            DHT_STACK_UNWIND(finodelk, frame, -1, op_errno, NULL); +            break; +          default:              gf_msg(this->name, GF_LOG_ERROR, 0, DHT_MSG_UNKNOWN_FOP,                     "Unknown FOP on fd (%p) on file %s @ %s", fd, diff --git a/xlators/cluster/dht/src/dht-inode-read.c b/xlators/cluster/dht/src/dht-inode-read.c index cacfe353272..0c209a52312 100644 --- a/xlators/cluster/dht/src/dht-inode-read.c +++ b/xlators/cluster/dht/src/dht-inode-read.c @@ -162,8 +162,8 @@ dht_file_attr_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,      local = frame->local;      prev = cookie; -    if ((local->fop == GF_FOP_FSTAT) && (op_ret == -1) && (op_errno == EBADF) && -        !(local->fd_checked)) { +    if ((local->fop == GF_FOP_FSTAT) && +        dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {          ret = dht_check_and_open_fd_on_subvol(this, frame);          if (ret)              goto out; @@ -431,7 +431,7 @@ dht_readv_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,      if (local->call_cnt != 1)          goto out; -    if (op_ret == -1 && (op_errno == EBADF) && !(local->fd_checked)) { +    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {          ret = dht_check_and_open_fd_on_subvol(this, frame);          if (ret)              goto out; @@ -703,7 +703,7 @@ dht_flush_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,      if (local->call_cnt != 1)          goto out; -    if (op_ret == -1 && (op_errno == EBADF) && !(local->fd_checked)) { +    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {          ret = dht_check_and_open_fd_on_subvol(this, frame);          if (ret)              goto out; @@ -820,7 +820,7 @@ dht_fsync_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,      local->op_errno = op_errno; -    if (op_ret == -1 && (op_errno == EBADF) && !(local->fd_checked)) { +    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {          ret = dht_check_and_open_fd_on_subvol(this, frame);          if (ret)              goto out; @@ -1223,6 +1223,13 @@ dht_common_xattrop_cbk(call_frame_t *frame, void *cookie, xlator_t *this,      if (local->call_cnt != 1)          goto out; +    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) { +        ret = dht_check_and_open_fd_on_subvol(this, frame); +        if (ret) +            goto out; +        return 0; +    } +      ret = dht_read_iatt_from_xdata(this, xdata, &stbuf);      if ((!op_ret) && (ret)) { @@ -1535,8 +1542,26 @@ dht_finodelk_cbk(call_frame_t *frame, void *cookie, xlator_t *this,                   int32_t op_ret, int32_t op_errno, dict_t *xdata)  { +    dht_local_t *local = NULL; +    int ret = 0; + +    GF_VALIDATE_OR_GOTO("dht", frame, out); +    GF_VALIDATE_OR_GOTO("dht", this, out); +    GF_VALIDATE_OR_GOTO("dht", frame->local, out); + +    local = frame->local; + +    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) { +        ret = dht_check_and_open_fd_on_subvol(this, frame); +        if (ret) +            goto out; +        return 0; +    } + +out:      dht_lk_inode_unref(frame, op_ret);      DHT_STACK_UNWIND(finodelk, frame, op_ret, op_errno, xdata); +      return 0;  } @@ -1574,6 +1599,13 @@ dht_finodelk(call_frame_t *frame, xlator_t *this, const char *volume, fd_t *fd,              if (ret)                      goto err;      */ +    local->rebalance.flock = *lock; +    local->rebalance.lock_cmd = cmd; +    local->key = gf_strdup(volume); + +    if (xdata) +        local->xattr_req = dict_ref(xdata); +      STACK_WIND(frame, dht_finodelk_cbk, lock_subvol,                 lock_subvol->fops->finodelk, volume, fd, cmd, lock, xdata); diff --git a/xlators/cluster/dht/src/dht-inode-write.c b/xlators/cluster/dht/src/dht-inode-write.c index b26b7058d3e..b6b349d64ed 100644 --- a/xlators/cluster/dht/src/dht-inode-write.c +++ b/xlators/cluster/dht/src/dht-inode-write.c @@ -49,7 +49,7 @@ dht_writev_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,       * We only check once as this could be a valid bad fd error.       */ -    if (op_ret == -1 && (op_errno == EBADF) && !(local->fd_checked)) { +    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {          ret = dht_check_and_open_fd_on_subvol(this, frame);          if (ret)              goto out; @@ -262,8 +262,8 @@ dht_truncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,       * We only check once as this could actually be a valid error.       */ -    if ((local->fop == GF_FOP_FTRUNCATE) && (op_ret == -1) && -        ((op_errno == EBADF) || (op_errno == EINVAL)) && !(local->fd_checked)) { +    if ((local->fop == GF_FOP_FTRUNCATE) && +        dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {          ret = dht_check_and_open_fd_on_subvol(this, frame);          if (ret)              goto out; @@ -489,7 +489,7 @@ dht_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,       * We only check once as this could actually be a valid error.       */ -    if ((op_ret == -1) && (op_errno == EBADF) && !(local->fd_checked)) { +    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {          ret = dht_check_and_open_fd_on_subvol(this, frame);          if (ret)              goto out; @@ -666,7 +666,7 @@ dht_discard_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,       * and a lookup updated the cached subvol in the inode ctx.       * We only check once as this could actually be a valid error.       */ -    if ((op_ret == -1) && (op_errno == EBADF) && !(local->fd_checked)) { +    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {          ret = dht_check_and_open_fd_on_subvol(this, frame);          if (ret)              goto out; @@ -838,7 +838,7 @@ dht_zerofill_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int op_ret,       * and a lookup updated the cached subvol in the inode ctx.       * We only check once as this could actually be a valid error.       */ -    if ((op_ret == -1) && (op_errno == EBADF) && !(local->fd_checked)) { +    if (dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {          ret = dht_check_and_open_fd_on_subvol(this, frame);          if (ret)              goto out; @@ -1005,8 +1005,8 @@ dht_file_setattr_cbk(call_frame_t *frame, void *cookie, xlator_t *this,      local->op_errno = op_errno; -    if ((local->fop == GF_FOP_FSETATTR) && (op_ret == -1) && -        (op_errno == EBADF) && !(local->fd_checked)) { +    if ((local->fop == GF_FOP_FSETATTR) && +        dht_check_remote_fd_failed_error(local, op_ret, op_errno)) {          ret = dht_check_and_open_fd_on_subvol(this, frame);          if (ret)              goto out;  | 
