diff options
Diffstat (limited to 'xlators/cluster/ec/src/ec-helpers.c')
| -rw-r--r-- | xlators/cluster/ec/src/ec-helpers.c | 118 | 
1 files changed, 63 insertions, 55 deletions
diff --git a/xlators/cluster/ec/src/ec-helpers.c b/xlators/cluster/ec/src/ec-helpers.c index 534d694cc52..00ff5f63d47 100644 --- a/xlators/cluster/ec/src/ec-helpers.c +++ b/xlators/cluster/ec/src/ec-helpers.c @@ -334,83 +334,56 @@ int32_t ec_loc_gfid_check(xlator_t * xl, uuid_t dst, uuid_t src)      return 1;  } -int32_t ec_loc_parent(xlator_t * xl, loc_t * loc, loc_t * parent, char ** name) +int32_t ec_loc_parent(xlator_t *xl, loc_t *loc, loc_t *parent)  {      char * str = NULL;      int32_t error = 0;      memset(parent, 0, sizeof(loc_t)); -    if (loc->path == NULL) +    if (loc->inode == NULL)      { -        gf_log(xl->name, GF_LOG_ERROR, "inode path missing in loc_t: %p", loc->parent); +        gf_log(xl->name, GF_LOG_ERROR, "Invalid loc"); -        return EINVAL; +        error = EINVAL; + +        goto out;      } -    if (loc->parent == NULL) +    if (__is_root_gfid(loc->inode->gfid) || __is_root_gfid(loc->gfid) || +        ((loc->path != NULL) && (strcmp(loc->path, "/") == 0)))      { -        if ((loc->inode == NULL) || !__is_root_gfid(loc->inode->gfid) || -            (strcmp(loc->path, "/") != 0)) -        { -            gf_log(xl->name, GF_LOG_ERROR, "Parent inode missing for " -                                           "loc_t (path=%s, name=%s)", -                   loc->path, loc->name); +        parent->path = gf_strdup("/"); +        if (parent->path == NULL) { +            gf_log(xl->name, GF_LOG_ERROR, "Unable to duplicate path '/'"); -            return EINVAL; -        } +            error = ENOMEM; -        if (loc_copy(parent, loc) != 0) -        { -            return ENOMEM; +            goto out;          } -        parent->name = NULL; +        parent->gfid[15] = 1; +        parent->inode = inode_find(loc->inode->table, parent->gfid); -        if (name != NULL) -        { -            *name = NULL; -        } +        return 0;      } -    else -    { -        if (uuid_is_null(loc->parent->gfid) && (uuid_is_null(loc->pargfid))) -        { -            gf_log(xl->name, GF_LOG_ERROR, "Invalid parent inode " -                                           "(path=%s, name=%s)", -                   loc->path, loc->name); - -            return EINVAL; -        } -        uuid_copy(parent->gfid, loc->pargfid); +    if (loc->path != NULL) {          str = gf_strdup(loc->path);          if (str == NULL)          {              gf_log(xl->name, GF_LOG_ERROR, "Unable to duplicate path " -                                           "'%s'", str); +                                           "'%s'", loc->path); -            return ENOMEM; -        } -        if (name != NULL) -        { -            *name = gf_strdup(basename(str)); -            if (*name == NULL) -            { -                gf_log(xl->name, GF_LOG_ERROR, "Unable to get basename " -                                               "of '%s'", str); - -                error = ENOMEM; +            error = ENOMEM; -                goto out; -            } -            strcpy(str, loc->path); +            goto out;          }          parent->path = gf_strdup(dirname(str));          if (parent->path == NULL)          {              gf_log(xl->name, GF_LOG_ERROR, "Unable to get dirname of " -                                           "'%s'", str); +                                           "'%s'", loc->path);              error = ENOMEM; @@ -427,19 +400,57 @@ int32_t ec_loc_parent(xlator_t * xl, loc_t * loc, loc_t * parent, char ** name)              goto out;          }          parent->name++; +    } +    if (loc->parent != NULL) {          parent->inode = inode_ref(loc->parent); +        uuid_copy(parent->gfid, loc->parent->gfid); +    } +    if (!uuid_is_null(loc->pargfid) && uuid_is_null(parent->gfid)) { +        uuid_copy(parent->gfid, loc->pargfid);      } -    if ((loc->inode == NULL) || -        ec_loc_gfid_check(xl, loc->gfid, loc->inode->gfid)) +    if ((parent->inode == NULL) && (parent->path != NULL))      { -        parent = NULL; +        if (strcmp(parent->path, "/") == 0) { +            parent->inode = inode_ref(loc->inode->table->root); + +            goto out; +        } +        parent->inode = inode_resolve(loc->inode->table, (char *)parent->path); +        if (parent->inode != NULL) { +            goto out; +        } + +        gf_log(xl->name, GF_LOG_WARNING, "Unable to resolve parent inode"); +    } + +    if ((parent->inode == NULL) && !uuid_is_null(parent->gfid)) { +        if (__is_root_gfid(parent->gfid)) { +            parent->inode = inode_ref(loc->inode->table->root); + +            goto out; +        } +        parent->inode = inode_find(loc->inode->table, parent->gfid); +        if (parent->inode != NULL) { +            goto out; +        } + +        gf_log(xl->name, GF_LOG_WARNING, "Unable to find parent inode"); +    } + +    if ((parent->inode == NULL) && (parent->path == NULL) && +        uuid_is_null(parent->gfid)) { +        gf_log(xl->name, GF_LOG_ERROR, "Parent inode missing for loc_t"); + +        error = EINVAL; + +        goto out;      }  out:      GF_FREE(str); -    if (parent != NULL) +    if (error != 0)      {          loc_wipe(parent);      } @@ -567,9 +578,6 @@ ec_inode_t * __ec_inode_get(inode_t * inode, xlator_t * xl)                  return NULL;              } - -            INIT_LIST_HEAD(&ctx->entry_locks); -            INIT_LIST_HEAD(&ctx->inode_locks);          }      }      else  | 
