diff options
Diffstat (limited to 'xlators/cluster/afr/src/afr-open.c')
| -rw-r--r-- | xlators/cluster/afr/src/afr-open.c | 526 | 
1 files changed, 254 insertions, 272 deletions
diff --git a/xlators/cluster/afr/src/afr-open.c b/xlators/cluster/afr/src/afr-open.c index 3057deed604..a202d528ec8 100644 --- a/xlators/cluster/afr/src/afr-open.c +++ b/xlators/cluster/afr/src/afr-open.c @@ -36,336 +36,318 @@  #include "afr-dir-write.h"  #include "afr-transaction.h" -  gf_boolean_t -afr_is_fd_fixable (fd_t *fd) +afr_is_fd_fixable(fd_t *fd)  { -        if (!fd || !fd->inode) -                return _gf_false; -        else if (fd_is_anonymous (fd)) -                return _gf_false; -        else if (gf_uuid_is_null (fd->inode->gfid)) -                return _gf_false; - -        return _gf_true; +    if (!fd || !fd->inode) +        return _gf_false; +    else if (fd_is_anonymous(fd)) +        return _gf_false; +    else if (gf_uuid_is_null(fd->inode->gfid)) +        return _gf_false; + +    return _gf_true;  } -  int -afr_open_ftruncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -                        int32_t op_ret, int32_t op_errno, struct iatt *prebuf, -                        struct iatt *postbuf, dict_t *xdata) +afr_open_ftruncate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, +                       int32_t op_ret, int32_t op_errno, struct iatt *prebuf, +                       struct iatt *postbuf, dict_t *xdata)  { -        afr_local_t * local = frame->local; +    afr_local_t *local = frame->local; -        AFR_STACK_UNWIND (open, frame, local->op_ret, local->op_errno, -                          local->fd, xdata); -        return 0; +    AFR_STACK_UNWIND(open, frame, local->op_ret, local->op_errno, local->fd, +                     xdata); +    return 0;  }  int -afr_open_cbk (call_frame_t *frame, void *cookie, -              xlator_t *this, int32_t op_ret, int32_t op_errno, -              fd_t *fd, dict_t *xdata) +afr_open_cbk(call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, +             int32_t op_errno, fd_t *fd, dict_t *xdata)  { -        afr_local_t   *local           = NULL; -        int           call_count       = -1; -        int           child_index      = (long) cookie; -        afr_fd_ctx_t  *fd_ctx          = NULL; - -        local = frame->local; -	fd_ctx = local->fd_ctx; - -        LOCK (&frame->lock); -        { -                if (op_ret == -1) { -                        local->op_errno = op_errno; -			fd_ctx->opened_on[child_index] = AFR_FD_NOT_OPENED; -                } else { -                        local->op_ret = op_ret; -			fd_ctx->opened_on[child_index] = AFR_FD_OPENED; -			if (!local->xdata_rsp && xdata) -				local->xdata_rsp = dict_ref (xdata); -                } +    afr_local_t *local = NULL; +    int call_count = -1; +    int child_index = (long)cookie; +    afr_fd_ctx_t *fd_ctx = NULL; + +    local = frame->local; +    fd_ctx = local->fd_ctx; + +    LOCK(&frame->lock); +    { +        if (op_ret == -1) { +            local->op_errno = op_errno; +            fd_ctx->opened_on[child_index] = AFR_FD_NOT_OPENED; +        } else { +            local->op_ret = op_ret; +            fd_ctx->opened_on[child_index] = AFR_FD_OPENED; +            if (!local->xdata_rsp && xdata) +                local->xdata_rsp = dict_ref(xdata);          } -        UNLOCK (&frame->lock); - -        call_count = afr_frame_return (frame); - -        if (call_count == 0) { -                if ((fd_ctx->flags & O_TRUNC) && (local->op_ret >= 0)) { -                        STACK_WIND (frame, afr_open_ftruncate_cbk, -                                    this, this->fops->ftruncate, -                                    fd, 0, NULL); -                } else { -                        AFR_STACK_UNWIND (open, frame, local->op_ret, -                                          local->op_errno, local->cont.open.fd, -                                          local->xdata_rsp); -                } +    } +    UNLOCK(&frame->lock); + +    call_count = afr_frame_return(frame); + +    if (call_count == 0) { +        if ((fd_ctx->flags & O_TRUNC) && (local->op_ret >= 0)) { +            STACK_WIND(frame, afr_open_ftruncate_cbk, this, +                       this->fops->ftruncate, fd, 0, NULL); +        } else { +            AFR_STACK_UNWIND(open, frame, local->op_ret, local->op_errno, +                             local->cont.open.fd, local->xdata_rsp);          } +    } -        return 0; +    return 0;  } -  int -afr_open_continue (call_frame_t *frame, xlator_t *this, int err) +afr_open_continue(call_frame_t *frame, xlator_t *this, int err)  { -        afr_local_t   *local     = NULL; -        afr_private_t *priv      = NULL; -        int           call_count = 0; -        int           i          = 0; +    afr_local_t *local = NULL; +    afr_private_t *priv = NULL; +    int call_count = 0; +    int i = 0; -        local  = frame->local; -        priv   = this->private; +    local = frame->local; +    priv = this->private; -        if (err) { -                AFR_STACK_UNWIND (open, frame, -1, err, NULL, NULL); -        } else { -                local->call_count = AFR_COUNT (local->child_up, -                                               priv->child_count); -                call_count = local->call_count; - -                for (i = 0; i < priv->child_count; i++) { -                        if (local->child_up[i]) { -                                STACK_WIND_COOKIE (frame, afr_open_cbk, -                                                   (void *)(long)i, -                                                   priv->children[i], -                                                  priv->children[i]->fops->open, -                                                   &local->loc, -                                            (local->cont.open.flags & ~O_TRUNC), -                                                   local->cont.open.fd, -                                                   local->xdata_req); -                                if (!--call_count) -                                        break; -                        } -                } +    if (err) { +        AFR_STACK_UNWIND(open, frame, -1, err, NULL, NULL); +    } else { +        local->call_count = AFR_COUNT(local->child_up, priv->child_count); +        call_count = local->call_count; + +        for (i = 0; i < priv->child_count; i++) { +            if (local->child_up[i]) { +                STACK_WIND_COOKIE(frame, afr_open_cbk, (void *)(long)i, +                                  priv->children[i], +                                  priv->children[i]->fops->open, &local->loc, +                                  (local->cont.open.flags & ~O_TRUNC), +                                  local->cont.open.fd, local->xdata_req); +                if (!--call_count) +                    break; +            }          } -        return 0; +    } +    return 0;  }  int -afr_open (call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, -          fd_t *fd, dict_t *xdata) +afr_open(call_frame_t *frame, xlator_t *this, loc_t *loc, int32_t flags, +         fd_t *fd, dict_t *xdata)  { -        afr_private_t *priv            = NULL; -        afr_local_t   *local           = NULL; -        int           spb_choice       = 0; -        int           event_generation = 0; -        int           ret              = 0; -        int32_t       op_errno         = 0; -        afr_fd_ctx_t  *fd_ctx          = NULL; - -        //We can't let truncation to happen outside transaction. - -        priv = this->private; - -	local = AFR_FRAME_INIT (frame, op_errno); -	if (!local) -		goto out; - -        local->op = GF_FOP_OPEN; -	fd_ctx = afr_fd_ctx_get (fd, this); -	if (!fd_ctx) { -		op_errno = ENOMEM; -		goto out; -	} - -        if (!afr_is_consistent_io_possible (local, priv, &op_errno)) -		goto out; - -        local->inode = inode_ref (loc->inode); -        loc_copy (&local->loc, loc); -	local->fd_ctx = fd_ctx; -	fd_ctx->flags = flags; -        if (xdata) -                local->xdata_req = dict_ref (xdata); - -        local->cont.open.flags = flags; -        local->cont.open.fd = fd_ref (fd); - -        ret = afr_inode_get_readable (frame, local->inode, this, -                                      NULL, &event_generation, -                                      AFR_DATA_TRANSACTION); -        if ((ret < 0) && -            (afr_inode_split_brain_choice_get (local->inode, -                                             this, &spb_choice) == 0) && -            spb_choice < 0) { -                afr_inode_refresh (frame, this, local->inode, -                                   local->inode->gfid, afr_open_continue); -        } else { -                afr_open_continue (frame, this, 0); -        } - -	return 0; +    afr_private_t *priv = NULL; +    afr_local_t *local = NULL; +    int spb_choice = 0; +    int event_generation = 0; +    int ret = 0; +    int32_t op_errno = 0; +    afr_fd_ctx_t *fd_ctx = NULL; + +    // We can't let truncation to happen outside transaction. + +    priv = this->private; + +    local = AFR_FRAME_INIT(frame, op_errno); +    if (!local) +        goto out; + +    local->op = GF_FOP_OPEN; +    fd_ctx = afr_fd_ctx_get(fd, this); +    if (!fd_ctx) { +        op_errno = ENOMEM; +        goto out; +    } + +    if (!afr_is_consistent_io_possible(local, priv, &op_errno)) +        goto out; + +    local->inode = inode_ref(loc->inode); +    loc_copy(&local->loc, loc); +    local->fd_ctx = fd_ctx; +    fd_ctx->flags = flags; +    if (xdata) +        local->xdata_req = dict_ref(xdata); + +    local->cont.open.flags = flags; +    local->cont.open.fd = fd_ref(fd); + +    ret = afr_inode_get_readable(frame, local->inode, this, NULL, +                                 &event_generation, AFR_DATA_TRANSACTION); +    if ((ret < 0) && +        (afr_inode_split_brain_choice_get(local->inode, this, &spb_choice) == +         0) && +        spb_choice < 0) { +        afr_inode_refresh(frame, this, local->inode, local->inode->gfid, +                          afr_open_continue); +    } else { +        afr_open_continue(frame, this, 0); +    } + +    return 0;  out: -	AFR_STACK_UNWIND (open, frame, -1, op_errno, fd, NULL); +    AFR_STACK_UNWIND(open, frame, -1, op_errno, fd, NULL); -        return 0; +    return 0;  }  int -afr_openfd_fix_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, -                         int32_t op_ret, int32_t op_errno, fd_t *fd, -                         dict_t *xdata) +afr_openfd_fix_open_cbk(call_frame_t *frame, void *cookie, xlator_t *this, +                        int32_t op_ret, int32_t op_errno, fd_t *fd, +                        dict_t *xdata)  { -        afr_local_t   *local      = NULL; -        afr_private_t *priv       = NULL; -        afr_fd_ctx_t  *fd_ctx     = NULL; -        int           call_count  = 0; -        int           child_index = (long) cookie; - -        priv     = this->private; -        local    = frame->local; - +    afr_local_t *local = NULL; +    afr_private_t *priv = NULL; +    afr_fd_ctx_t *fd_ctx = NULL; +    int call_count = 0; +    int child_index = (long)cookie; + +    priv = this->private; +    local = frame->local; + +    if (op_ret >= 0) { +        gf_msg_debug(this->name, 0, +                     "fd for %s opened " +                     "successfully on subvolume %s", +                     local->loc.path, priv->children[child_index]->name); +    } else { +        gf_msg(this->name, fop_log_level(GF_FOP_OPEN, op_errno), op_errno, +               AFR_MSG_OPEN_FAIL, +               "Failed to open %s on " +               "subvolume %s", +               local->loc.path, priv->children[child_index]->name); +    } + +    fd_ctx = local->fd_ctx; + +    LOCK(&local->fd->lock); +    {          if (op_ret >= 0) { -                gf_msg_debug (this->name, 0, "fd for %s opened " -                              "successfully on subvolume %s", local->loc.path, -                              priv->children[child_index]->name); +            fd_ctx->opened_on[child_index] = AFR_FD_OPENED;          } else { -                gf_msg (this->name, fop_log_level (GF_FOP_OPEN, op_errno), -                        op_errno, AFR_MSG_OPEN_FAIL, "Failed to open %s on " -                        "subvolume %s", local->loc.path, -                        priv->children[child_index]->name); +            fd_ctx->opened_on[child_index] = AFR_FD_NOT_OPENED;          } +    } +    UNLOCK(&local->fd->lock); -        fd_ctx = local->fd_ctx; +    call_count = afr_frame_return(frame); +    if (call_count == 0) +        AFR_STACK_DESTROY(frame); -        LOCK (&local->fd->lock); -        { -                if (op_ret >= 0) { -                        fd_ctx->opened_on[child_index] = AFR_FD_OPENED; -                } else { -                        fd_ctx->opened_on[child_index] = AFR_FD_NOT_OPENED; -                } -        } -        UNLOCK (&local->fd->lock); +    return 0; +} -        call_count = afr_frame_return (frame); -        if (call_count == 0) -                AFR_STACK_DESTROY (frame); +static int +afr_fd_ctx_need_open(fd_t *fd, xlator_t *this, unsigned char *need_open) +{ +    afr_fd_ctx_t *fd_ctx = NULL; +    afr_private_t *priv = NULL; +    int i = 0; +    int count = 0; +    priv = this->private; + +    fd_ctx = afr_fd_ctx_get(fd, this); +    if (!fd_ctx)          return 0; -} +    LOCK(&fd->lock); +    { +        for (i = 0; i < priv->child_count; i++) { +            if (fd_ctx->opened_on[i] == AFR_FD_NOT_OPENED && +                priv->child_up[i]) { +                fd_ctx->opened_on[i] = AFR_FD_OPENING; +                need_open[i] = 1; +                count++; +            } else { +                need_open[i] = 0; +            } +        } +    } +    UNLOCK(&fd->lock); -static int -afr_fd_ctx_need_open (fd_t *fd, xlator_t *this, unsigned char *need_open) -{ -	afr_fd_ctx_t *fd_ctx = NULL; -	afr_private_t *priv = NULL; -	int i = 0; -	int count = 0; - -	priv = this->private; - -	fd_ctx = afr_fd_ctx_get (fd, this); -	if (!fd_ctx) -		return 0; - -	LOCK (&fd->lock); -	{ -		for (i = 0; i < priv->child_count; i++) { -			if (fd_ctx->opened_on[i] == AFR_FD_NOT_OPENED && -			    priv->child_up[i]) { -				fd_ctx->opened_on[i] = AFR_FD_OPENING; -				need_open[i] = 1; -				count++; -			} else { -				need_open[i] = 0; -			} -		} -	} -	UNLOCK (&fd->lock); - -	return count; +    return count;  } -  void -afr_fix_open (fd_t *fd, xlator_t *this) +afr_fix_open(fd_t *fd, xlator_t *this)  { -        afr_private_t *priv    = NULL; -        int           i        = 0; -        call_frame_t  *frame   = NULL; -        afr_local_t   *local   = NULL; -        int           ret      = -1; -        int32_t       op_errno = 0; -        afr_fd_ctx_t  *fd_ctx  = NULL; -	unsigned char *need_open = NULL; -	int call_count = 0; +    afr_private_t *priv = NULL; +    int i = 0; +    call_frame_t *frame = NULL; +    afr_local_t *local = NULL; +    int ret = -1; +    int32_t op_errno = 0; +    afr_fd_ctx_t *fd_ctx = NULL; +    unsigned char *need_open = NULL; +    int call_count = 0; -        priv  = this->private; +    priv = this->private; -        if (!afr_is_fd_fixable (fd)) -                goto out; +    if (!afr_is_fd_fixable(fd)) +        goto out; -        fd_ctx = afr_fd_ctx_get (fd, this); -        if (!fd_ctx) -                goto out; +    fd_ctx = afr_fd_ctx_get(fd, this); +    if (!fd_ctx) +        goto out; -	need_open = alloca0 (priv->child_count); +    need_open = alloca0(priv->child_count); -	call_count = afr_fd_ctx_need_open (fd, this, need_open); -	if (!call_count) -		goto out; +    call_count = afr_fd_ctx_need_open(fd, this, need_open); +    if (!call_count) +        goto out; -        frame = create_frame (this, this->ctx->pool); -        if (!frame) -                goto out; +    frame = create_frame(this, this->ctx->pool); +    if (!frame) +        goto out; -	local = AFR_FRAME_INIT (frame, op_errno); -	if (!local) -		goto out; +    local = AFR_FRAME_INIT(frame, op_errno); +    if (!local) +        goto out; -        local->loc.inode = inode_ref (fd->inode); -        ret = loc_path (&local->loc, NULL); -        if (ret < 0) -                goto out; +    local->loc.inode = inode_ref(fd->inode); +    ret = loc_path(&local->loc, NULL); +    if (ret < 0) +        goto out; -        local->fd = fd_ref (fd); -	local->fd_ctx = fd_ctx; +    local->fd = fd_ref(fd); +    local->fd_ctx = fd_ctx; -        local->call_count = call_count; +    local->call_count = call_count; -        gf_msg_debug (this->name, 0, "need open count: %d", -                      call_count); +    gf_msg_debug(this->name, 0, "need open count: %d", call_count); -        for (i = 0; i < priv->child_count; i++) { -                if (!need_open[i]) -                        continue; - -                if (IA_IFDIR == fd->inode->ia_type) { -                        gf_msg_debug (this->name, 0, -                                      "opening fd for dir %s on subvolume %s", -                                      local->loc.path, priv->children[i]->name); - -                        STACK_WIND_COOKIE (frame, afr_openfd_fix_open_cbk, -                                           (void*) (long) i, -                                           priv->children[i], -                                           priv->children[i]->fops->opendir, -                                           &local->loc, local->fd, -                                           NULL); -                } else { -                        gf_msg_debug (this->name, 0, -                                      "opening fd for file %s on subvolume %s", -                                      local->loc.path, priv->children[i]->name); - -                        STACK_WIND_COOKIE (frame, afr_openfd_fix_open_cbk, -                                           (void *)(long) i, -                                           priv->children[i], -                                           priv->children[i]->fops->open, -                                           &local->loc, -                                           fd_ctx->flags & (~O_TRUNC), -                                           local->fd, NULL); -                } - -		if (!--call_count) -			break; +    for (i = 0; i < priv->child_count; i++) { +        if (!need_open[i]) +            continue; + +        if (IA_IFDIR == fd->inode->ia_type) { +            gf_msg_debug(this->name, 0, "opening fd for dir %s on subvolume %s", +                         local->loc.path, priv->children[i]->name); + +            STACK_WIND_COOKIE(frame, afr_openfd_fix_open_cbk, (void *)(long)i, +                              priv->children[i], +                              priv->children[i]->fops->opendir, &local->loc, +                              local->fd, NULL); +        } else { +            gf_msg_debug(this->name, 0, +                         "opening fd for file %s on subvolume %s", +                         local->loc.path, priv->children[i]->name); + +            STACK_WIND_COOKIE(frame, afr_openfd_fix_open_cbk, (void *)(long)i, +                              priv->children[i], priv->children[i]->fops->open, +                              &local->loc, fd_ctx->flags & (~O_TRUNC), +                              local->fd, NULL);          } -	return; +        if (!--call_count) +            break; +    } + +    return;  out: -        if (frame) -                AFR_STACK_DESTROY (frame); +    if (frame) +        AFR_STACK_DESTROY(frame);  }  | 
