diff options
Diffstat (limited to 'xlators/mount/fuse/src/fuse-resolve.c')
| -rw-r--r-- | xlators/mount/fuse/src/fuse-resolve.c | 1036 | 
1 files changed, 499 insertions, 537 deletions
diff --git a/xlators/mount/fuse/src/fuse-resolve.c b/xlators/mount/fuse/src/fuse-resolve.c index ed25bf034b8..6206fd47325 100644 --- a/xlators/mount/fuse/src/fuse-resolve.c +++ b/xlators/mount/fuse/src/fuse-resolve.c @@ -10,213 +10,205 @@  #include "fuse-bridge.h"  static int -fuse_resolve_all (fuse_state_t *state); +fuse_resolve_all(fuse_state_t *state); -int fuse_resolve_continue (fuse_state_t *state); -int fuse_resolve_entry_simple (fuse_state_t *state); -int fuse_resolve_inode_simple (fuse_state_t *state); -int fuse_migrate_fd (xlator_t *this, fd_t *fd, xlator_t *old_subvol, -                     xlator_t *new_subvol); +int +fuse_resolve_continue(fuse_state_t *state); +int +fuse_resolve_entry_simple(fuse_state_t *state); +int +fuse_resolve_inode_simple(fuse_state_t *state); +int +fuse_migrate_fd(xlator_t *this, fd_t *fd, xlator_t *old_subvol, +                xlator_t *new_subvol);  fuse_fd_ctx_t * -fuse_fd_ctx_get (xlator_t *this, fd_t *fd); +fuse_fd_ctx_get(xlator_t *this, fd_t *fd);  static int -fuse_resolve_loc_touchup (fuse_state_t *state) +fuse_resolve_loc_touchup(fuse_state_t *state)  { -        fuse_resolve_t *resolve = NULL; -        loc_t          *loc     = NULL; +    fuse_resolve_t *resolve = NULL; +    loc_t *loc = NULL; -        resolve = state->resolve_now; -        loc     = state->loc_now; +    resolve = state->resolve_now; +    loc = state->loc_now; -        loc_touchup (loc, resolve->bname); -        return 0; +    loc_touchup(loc, resolve->bname); +    return 0;  } -  int -fuse_resolve_entry_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -			int op_ret, int op_errno, inode_t *inode, -			struct iatt *buf, dict_t *xattr, -			struct iatt *postparent) +fuse_resolve_entry_cbk(call_frame_t *frame, void *cookie, xlator_t *this, +                       int op_ret, int op_errno, inode_t *inode, +                       struct iatt *buf, dict_t *xattr, struct iatt *postparent)  { -        fuse_state_t   *state      = NULL; -        fuse_resolve_t *resolve    = NULL; -        inode_t        *link_inode = NULL; -        loc_t          *resolve_loc   = NULL; -        uint64_t        ctx_value  = LOOKUP_NOT_NEEDED; - -        state = frame->root->state; -        resolve = state->resolve_now; -        resolve_loc = &resolve->resolve_loc; - -        STACK_DESTROY (frame->root); - -        if (op_ret == -1) { -                gf_log (this->name, (op_errno == ENOENT) -                        ? GF_LOG_DEBUG : GF_LOG_WARNING, -                        "%s/%s: failed to resolve (%s)", -                        uuid_utoa (resolve_loc->pargfid), resolve_loc->name, -                        strerror (op_errno)); -                resolve->op_ret = -1; -                resolve->op_errno = op_errno; -                goto out; -        } - -        link_inode = inode_link (inode, resolve_loc->parent, -                                 resolve_loc->name, buf); -        if (link_inode == inode) -                inode_ctx_set (link_inode, this, &ctx_value); -	state->loc_now->inode = link_inode; +    fuse_state_t *state = NULL; +    fuse_resolve_t *resolve = NULL; +    inode_t *link_inode = NULL; +    loc_t *resolve_loc = NULL; +    uint64_t ctx_value = LOOKUP_NOT_NEEDED; + +    state = frame->root->state; +    resolve = state->resolve_now; +    resolve_loc = &resolve->resolve_loc; + +    STACK_DESTROY(frame->root); + +    if (op_ret == -1) { +        gf_log(this->name, (op_errno == ENOENT) ? GF_LOG_DEBUG : GF_LOG_WARNING, +               "%s/%s: failed to resolve (%s)", uuid_utoa(resolve_loc->pargfid), +               resolve_loc->name, strerror(op_errno)); +        resolve->op_ret = -1; +        resolve->op_errno = op_errno; +        goto out; +    } + +    link_inode = inode_link(inode, resolve_loc->parent, resolve_loc->name, buf); +    if (link_inode == inode) +        inode_ctx_set(link_inode, this, &ctx_value); +    state->loc_now->inode = link_inode;  out: -        loc_wipe (resolve_loc); +    loc_wipe(resolve_loc); -        fuse_resolve_continue (state); -        return 0; +    fuse_resolve_continue(state); +    return 0;  } -  int -fuse_resolve_entry (fuse_state_t *state) +fuse_resolve_entry(fuse_state_t *state)  { -	fuse_resolve_t   *resolve = NULL; -	loc_t            *resolve_loc = NULL; +    fuse_resolve_t *resolve = NULL; +    loc_t *resolve_loc = NULL; -	resolve = state->resolve_now; -	resolve_loc = &resolve->resolve_loc; +    resolve = state->resolve_now; +    resolve_loc = &resolve->resolve_loc; -	resolve_loc->parent = inode_ref (state->loc_now->parent); -	gf_uuid_copy (resolve_loc->pargfid, state->loc_now->pargfid); -        resolve_loc->name = resolve->bname; +    resolve_loc->parent = inode_ref(state->loc_now->parent); +    gf_uuid_copy(resolve_loc->pargfid, state->loc_now->pargfid); +    resolve_loc->name = resolve->bname; -        resolve_loc->inode = inode_grep (state->itable, resolve->parhint, -                                         resolve->bname); -        if (!resolve_loc->inode) { -                resolve_loc->inode = inode_new (state->itable); -        } -        inode_path (resolve_loc->parent, resolve_loc->name, -                    (char **) &resolve_loc->path); +    resolve_loc->inode = inode_grep(state->itable, resolve->parhint, +                                    resolve->bname); +    if (!resolve_loc->inode) { +        resolve_loc->inode = inode_new(state->itable); +    } +    inode_path(resolve_loc->parent, resolve_loc->name, +               (char **)&resolve_loc->path); -        FUSE_FOP (state, fuse_resolve_entry_cbk, GF_FOP_LOOKUP, -                  lookup, resolve_loc, NULL); +    FUSE_FOP(state, fuse_resolve_entry_cbk, GF_FOP_LOOKUP, lookup, resolve_loc, +             NULL); -	return 0; +    return 0;  } -  int -fuse_resolve_gfid_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -                       int op_ret, int op_errno, inode_t *inode, -                       struct iatt *buf, dict_t *xattr, struct iatt *postparent) +fuse_resolve_gfid_cbk(call_frame_t *frame, void *cookie, xlator_t *this, +                      int op_ret, int op_errno, inode_t *inode, +                      struct iatt *buf, dict_t *xattr, struct iatt *postparent)  { -        fuse_state_t   *state      = NULL; -        fuse_resolve_t *resolve    = NULL; -        inode_t        *link_inode = NULL; -        loc_t          *loc_now    = NULL; -        inode_t        *tmp_inode  = NULL; -        uint64_t        ctx_value  = LOOKUP_NOT_NEEDED; - -        state = frame->root->state; -        resolve = state->resolve_now; -	loc_now = state->loc_now; - -        STACK_DESTROY (frame->root); - -        if (op_ret == -1) { -                gf_log (this->name, (op_errno == ENOENT) -                        ? GF_LOG_DEBUG : GF_LOG_WARNING, -                        "%s: failed to resolve (%s)", -                        uuid_utoa (resolve->resolve_loc.gfid), -			strerror (op_errno)); -                loc_wipe (&resolve->resolve_loc); - -                /* resolve->op_ret can have 3 values: 0, -1, -2. -                 * 0 : resolution was successful. -                 * -1: parent inode could not be resolved. -                 * -2: entry (inode corresponding to path) could not be resolved -                 */ - -                if (gf_uuid_is_null (resolve->gfid)) { -                        resolve->op_ret = -1; -                } else { -                        resolve->op_ret = -2; -                } - -                resolve->op_errno = op_errno; -                goto out; +    fuse_state_t *state = NULL; +    fuse_resolve_t *resolve = NULL; +    inode_t *link_inode = NULL; +    loc_t *loc_now = NULL; +    inode_t *tmp_inode = NULL; +    uint64_t ctx_value = LOOKUP_NOT_NEEDED; + +    state = frame->root->state; +    resolve = state->resolve_now; +    loc_now = state->loc_now; + +    STACK_DESTROY(frame->root); + +    if (op_ret == -1) { +        gf_log(this->name, (op_errno == ENOENT) ? GF_LOG_DEBUG : GF_LOG_WARNING, +               "%s: failed to resolve (%s)", +               uuid_utoa(resolve->resolve_loc.gfid), strerror(op_errno)); +        loc_wipe(&resolve->resolve_loc); + +        /* resolve->op_ret can have 3 values: 0, -1, -2. +         * 0 : resolution was successful. +         * -1: parent inode could not be resolved. +         * -2: entry (inode corresponding to path) could not be resolved +         */ + +        if (gf_uuid_is_null(resolve->gfid)) { +            resolve->op_ret = -1; +        } else { +            resolve->op_ret = -2;          } -        link_inode = inode_link (inode, NULL, NULL, buf); -        if (link_inode == inode) -                inode_ctx_set (link_inode, this, &ctx_value); +        resolve->op_errno = op_errno; +        goto out; +    } -        loc_wipe (&resolve->resolve_loc); +    link_inode = inode_link(inode, NULL, NULL, buf); +    if (link_inode == inode) +        inode_ctx_set(link_inode, this, &ctx_value); -        if (!link_inode) -                goto out; +    loc_wipe(&resolve->resolve_loc); -	if (!gf_uuid_is_null (resolve->gfid)) { -		loc_now->inode = link_inode; -		goto out; -	} +    if (!link_inode) +        goto out; -	loc_now->parent = link_inode; -        gf_uuid_copy (loc_now->pargfid, link_inode->gfid); +    if (!gf_uuid_is_null(resolve->gfid)) { +        loc_now->inode = link_inode; +        goto out; +    } -        tmp_inode = inode_grep (state->itable, link_inode, resolve->bname); -        if (tmp_inode && (!inode_needs_lookup (tmp_inode, THIS))) { -                loc_now->inode = tmp_inode; -                goto out; -        } +    loc_now->parent = link_inode; +    gf_uuid_copy(loc_now->pargfid, link_inode->gfid); -        inode_unref (tmp_inode); -	fuse_resolve_entry (state); +    tmp_inode = inode_grep(state->itable, link_inode, resolve->bname); +    if (tmp_inode && (!inode_needs_lookup(tmp_inode, THIS))) { +        loc_now->inode = tmp_inode; +        goto out; +    } -        return 0; +    inode_unref(tmp_inode); +    fuse_resolve_entry(state); + +    return 0;  out: -        fuse_resolve_continue (state); -        return 0; +    fuse_resolve_continue(state); +    return 0;  } -  int -fuse_resolve_gfid (fuse_state_t *state) +fuse_resolve_gfid(fuse_state_t *state)  { -        fuse_resolve_t *resolve  = NULL; -        loc_t          *resolve_loc = NULL; -        int             ret      = 0; - -        resolve = state->resolve_now; -        resolve_loc = &resolve->resolve_loc; - -        if (!gf_uuid_is_null (resolve->pargfid)) { -                gf_uuid_copy (resolve_loc->gfid, resolve->pargfid); -        } else if (!gf_uuid_is_null (resolve->gfid)) { -                gf_uuid_copy (resolve_loc->gfid, resolve->gfid); -        } - -	/* inode may already exist in case we are looking up an inode which was -	   linked through readdirplus */ -	resolve_loc->inode = inode_find (state->itable, resolve_loc->gfid); -	if (!resolve_loc->inode) -		resolve_loc->inode = inode_new (state->itable); -	ret = loc_path (resolve_loc, NULL); - -        if (ret <= 0) { -                gf_log (THIS->name, GF_LOG_WARNING, -                        "failed to get the path for inode %s", -                        uuid_utoa (resolve->gfid)); -        } - -        FUSE_FOP (state, fuse_resolve_gfid_cbk, GF_FOP_LOOKUP, -                  lookup, resolve_loc, NULL); - -        return 0; +    fuse_resolve_t *resolve = NULL; +    loc_t *resolve_loc = NULL; +    int ret = 0; + +    resolve = state->resolve_now; +    resolve_loc = &resolve->resolve_loc; + +    if (!gf_uuid_is_null(resolve->pargfid)) { +        gf_uuid_copy(resolve_loc->gfid, resolve->pargfid); +    } else if (!gf_uuid_is_null(resolve->gfid)) { +        gf_uuid_copy(resolve_loc->gfid, resolve->gfid); +    } + +    /* inode may already exist in case we are looking up an inode which was +       linked through readdirplus */ +    resolve_loc->inode = inode_find(state->itable, resolve_loc->gfid); +    if (!resolve_loc->inode) +        resolve_loc->inode = inode_new(state->itable); +    ret = loc_path(resolve_loc, NULL); + +    if (ret <= 0) { +        gf_log(THIS->name, GF_LOG_WARNING, +               "failed to get the path for inode %s", uuid_utoa(resolve->gfid)); +    } + +    FUSE_FOP(state, fuse_resolve_gfid_cbk, GF_FOP_LOOKUP, lookup, resolve_loc, +             NULL); + +    return 0;  } -  /*   * Return value:   * 0 - resolved parent and entry (as necessary) @@ -225,443 +217,417 @@ fuse_resolve_gfid (fuse_state_t *state)   */  int -fuse_resolve_parent_simple (fuse_state_t *state) +fuse_resolve_parent_simple(fuse_state_t *state)  { -        fuse_resolve_t *resolve   = NULL; -	loc_t          *loc       = NULL; -        inode_t        *parent    = NULL; -        inode_t        *inode     = NULL; -        xlator_t       *this      = NULL; - -        resolve = state->resolve_now; -	loc = state->loc_now; -        this = state->this; - -	loc->name = resolve->bname; - -	parent = resolve->parhint; -	if (parent->table == state->itable) { -		if (inode_needs_lookup (parent, THIS)) -			return 1; - -		/* no graph switches since */ -		loc->parent = inode_ref (parent); -		gf_uuid_copy (loc->pargfid, parent->gfid); -		loc->inode = inode_grep (state->itable, parent, loc->name); - -                /* nodeid for root is 1 and we blindly take the latest graph's -                 * table->root as the parhint and because of this there is -                 * ambiguity whether the entry should have existed or not, and -                 * we took the conservative approach of assuming entry should -                 * have been there even though it need not have (bug #804592). -                 */ - -                if (loc->inode && inode_needs_lookup (loc->inode, THIS)) { -                        inode_unref (loc->inode); -                        loc->inode = NULL; -                        return -1; -                } - -                if ((loc->inode == NULL) -                    && __is_root_gfid (parent->gfid)) { -                        /* non decisive result - entry missing */ -                        return -1; -                } - -		/* decisive result - resolution success */ -		return 0; -	} - -        parent = inode_find (state->itable, resolve->pargfid); -	if (!parent) { -		/* non decisive result - parent missing */ -		return 1; -	} -	if (inode_needs_lookup (parent, THIS)) { -		inode_unref (parent); -		return 1; -	} - -	loc->parent = parent; -        gf_uuid_copy (loc->pargfid, resolve->pargfid); - -	inode = inode_grep (state->itable, parent, loc->name); -	if (inode && !inode_needs_lookup (inode, this)) { -		loc->inode = inode; -		/* decisive result - resolution success */ -		return 0; -	} - -	/* non decisive result - entry missing */ -        return -1; -} - - -int -fuse_resolve_parent (fuse_state_t *state) -{ -        int    ret = 0; - -        ret = fuse_resolve_parent_simple (state); -        if (ret > 0) { -                fuse_resolve_gfid (state); -                return 0; +    fuse_resolve_t *resolve = NULL; +    loc_t *loc = NULL; +    inode_t *parent = NULL; +    inode_t *inode = NULL; +    xlator_t *this = NULL; + +    resolve = state->resolve_now; +    loc = state->loc_now; +    this = state->this; + +    loc->name = resolve->bname; + +    parent = resolve->parhint; +    if (parent->table == state->itable) { +        if (inode_needs_lookup(parent, THIS)) +            return 1; + +        /* no graph switches since */ +        loc->parent = inode_ref(parent); +        gf_uuid_copy(loc->pargfid, parent->gfid); +        loc->inode = inode_grep(state->itable, parent, loc->name); + +        /* nodeid for root is 1 and we blindly take the latest graph's +         * table->root as the parhint and because of this there is +         * ambiguity whether the entry should have existed or not, and +         * we took the conservative approach of assuming entry should +         * have been there even though it need not have (bug #804592). +         */ + +        if (loc->inode && inode_needs_lookup(loc->inode, THIS)) { +            inode_unref(loc->inode); +            loc->inode = NULL; +            return -1;          } -	if (ret < 0) { -		fuse_resolve_entry (state); -		return 0; -	} - -        fuse_resolve_continue (state); +        if ((loc->inode == NULL) && __is_root_gfid(parent->gfid)) { +            /* non decisive result - entry missing */ +            return -1; +        } +        /* decisive result - resolution success */          return 0; -} +    } +    parent = inode_find(state->itable, resolve->pargfid); +    if (!parent) { +        /* non decisive result - parent missing */ +        return 1; +    } +    if (inode_needs_lookup(parent, THIS)) { +        inode_unref(parent); +        return 1; +    } -int -fuse_resolve_inode_simple (fuse_state_t *state) -{ -        fuse_resolve_t *resolve   = NULL; -	loc_t          *loc = NULL; -        inode_t        *inode     = NULL; - -        resolve = state->resolve_now; -	loc = state->loc_now; - -	inode = resolve->hint; -	if (inode->table == state->itable) -		inode_ref (inode); -	else -		inode = inode_find (state->itable, resolve->gfid); - -        if (inode) { -		if (!inode_needs_lookup (inode, THIS)) -			goto found; -		/* inode was linked through readdirplus */ -		inode_unref (inode); -	} +    loc->parent = parent; +    gf_uuid_copy(loc->pargfid, resolve->pargfid); -        return 1; -found: -	loc->inode = inode; -	return 0; -} +    inode = inode_grep(state->itable, parent, loc->name); +    if (inode && !inode_needs_lookup(inode, this)) { +        loc->inode = inode; +        /* decisive result - resolution success */ +        return 0; +    } +    /* non decisive result - entry missing */ +    return -1; +}  int -fuse_resolve_inode (fuse_state_t *state) +fuse_resolve_parent(fuse_state_t *state)  { -        int                 ret = 0; +    int ret = 0; -        ret = fuse_resolve_inode_simple (state); +    ret = fuse_resolve_parent_simple(state); +    if (ret > 0) { +        fuse_resolve_gfid(state); +        return 0; +    } -        if (ret > 0) { -                fuse_resolve_gfid (state); -                return 0; -        } +    if (ret < 0) { +        fuse_resolve_entry(state); +        return 0; +    } -        fuse_resolve_continue (state); +    fuse_resolve_continue(state); -        return 0; +    return 0;  } -  int -fuse_migrate_fd_task (void *data) +fuse_resolve_inode_simple(fuse_state_t *state)  { -        int            ret        = -1; -        fuse_state_t  *state      = NULL; -        fd_t          *basefd     = NULL, *oldfd = NULL; -        fuse_fd_ctx_t *basefd_ctx = NULL; -        xlator_t      *old_subvol = NULL; - -        state = data; -        if (state == NULL) { -                goto out; -        } +    fuse_resolve_t *resolve = NULL; +    loc_t *loc = NULL; +    inode_t *inode = NULL; + +    resolve = state->resolve_now; +    loc = state->loc_now; + +    inode = resolve->hint; +    if (inode->table == state->itable) +        inode_ref(inode); +    else +        inode = inode_find(state->itable, resolve->gfid); + +    if (inode) { +        if (!inode_needs_lookup(inode, THIS)) +            goto found; +        /* inode was linked through readdirplus */ +        inode_unref(inode); +    } + +    return 1; +found: +    loc->inode = inode; +    return 0; +} -        basefd = state->fd; +int +fuse_resolve_inode(fuse_state_t *state) +{ +    int ret = 0; -        basefd_ctx = fuse_fd_ctx_get (state->this, basefd); -        if (!basefd_ctx) -                goto out; +    ret = fuse_resolve_inode_simple(state); -        LOCK (&basefd->lock); -        { -                oldfd = basefd_ctx->activefd ? basefd_ctx->activefd : basefd; -                fd_ref (oldfd); -        } -        UNLOCK (&basefd->lock); +    if (ret > 0) { +        fuse_resolve_gfid(state); +        return 0; +    } -        old_subvol = oldfd->inode->table->xl; +    fuse_resolve_continue(state); -        ret = fuse_migrate_fd (state->this, basefd, old_subvol, -                               state->active_subvol); +    return 0; +} -        LOCK (&basefd->lock); -        { -                if (ret < 0) { -                        basefd_ctx->migration_failed = 1; -                } else { -                        basefd_ctx->migration_failed = 0; -                } +int +fuse_migrate_fd_task(void *data) +{ +    int ret = -1; +    fuse_state_t *state = NULL; +    fd_t *basefd = NULL, *oldfd = NULL; +    fuse_fd_ctx_t *basefd_ctx = NULL; +    xlator_t *old_subvol = NULL; + +    state = data; +    if (state == NULL) { +        goto out; +    } + +    basefd = state->fd; + +    basefd_ctx = fuse_fd_ctx_get(state->this, basefd); +    if (!basefd_ctx) +        goto out; + +    LOCK(&basefd->lock); +    { +        oldfd = basefd_ctx->activefd ? basefd_ctx->activefd : basefd; +        fd_ref(oldfd); +    } +    UNLOCK(&basefd->lock); + +    old_subvol = oldfd->inode->table->xl; + +    ret = fuse_migrate_fd(state->this, basefd, old_subvol, +                          state->active_subvol); + +    LOCK(&basefd->lock); +    { +        if (ret < 0) { +            basefd_ctx->migration_failed = 1; +        } else { +            basefd_ctx->migration_failed = 0;          } -        UNLOCK (&basefd->lock); +    } +    UNLOCK(&basefd->lock); -        ret = 0; +    ret = 0;  out: -        if (oldfd) -                fd_unref (oldfd); +    if (oldfd) +        fd_unref(oldfd); -        return ret; +    return ret;  } -  static int -fuse_migrate_fd_error (xlator_t *this, fd_t *fd) +fuse_migrate_fd_error(xlator_t *this, fd_t *fd)  { -        fuse_fd_ctx_t *fdctx = NULL; -        char           error = 0; - -        fdctx = fuse_fd_ctx_get (this, fd); -        if (fdctx != NULL) { -                if (fdctx->migration_failed) { -                        error = 1; -                } +    fuse_fd_ctx_t *fdctx = NULL; +    char error = 0; + +    fdctx = fuse_fd_ctx_get(this, fd); +    if (fdctx != NULL) { +        if (fdctx->migration_failed) { +            error = 1;          } +    } -        return error; +    return error;  } -#define FUSE_FD_GET_ACTIVE_FD(activefd, basefd)                 \ -        do {                                                    \ -                LOCK (&basefd->lock);                           \ -                {                                               \ -                        activefd = basefd_ctx->activefd ?       \ -                                basefd_ctx->activefd : basefd;  \ -                        if (activefd != basefd) {               \ -                                fd_ref (activefd);              \ -                        }                                       \ -                }                                               \ -                UNLOCK (&basefd->lock);                         \ -                                                                \ -                if (activefd == basefd) {                       \ -                        fd_ref (activefd);                      \ -                }                                               \ -        } while (0); - +#define FUSE_FD_GET_ACTIVE_FD(activefd, basefd)                                \ +    do {                                                                       \ +        LOCK(&basefd->lock);                                                   \ +        {                                                                      \ +            activefd = basefd_ctx->activefd ? basefd_ctx->activefd : basefd;   \ +            if (activefd != basefd) {                                          \ +                fd_ref(activefd);                                              \ +            }                                                                  \ +        }                                                                      \ +        UNLOCK(&basefd->lock);                                                 \ +                                                                               \ +        if (activefd == basefd) {                                              \ +            fd_ref(activefd);                                                  \ +        }                                                                      \ +    } while (0);  static int -fuse_resolve_fd (fuse_state_t *state) +fuse_resolve_fd(fuse_state_t *state)  { -        fuse_resolve_t *resolve            = NULL; -	fd_t           *basefd             = NULL, *activefd = NULL; -	xlator_t       *active_subvol      = NULL, *this = NULL; -        int             ret                = 0; -        char            fd_migration_error = 0; -        fuse_fd_ctx_t  *basefd_ctx         = NULL; - -        resolve = state->resolve_now; - -        this = state->this; - -        basefd = resolve->fd; -        basefd_ctx = fuse_fd_ctx_get (this, basefd); -        if (basefd_ctx == NULL) { -                gf_log (state->this->name, GF_LOG_WARNING, -                        "fdctx is NULL for basefd (ptr:%p inode-gfid:%s), " -                        "resolver erroring out with errno EINVAL", -                        basefd, uuid_utoa (basefd->inode->gfid)); -                resolve->op_ret = -1; -                resolve->op_errno = EINVAL; -                goto resolve_continue; -        } - -        FUSE_FD_GET_ACTIVE_FD (activefd, basefd); - +    fuse_resolve_t *resolve = NULL; +    fd_t *basefd = NULL, *activefd = NULL; +    xlator_t *active_subvol = NULL, *this = NULL; +    int ret = 0; +    char fd_migration_error = 0; +    fuse_fd_ctx_t *basefd_ctx = NULL; + +    resolve = state->resolve_now; + +    this = state->this; + +    basefd = resolve->fd; +    basefd_ctx = fuse_fd_ctx_get(this, basefd); +    if (basefd_ctx == NULL) { +        gf_log(state->this->name, GF_LOG_WARNING, +               "fdctx is NULL for basefd (ptr:%p inode-gfid:%s), " +               "resolver erroring out with errno EINVAL", +               basefd, uuid_utoa(basefd->inode->gfid)); +        resolve->op_ret = -1; +        resolve->op_errno = EINVAL; +        goto resolve_continue; +    } + +    FUSE_FD_GET_ACTIVE_FD(activefd, basefd); + +    active_subvol = activefd->inode->table->xl; + +    fd_migration_error = fuse_migrate_fd_error(state->this, basefd); +    if (fd_migration_error) { +        resolve->op_ret = -1; +        resolve->op_errno = EBADF; +    } else if (state->active_subvol != active_subvol) { +        ret = synctask_new(state->this->ctx->env, fuse_migrate_fd_task, NULL, +                           NULL, state); + +        fd_migration_error = fuse_migrate_fd_error(state->this, basefd); +        fd_unref(activefd); + +        FUSE_FD_GET_ACTIVE_FD(activefd, basefd);          active_subvol = activefd->inode->table->xl; -        fd_migration_error = fuse_migrate_fd_error (state->this, basefd); -        if (fd_migration_error) { -                resolve->op_ret = -1; -                resolve->op_errno = EBADF; -        } else if (state->active_subvol != active_subvol) { -                ret = synctask_new (state->this->ctx->env, fuse_migrate_fd_task, -                                    NULL, NULL, state); - -                fd_migration_error = fuse_migrate_fd_error (state->this, -                                                            basefd); -                fd_unref (activefd); - -                FUSE_FD_GET_ACTIVE_FD (activefd, basefd); -                active_subvol = activefd->inode->table->xl; - -                if ((ret == -1) || fd_migration_error -                    || (state->active_subvol != active_subvol)) { -                        if (ret == -1) { -                                gf_log (state->this->name, GF_LOG_WARNING, -                                        "starting sync-task to migrate " -                                        "basefd (ptr:%p inode-gfid:%s) failed " -                                        "(old-subvolume:%s-%d " -                                        "new-subvolume:%s-%d)", -                                        basefd, -                                        uuid_utoa (basefd->inode->gfid), -                                        active_subvol->name, -                                        active_subvol->graph->id, -                                        state->active_subvol->name, -                                        state->active_subvol->graph->id); -                        } else { -                                gf_log (state->this->name, GF_LOG_WARNING, -                                        "fd migration of basefd " -                                        "(ptr:%p inode-gfid:%s) failed " -                                        "(old-subvolume:%s-%d " -                                        "new-subvolume:%s-%d)", -                                        basefd, -                                        uuid_utoa (basefd->inode->gfid), -                                        active_subvol->name, -                                        active_subvol->graph->id, -                                        state->active_subvol->name, -                                        state->active_subvol->graph->id); -                        } - -                        resolve->op_ret = -1; -                        resolve->op_errno = EBADF; -                } else { -                        gf_log (state->this->name, GF_LOG_DEBUG, -                                "basefd (ptr:%p inode-gfid:%s) migrated " -                                "successfully in resolver " -                                "(old-subvolume:%s-%d new-subvolume:%s-%d)", -                                basefd, uuid_utoa (basefd->inode->gfid), -                                active_subvol->name, active_subvol->graph->id, -                                state->active_subvol->name, -                                state->active_subvol->graph->id); -                } +        if ((ret == -1) || fd_migration_error || +            (state->active_subvol != active_subvol)) { +            if (ret == -1) { +                gf_log(state->this->name, GF_LOG_WARNING, +                       "starting sync-task to migrate " +                       "basefd (ptr:%p inode-gfid:%s) failed " +                       "(old-subvolume:%s-%d " +                       "new-subvolume:%s-%d)", +                       basefd, uuid_utoa(basefd->inode->gfid), +                       active_subvol->name, active_subvol->graph->id, +                       state->active_subvol->name, +                       state->active_subvol->graph->id); +            } else { +                gf_log(state->this->name, GF_LOG_WARNING, +                       "fd migration of basefd " +                       "(ptr:%p inode-gfid:%s) failed " +                       "(old-subvolume:%s-%d " +                       "new-subvolume:%s-%d)", +                       basefd, uuid_utoa(basefd->inode->gfid), +                       active_subvol->name, active_subvol->graph->id, +                       state->active_subvol->name, +                       state->active_subvol->graph->id); +            } + +            resolve->op_ret = -1; +            resolve->op_errno = EBADF; +        } else { +            gf_log(state->this->name, GF_LOG_DEBUG, +                   "basefd (ptr:%p inode-gfid:%s) migrated " +                   "successfully in resolver " +                   "(old-subvolume:%s-%d new-subvolume:%s-%d)", +                   basefd, uuid_utoa(basefd->inode->gfid), active_subvol->name, +                   active_subvol->graph->id, state->active_subvol->name, +                   state->active_subvol->graph->id);          } +    } -        if ((resolve->op_ret == -1) && (resolve->op_errno == EBADF)) { -                gf_log ("fuse-resolve", GF_LOG_WARNING, -                        "migration of basefd (ptr:%p inode-gfid:%s) " -                        "did not complete, failing fop with EBADF " -                        "(old-subvolume:%s-%d new-subvolume:%s-%d)", basefd, -                        uuid_utoa (basefd->inode->gfid), -                        active_subvol->name, active_subvol->graph->id, -                        state->active_subvol->name, -                        state->active_subvol->graph->id); -        } +    if ((resolve->op_ret == -1) && (resolve->op_errno == EBADF)) { +        gf_log("fuse-resolve", GF_LOG_WARNING, +               "migration of basefd (ptr:%p inode-gfid:%s) " +               "did not complete, failing fop with EBADF " +               "(old-subvolume:%s-%d new-subvolume:%s-%d)", +               basefd, uuid_utoa(basefd->inode->gfid), active_subvol->name, +               active_subvol->graph->id, state->active_subvol->name, +               state->active_subvol->graph->id); +    } -        if (activefd != basefd) { -                state->fd = fd_ref (activefd); -                fd_unref (basefd); -        } +    if (activefd != basefd) { +        state->fd = fd_ref(activefd); +        fd_unref(basefd); +    } -	/* state->active_subvol = active_subvol; */ +    /* state->active_subvol = active_subvol; */  resolve_continue: -        if (activefd != NULL) { -                fd_unref (activefd); -        } +    if (activefd != NULL) { +        fd_unref(activefd); +    } -        fuse_resolve_continue (state); +    fuse_resolve_continue(state); -        return 0; +    return 0;  } -  int -fuse_gfid_set (fuse_state_t *state) +fuse_gfid_set(fuse_state_t *state)  { -        int   ret = 0; +    int ret = 0; -        if (gf_uuid_is_null (state->gfid)) -                goto out; +    if (gf_uuid_is_null(state->gfid)) +        goto out; -        if (!state->xdata) -                state->xdata = dict_new (); +    if (!state->xdata) +        state->xdata = dict_new(); -        if (!state->xdata) { -                ret = -1; -                goto out; -        } +    if (!state->xdata) { +        ret = -1; +        goto out; +    } -        ret = dict_set_gfuuid (state->xdata, "gfid-req", -                               state->gfid, true); +    ret = dict_set_gfuuid(state->xdata, "gfid-req", state->gfid, true);  out: -        return ret; +    return ret;  } -  int -fuse_resolve_entry_init (fuse_state_t *state, fuse_resolve_t *resolve, -			 ino_t par, char *name) +fuse_resolve_entry_init(fuse_state_t *state, fuse_resolve_t *resolve, ino_t par, +                        char *name)  { -	inode_t       *parent = NULL; +    inode_t *parent = NULL; -	parent = fuse_ino_to_inode (par, state->this); -	gf_uuid_copy (resolve->pargfid, parent->gfid); -	resolve->parhint = parent; -	resolve->bname = gf_strdup (name); +    parent = fuse_ino_to_inode(par, state->this); +    gf_uuid_copy(resolve->pargfid, parent->gfid); +    resolve->parhint = parent; +    resolve->bname = gf_strdup(name); -	return 0; +    return 0;  } -  int -fuse_resolve_inode_init (fuse_state_t *state, fuse_resolve_t *resolve, -			 ino_t ino) +fuse_resolve_inode_init(fuse_state_t *state, fuse_resolve_t *resolve, ino_t ino)  { -	inode_t       *inode = NULL; +    inode_t *inode = NULL; -	inode = fuse_ino_to_inode (ino, state->this); -	gf_uuid_copy (resolve->gfid, inode->gfid); -	resolve->hint = inode; +    inode = fuse_ino_to_inode(ino, state->this); +    gf_uuid_copy(resolve->gfid, inode->gfid); +    resolve->hint = inode; -	return 0; +    return 0;  } -  int -fuse_resolve_fd_init (fuse_state_t *state, fuse_resolve_t *resolve, -		      fd_t *fd) +fuse_resolve_fd_init(fuse_state_t *state, fuse_resolve_t *resolve, fd_t *fd)  { -	resolve->fd = fd_ref (fd); +    resolve->fd = fd_ref(fd); -	return 0; +    return 0;  } -  static int -fuse_resolve (fuse_state_t *state) +fuse_resolve(fuse_state_t *state)  { -        fuse_resolve_t   *resolve = NULL; - -        resolve = state->resolve_now; +    fuse_resolve_t *resolve = NULL; -        if (resolve->fd) { +    resolve = state->resolve_now; -                fuse_resolve_fd (state); +    if (resolve->fd) { +        fuse_resolve_fd(state); -        } else if (!gf_uuid_is_null (resolve->pargfid)) { +    } else if (!gf_uuid_is_null(resolve->pargfid)) { +        fuse_resolve_parent(state); -                fuse_resolve_parent (state); +    } else if (!gf_uuid_is_null(resolve->gfid)) { +        fuse_resolve_inode(state); -        } else if (!gf_uuid_is_null (resolve->gfid)) { - -                fuse_resolve_inode (state); - -        } else { -                fuse_resolve_all (state); -        } +    } else { +        fuse_resolve_all(state); +    } -        return 0; +    return 0;  }  static int -fuse_resolve_done (fuse_state_t *state) +fuse_resolve_done(fuse_state_t *state)  { -        fuse_fop_resume (state); -        return 0; +    fuse_fop_resume(state); +    return 0;  }  /* @@ -669,53 +635,49 @@ fuse_resolve_done (fuse_state_t *state)   * state->resolve_now is used to decide which location/fd is to be resolved now   */  static int -fuse_resolve_all (fuse_state_t *state) +fuse_resolve_all(fuse_state_t *state)  { -        if (state->resolve_now == NULL) { - -                state->resolve_now = &state->resolve; -                state->loc_now     = &state->loc; - -                fuse_resolve (state); - -        } else if (state->resolve_now == &state->resolve) { +    if (state->resolve_now == NULL) { +        state->resolve_now = &state->resolve; +        state->loc_now = &state->loc; -                state->resolve_now = &state->resolve2; -                state->loc_now     = &state->loc2; +        fuse_resolve(state); -                fuse_resolve (state); +    } else if (state->resolve_now == &state->resolve) { +        state->resolve_now = &state->resolve2; +        state->loc_now = &state->loc2; -        } else if (state->resolve_now == &state->resolve2) { +        fuse_resolve(state); -                fuse_resolve_done (state); +    } else if (state->resolve_now == &state->resolve2) { +        fuse_resolve_done(state); -        } else { -                gf_log ("fuse-resolve", GF_LOG_ERROR, -                        "Invalid pointer for state->resolve_now"); -        } +    } else { +        gf_log("fuse-resolve", GF_LOG_ERROR, +               "Invalid pointer for state->resolve_now"); +    } -        return 0; +    return 0;  } -  int -fuse_resolve_continue (fuse_state_t *state) +fuse_resolve_continue(fuse_state_t *state)  { -        fuse_resolve_loc_touchup (state); +    fuse_resolve_loc_touchup(state); -        fuse_resolve_all (state); +    fuse_resolve_all(state); -        return 0; +    return 0;  }  int -fuse_resolve_and_resume (fuse_state_t *state, fuse_resume_fn_t fn) +fuse_resolve_and_resume(fuse_state_t *state, fuse_resume_fn_t fn)  { -        fuse_gfid_set (state); +    fuse_gfid_set(state); -        state->resume_fn = fn; +    state->resume_fn = fn; -        fuse_resolve_all (state); +    fuse_resolve_all(state); -        return 0; +    return 0;  }  | 
