diff options
Diffstat (limited to 'xlators/cluster/ec/src/ec-dir-write.c')
| -rw-r--r-- | xlators/cluster/ec/src/ec-dir-write.c | 150 | 
1 files changed, 96 insertions, 54 deletions
diff --git a/xlators/cluster/ec/src/ec-dir-write.c b/xlators/cluster/ec/src/ec-dir-write.c index e1bbf7bae15..e8d96272987 100644 --- a/xlators/cluster/ec/src/ec-dir-write.c +++ b/xlators/cluster/ec/src/ec-dir-write.c @@ -149,9 +149,8 @@ int32_t ec_manager_create(ec_fop_data_t * fop, int32_t state)              LOCK(&fop->fd->lock);              ctx = __ec_fd_get(fop->fd, fop->xl); -            if ((ctx == NULL) || !ec_loc_from_loc(fop->xl, &ctx->loc, -                &fop->loc[0])) -            { +            if ((ctx == NULL) || +                (ec_loc_from_loc(fop->xl, &ctx->loc, &fop->loc[0])) != 0) {                  UNLOCK(&fop->fd->lock);                  fop->error = EIO; @@ -194,6 +193,18 @@ int32_t ec_manager_create(ec_fop_data_t * fop, int32_t state)                  return EC_STATE_REPORT;              } +            if (ec_dict_set_number(fop->xdata, EC_XATTR_VERSION, 0) != 0) { +                fop->error = EIO; + +                return EC_STATE_REPORT; +            } + +            if (ec_dict_set_number(fop->xdata, EC_XATTR_SIZE, 0) != 0) { +                fop->error = EIO; + +                return EC_STATE_REPORT; +            } +              /* We need to write to specific offsets on the bricks, so we               * need to remove O_APPEND from flags (if present) */              fop->int32 &= ~(O_ACCMODE | O_APPEND); @@ -224,27 +235,27 @@ int32_t ec_manager_create(ec_fop_data_t * fop, int32_t state)                          cbk->op_errno = EIO;                      }                  } -                if (cbk->op_ret < 0) -                { -                    ec_fop_set_error(fop, cbk->op_errno); -                } -                else -                { +                if (cbk->op_ret >= 0) {                      ec_iatt_rebuild(fop->xl->private, cbk->iatt, 3,                                      cbk->count); -                    ec_loc_prepare(fop->xl, &fop->loc[0], cbk->inode, -                                   &cbk->iatt[0]); +                    if (ec_loc_update(fop->xl, &fop->loc[0], cbk->inode, +                                      &cbk->iatt[0]) != 0) { +                        cbk->op_ret = -1; +                        cbk->op_errno = EIO; +                    } else { +                        LOCK(&fop->fd->lock); -                    LOCK(&fop->fd->lock); +                        ctx = __ec_fd_get(fop->fd, fop->xl); +                        if (ctx != NULL) { +                            ctx->open |= cbk->mask; +                        } -                    ctx = __ec_fd_get(fop->fd, fop->xl); -                    if (ctx != NULL) -                    { -                        ctx->open |= cbk->mask; +                        UNLOCK(&fop->fd->lock);                      } - -                    UNLOCK(&fop->fd->lock); +                } +                if (cbk->op_ret < 0) { +                    ec_fop_set_error(fop, cbk->op_errno);                  }              }              else @@ -514,22 +525,21 @@ int32_t ec_manager_link(ec_fop_data_t * fop, int32_t state)                          cbk->op_errno = EIO;                      }                  } -                if (cbk->op_ret < 0) -                { -                    ec_fop_set_error(fop, cbk->op_errno); -                } -                else -                { +                if (cbk->op_ret >= 0) {                      ec_iatt_rebuild(fop->xl->private, cbk->iatt, 3,                                      cbk->count); - -                    ec_loc_prepare(fop->xl, &fop->loc[0], cbk->inode, -                                   &cbk->iatt[0]); - -                    if (cbk->iatt[0].ia_type == IA_IFREG) -                    { +                    if (cbk->iatt[0].ia_type == IA_IFREG) {                          cbk->iatt[0].ia_size = fop->pre_size;                      } + +                    if (ec_loc_update(fop->xl, &fop->loc[0], cbk->inode, +                                      &cbk->iatt[0]) != 0) { +                        cbk->op_ret = -1; +                        cbk->op_errno = EIO; +                    } +                } +                if (cbk->op_ret < 0) { +                    ec_fop_set_error(fop, cbk->op_errno);                  }              }              else @@ -758,6 +768,23 @@ int32_t ec_manager_mkdir(ec_fop_data_t * fop, int32_t state)      switch (state)      {          case EC_STATE_INIT: +            if (fop->xdata == NULL) { +                fop->xdata = dict_new(); +                if (fop->xdata == NULL) { +                    fop->error = EIO; + +                    return EC_STATE_REPORT; +                } +            } + +            if (ec_dict_set_number(fop->xdata, EC_XATTR_VERSION, 0) != 0) { +                fop->error = EIO; + +                return EC_STATE_REPORT; +            } + +        /* Fall through */ +          case EC_STATE_LOCK:              ec_lock_prepare_entry(fop, &fop->loc[0], 1);              ec_lock(fop); @@ -781,17 +808,18 @@ int32_t ec_manager_mkdir(ec_fop_data_t * fop, int32_t state)                          cbk->op_errno = EIO;                      }                  } -                if (cbk->op_ret < 0) -                { -                    ec_fop_set_error(fop, cbk->op_errno); -                } -                else -                { +                if (cbk->op_ret >= 0) {                      ec_iatt_rebuild(fop->xl->private, cbk->iatt, 3,                                      cbk->count); -                    ec_loc_prepare(fop->xl, &fop->loc[0], cbk->inode, -                                   &cbk->iatt[0]); +                    if (ec_loc_update(fop->xl, &fop->loc[0], cbk->inode, +                                      &cbk->iatt[0]) != 0) { +                        cbk->op_ret = -1; +                        cbk->op_errno = EIO; +                    } +                } +                if (cbk->op_ret < 0) { +                    ec_fop_set_error(fop, cbk->op_errno);                  }              }              else @@ -1042,6 +1070,18 @@ int32_t ec_manager_mknod(ec_fop_data_t * fop, int32_t state)                      return EC_STATE_REPORT;                  } + +                if (ec_dict_set_number(fop->xdata, EC_XATTR_VERSION, 0) != 0) { +                    fop->error = EIO; + +                    return EC_STATE_REPORT; +                } + +                if (ec_dict_set_number(fop->xdata, EC_XATTR_SIZE, 0) != 0) { +                    fop->error = EIO; + +                    return EC_STATE_REPORT; +                }              }          /* Fall through */ @@ -1069,17 +1109,18 @@ int32_t ec_manager_mknod(ec_fop_data_t * fop, int32_t state)                          cbk->op_errno = EIO;                      }                  } -                if (cbk->op_ret < 0) -                { -                    ec_fop_set_error(fop, cbk->op_errno); -                } -                else -                { +                if (cbk->op_ret >= 0) {                      ec_iatt_rebuild(fop->xl->private, cbk->iatt, 3,                                      cbk->count); -                    ec_loc_prepare(fop->xl, &fop->loc[0], cbk->inode, -                                   &cbk->iatt[0]); +                    if (ec_loc_update(fop->xl, &fop->loc[0], cbk->inode, +                                      &cbk->iatt[0]) != 0) { +                        cbk->op_ret = -1; +                        cbk->op_errno = EIO; +                    } +                } +                if (cbk->op_ret < 0) { +                    ec_fop_set_error(fop, cbk->op_errno);                  }              }              else @@ -1830,17 +1871,18 @@ int32_t ec_manager_symlink(ec_fop_data_t * fop, int32_t state)                          cbk->op_errno = EIO;                      }                  } -                if (cbk->op_ret < 0) -                { -                    ec_fop_set_error(fop, cbk->op_errno); -                } -                else -                { +                if (cbk->op_ret >= 0) {                      ec_iatt_rebuild(fop->xl->private, cbk->iatt, 3,                                      cbk->count); -                    ec_loc_prepare(fop->xl, &fop->loc[0], cbk->inode, -                                   &cbk->iatt[0]); +                    if (ec_loc_update(fop->xl, &fop->loc[0], cbk->inode, +                                      &cbk->iatt[0]) != 0) { +                        cbk->op_ret = -1; +                        cbk->op_errno = EIO; +                    } +                } +                if (cbk->op_ret < 0) { +                    ec_fop_set_error(fop, cbk->op_errno);                  }              }              else  | 
