diff options
| -rw-r--r-- | xlators/cluster/ec/src/ec-combine.c | 14 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-dir-read.c | 2 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-dir-write.c | 2 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-generic.c | 2 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-heal.c | 62 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-inode-read.c | 4 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-inode-write.c | 4 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-locks.c | 6 | ||||
| -rw-r--r-- | xlators/cluster/ec/src/ec-method.c | 9 | 
9 files changed, 66 insertions, 39 deletions
diff --git a/xlators/cluster/ec/src/ec-combine.c b/xlators/cluster/ec/src/ec-combine.c index 07d819a9a3d..3d088d9be4a 100644 --- a/xlators/cluster/ec/src/ec-combine.c +++ b/xlators/cluster/ec/src/ec-combine.c @@ -366,18 +366,26 @@ int32_t ec_dict_data_merge(ec_cbk_data_t * cbk, int32_t which, char * key)          return -1;      } -    if (dict_unserialize(data[0]->data, data[0]->len, &lockinfo) != 0) +    lockinfo = dict_new(); +    if (lockinfo == NULL)      {          return -1;      } +    if (dict_unserialize(data[0]->data, data[0]->len, &lockinfo) != 0) +    { +        goto out; +    } +      for (i = 1; i < num; i++)      { -        if (dict_unserialize(data[i]->data, data[i]->len, &tmp) != 0) +        tmp = dict_new(); +        if (tmp == NULL)          {              goto out;          } -        if (dict_copy(tmp, lockinfo) == NULL) +        if ((dict_unserialize(data[i]->data, data[i]->len, &tmp) != 0) || +            (dict_copy(tmp, lockinfo) == NULL))          {              dict_unref(tmp); diff --git a/xlators/cluster/ec/src/ec-dir-read.c b/xlators/cluster/ec/src/ec-dir-read.c index 1e7abc30d91..3a8455101e8 100644 --- a/xlators/cluster/ec/src/ec-dir-read.c +++ b/xlators/cluster/ec/src/ec-dir-read.c @@ -363,6 +363,8 @@ int32_t ec_manager_readdir(ec_fop_data_t * fop, int32_t state)                  fop->mask &= 1ULL << idx;              } +        /* Fall through */ +          case EC_STATE_DISPATCH:              ec_dispatch_one(fop); diff --git a/xlators/cluster/ec/src/ec-dir-write.c b/xlators/cluster/ec/src/ec-dir-write.c index da89e34ba25..dc1d94e37e8 100644 --- a/xlators/cluster/ec/src/ec-dir-write.c +++ b/xlators/cluster/ec/src/ec-dir-write.c @@ -178,6 +178,8 @@ int32_t ec_manager_create(ec_fop_data_t * fop, int32_t state)              fop->int32 &= ~O_ACCMODE;              fop->int32 |= O_RDWR; +        /* Fall through */ +          case EC_STATE_LOCK:              ec_lock_entry(fop, &fop->loc[0]); diff --git a/xlators/cluster/ec/src/ec-generic.c b/xlators/cluster/ec/src/ec-generic.c index 49343388934..dabea16233a 100644 --- a/xlators/cluster/ec/src/ec-generic.c +++ b/xlators/cluster/ec/src/ec-generic.c @@ -908,6 +908,8 @@ int32_t ec_manager_lookup(ec_fop_data_t * fop, int32_t state)                  return EC_STATE_REPORT;              } +        /* Fall through */ +          case EC_STATE_DISPATCH:              ec_dispatch_all(fop); diff --git a/xlators/cluster/ec/src/ec-heal.c b/xlators/cluster/ec/src/ec-heal.c index fe18a0b5f1e..f6ee0076373 100644 --- a/xlators/cluster/ec/src/ec-heal.c +++ b/xlators/cluster/ec/src/ec-heal.c @@ -91,6 +91,10 @@ void ec_heal_lookup_resume(ec_fop_data_t * fop)          }      } +    /* Heal lookups are not executed concurrently with anything else. So, when +     * a lookup finishes, it's safe to access heal->good and heal->bad without +     * acquiring any lock. +     */      heal->good = good;      heal->bad = bad; @@ -456,43 +460,20 @@ int32_t ec_heal_init(ec_fop_data_t * fop)          return ENODATA;      } -    LOCK(&inode->lock); - -    ctx = __ec_inode_get(inode, fop->xl); -    if (ctx == NULL) -    { -        error = EIO; - -        goto out; -    } - -    if (ctx->heal != NULL) -    { -        error = EEXIST; - -        goto out; -    } -      heal = GF_MALLOC(sizeof(ec_heal_t), ec_mt_ec_heal_t);      if (heal == NULL)      { -        error = ENOMEM; - -        goto out; +        return ENOMEM;      }      memset(heal, 0, sizeof(ec_heal_t)); -    if (loc_copy(&heal->loc, &fop->loc[0]) != 0) +    if (!ec_loc_from_loc(fop->xl, &heal->loc, &fop->loc[0]))      {          error = ENOMEM;          goto out;      } -    if (uuid_is_null(heal->loc.gfid)) -    { -        uuid_copy(heal->loc.gfid, heal->loc.inode->gfid); -    }      LOCK_INIT(&heal->lock); @@ -501,14 +482,31 @@ int32_t ec_heal_init(ec_fop_data_t * fop)      pool = fop->xl->ctx->iobuf_pool;      heal->size = iobpool_default_pagesize(pool) * ec->fragments; +    LOCK(&inode->lock); + +    ctx = __ec_inode_get(inode, fop->xl); +    if (ctx == NULL) +    { +        error = EIO; + +        goto unlock; +    } + +    if (ctx->heal != NULL) +    { +        error = EEXIST; + +        goto unlock; +    } +      fop->data = heal;      ctx->heal = heal;      heal = NULL; -out: +unlock:      UNLOCK(&inode->lock); - +out:      GF_FREE(heal);      return error; @@ -943,6 +941,10 @@ int32_t ec_heal_needs_data_rebuild(ec_heal_t * heal)          }      } +    /* This function can only be called concurrently with entrylk, which do +     * not modify heal structure, so it's safe to access heal->bad without +     * acquiring any lock. +     */      heal->bad = bad;      return (bad != 0); @@ -1122,7 +1124,7 @@ void ec_heal_dispatch(ec_heal_t * heal)      GF_FREE(heal); -    ec_fop_set_error(heal->fop, error); +    ec_fop_set_error(fop, error);  }  void ec_wind_heal(ec_t * ec, ec_fop_data_t * fop, int32_t idx) @@ -1162,6 +1164,8 @@ int32_t ec_manager_heal(ec_fop_data_t * fop, int32_t state)                  return EC_STATE_REPORT;              } +        /* Fall through */ +          case EC_STATE_DISPATCH:              ec_heal_entrylk(fop->data, ENTRYLK_LOCK); @@ -1222,6 +1226,8 @@ int32_t ec_manager_heal(ec_fop_data_t * fop, int32_t state)          case EC_STATE_HEAL_UNLOCK:              ec_heal_inodelk(heal, F_UNLCK, 0, 0, 0); +        /* Fall through */ +          case -EC_STATE_HEAL_ENTRY_PREPARE:          case -EC_STATE_HEAL_PRE_INODELK_LOCK:          case -EC_STATE_HEAL_PRE_INODE_LOOKUP: diff --git a/xlators/cluster/ec/src/ec-inode-read.c b/xlators/cluster/ec/src/ec-inode-read.c index b1db9c9fbb7..46f904cf321 100644 --- a/xlators/cluster/ec/src/ec-inode-read.c +++ b/xlators/cluster/ec/src/ec-inode-read.c @@ -668,6 +668,8 @@ int32_t ec_manager_open(ec_fop_data_t * fop, int32_t state)                  fop->int32 |= O_RDWR;              } +        /* Fall through */ +          case EC_STATE_DISPATCH:              ec_dispatch_all(fop); @@ -1236,6 +1238,8 @@ int32_t ec_manager_readv(ec_fop_data_t * fop, int32_t state)              fop->size = ec_adjust_size(fop->xl->private, fop->size + fop->head,                                         1); +        /* Fall through */ +          case EC_STATE_LOCK:              ec_lock_fd(fop, fop->fd); diff --git a/xlators/cluster/ec/src/ec-inode-write.c b/xlators/cluster/ec/src/ec-inode-write.c index a3c4ae5d8f2..c0694531151 100644 --- a/xlators/cluster/ec/src/ec-inode-write.c +++ b/xlators/cluster/ec/src/ec-inode-write.c @@ -1363,6 +1363,8 @@ int32_t ec_manager_truncate(ec_fop_data_t * fop, int32_t state)              fop->user_size = fop->offset;              fop->offset = ec_adjust_size(fop->xl->private, fop->offset, 1); +        /* Fall through */ +          case EC_STATE_LOCK:              ec_lock_inode(fop, &fop->loc[0]); @@ -2019,6 +2021,8 @@ int32_t ec_manager_writev(ec_fop_data_t * fop, int32_t state)                  return EC_STATE_REPORT;              } +        /* Fall through */ +          case EC_STATE_LOCK:              ec_lock_fd(fop, fop->fd); diff --git a/xlators/cluster/ec/src/ec-locks.c b/xlators/cluster/ec/src/ec-locks.c index 96c1e03f8ec..2bcec34b6c3 100644 --- a/xlators/cluster/ec/src/ec-locks.c +++ b/xlators/cluster/ec/src/ec-locks.c @@ -215,6 +215,8 @@ int32_t ec_manager_entrylk(ec_fop_data_t * fop, int32_t state)                  fop->entrylk_cmd = ENTRYLK_LOCK_NB;              } +        /* Fall through */ +          case EC_STATE_DISPATCH:              ec_dispatch_all(fop); @@ -646,6 +648,8 @@ int32_t ec_manager_inodelk(ec_fop_data_t * fop, int32_t state)                  fop->int32 = F_SETLK;              } +        /* Fall through */ +          case EC_STATE_DISPATCH:              ec_dispatch_all(fop); @@ -1131,6 +1135,8 @@ int32_t ec_manager_lk(ec_fop_data_t * fop, int32_t state)                  fop->int32 = F_SETLK;              } +        /* Fall through */ +          case EC_STATE_DISPATCH:              ec_dispatch_all(fop); diff --git a/xlators/cluster/ec/src/ec-method.c b/xlators/cluster/ec/src/ec-method.c index deedf2a21f2..83b603bd14a 100644 --- a/xlators/cluster/ec/src/ec-method.c +++ b/xlators/cluster/ec/src/ec-method.c @@ -96,7 +96,7 @@ size_t ec_method_decode(size_t size, uint32_t columns, uint32_t * rows,                          uint8_t ** in, uint8_t * out)  {      uint32_t i, j, k; -    uint32_t f, off, mask; +    uint32_t f, off;      uint8_t inv[EC_METHOD_MAX_FRAGMENTS][EC_METHOD_MAX_FRAGMENTS + 1];      uint8_t mtx[EC_METHOD_MAX_FRAGMENTS][EC_METHOD_MAX_FRAGMENTS];      uint8_t * p[EC_METHOD_MAX_FRAGMENTS]; @@ -105,7 +105,6 @@ size_t ec_method_decode(size_t size, uint32_t columns, uint32_t * rows,      memset(inv, 0, sizeof(inv));      memset(mtx, 0, sizeof(mtx)); -    mask = 0;      for (i = 0; i < columns; i++)      {          inv[i][i] = 1; @@ -114,11 +113,6 @@ size_t ec_method_decode(size_t size, uint32_t columns, uint32_t * rows,      k = 0;      for (i = 0; i < columns; i++)      { -        while ((mask & 1) != 0) -        { -            k++; -            mask >>= 1; -        }          mtx[k][columns - 1] = 1;          for (j = columns - 1; j > 0; j--)          { @@ -126,7 +120,6 @@ size_t ec_method_decode(size_t size, uint32_t columns, uint32_t * rows,          }          p[k] = in[i];          k++; -        mask >>= 1;      }      for (i = 0; i < columns; i++)  | 
