diff options
Diffstat (limited to 'xlators/cluster/afr/src/afr-inode-write.c')
| -rw-r--r-- | xlators/cluster/afr/src/afr-inode-write.c | 227 | 
1 files changed, 212 insertions, 15 deletions
diff --git a/xlators/cluster/afr/src/afr-inode-write.c b/xlators/cluster/afr/src/afr-inode-write.c index 48094931f2e..cd6ba5e7df8 100644 --- a/xlators/cluster/afr/src/afr-inode-write.c +++ b/xlators/cluster/afr/src/afr-inode-write.c @@ -1355,8 +1355,8 @@ afr_setxattr_unwind (call_frame_t *frame, xlator_t *this)          if (main_frame) {                  AFR_STACK_UNWIND (setxattr, main_frame, -                                  local->op_ret, local->op_errno) -                        } +                                  local->op_ret, local->op_errno); +        }          return 0;  } @@ -1365,10 +1365,10 @@ int  afr_setxattr_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                         int32_t op_ret, int32_t op_errno)  { -        afr_local_t *   local = NULL; -        afr_private_t * priv  = NULL; -        int call_count  = -1; -        int need_unwind = 0; +        afr_local_t      *local         = NULL; +        afr_private_t    *priv          = NULL; +        int               call_count    = -1; +        int               need_unwind   = 0;          local = frame->local;          priv = this->private; @@ -1406,10 +1406,10 @@ afr_setxattr_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  int  afr_setxattr_wind (call_frame_t *frame, xlator_t *this)  { -        afr_local_t *local = NULL; -        afr_private_t *priv = NULL; -        int call_count = -1; -        int i = 0; +        afr_local_t      *local         = NULL; +        afr_private_t    *priv          = NULL; +        int               call_count    = -1; +        int               i             = 0;          local = frame->local;          priv = this->private; @@ -1446,7 +1446,7 @@ afr_setxattr_wind (call_frame_t *frame, xlator_t *this)  int  afr_setxattr_done (call_frame_t *frame, xlator_t *this)  { -        afr_local_t * local = frame->local; +        afr_local_t   *local    = frame->local;          local->transaction.unwind (frame, this); @@ -1459,16 +1459,23 @@ int  afr_setxattr (call_frame_t *frame, xlator_t *this,                loc_t *loc, dict_t *dict, int32_t flags)  { -        afr_private_t * priv  = NULL; -        afr_local_t   * local = NULL; +        afr_private_t  *priv              = NULL; +        afr_local_t    *local             = NULL;          call_frame_t   *transaction_frame = NULL; -        int ret = -1; -        int op_errno = 0; +        data_pair_t    *trav              = NULL; +        int             ret               = -1; +        int             op_errno          = EINVAL;          VALIDATE_OR_GOTO (frame, out);          VALIDATE_OR_GOTO (this, out);          VALIDATE_OR_GOTO (this->private, out); +        GF_IF_INTERNAL_XATTR_GOTO ("trusted.afr.*", dict, +                                   trav, op_errno, out); + +        GF_IF_INTERNAL_XATTR_GOTO ("trusted.glusterfs.afr.*", dict, +                                   trav, op_errno, out); +          priv = this->private;          QUORUM_CHECK(setxattr,out); @@ -1511,6 +1518,196 @@ out:          return 0;  } +/* {{{ fsetxattr */ + + +int +afr_fsetxattr_unwind (call_frame_t *frame, xlator_t *this) +{ +        afr_local_t    *local         = NULL; +        call_frame_t   *main_frame    = NULL; + +        local = frame->local; + +        LOCK (&frame->lock); +        { +                if (local->transaction.main_frame) +                        main_frame = local->transaction.main_frame; +                local->transaction.main_frame = NULL; +        } +        UNLOCK (&frame->lock); + +        if (main_frame) { +                AFR_STACK_UNWIND (fsetxattr, main_frame, +                                  local->op_ret, local->op_errno); +        } +        return 0; +} + + +int +afr_fsetxattr_wind_cbk (call_frame_t *frame, void *cookie, xlator_t *this, +                        int32_t op_ret, int32_t op_errno) +{ +        afr_local_t     *local       = NULL; +        afr_private_t   *priv        = NULL; +        int              call_count  = -1; +        int              need_unwind = 0; + +        local = frame->local; +        priv = this->private; + +        LOCK (&frame->lock); +        { +                if (op_ret != -1) { +                        if (local->success_count == 0) { +                                local->op_ret = op_ret; +                        } +                        local->success_count++; + +                        if (local->success_count == priv->child_count) { +                                need_unwind = 1; +                        } +                } + +                local->op_errno = op_errno; +        } +        UNLOCK (&frame->lock); + +        if (need_unwind) +                local->transaction.unwind (frame, this); + +        call_count = afr_frame_return (frame); + +        if (call_count == 0) { +                local->transaction.resume (frame, this); +        } + +        return 0; +} + + +int +afr_fsetxattr_wind (call_frame_t *frame, xlator_t *this) +{ +        afr_local_t        *local       = NULL; +        afr_private_t      *priv        = NULL; +        int                 call_count  = -1; +        int                 i           = 0; + +        local = frame->local; +        priv = this->private; + +        call_count = afr_pre_op_done_children_count (local->transaction.pre_op, +                                                     priv->child_count); + +        if (call_count == 0) { +                local->transaction.resume (frame, this); +                return 0; +        } + +        local->call_count = call_count; + +        for (i = 0; i < priv->child_count; i++) { +                if (local->transaction.pre_op[i]) { +                        STACK_WIND_COOKIE (frame, afr_fsetxattr_wind_cbk, +                                           (void *) (long) i, +                                           priv->children[i], +                                           priv->children[i]->fops->fsetxattr, +                                           local->fd, +                                           local->cont.fsetxattr.dict, +                                           local->cont.fsetxattr.flags); + +                        if (!--call_count) +                                break; +                } +        } + +        return 0; +} + + +int +afr_fsetxattr_done (call_frame_t *frame, xlator_t *this) +{ +        afr_local_t   *local   = frame->local; + +        local->transaction.unwind (frame, this); + +        AFR_STACK_DESTROY (frame); + +        return 0; +} + +int +afr_fsetxattr (call_frame_t *frame, xlator_t *this, +               fd_t *fd, dict_t *dict, int32_t flags) +{ +        afr_private_t    *priv              = NULL; +        afr_local_t      *local             = NULL; +        call_frame_t     *transaction_frame = NULL; +        int               ret               = -1; +        int               op_errno          = EINVAL; +        data_pair_t      *trav              = NULL; + +        VALIDATE_OR_GOTO (frame, out); +        VALIDATE_OR_GOTO (this, out); +        VALIDATE_OR_GOTO (this->private, out); + +        GF_IF_INTERNAL_XATTR_GOTO ("trusted.afr.*", dict, +                                   trav, op_errno, out); + +        GF_IF_INTERNAL_XATTR_GOTO ("trusted.glusterfs.afr.*", dict, +                                   trav, op_errno, out); + +        if (ret) +                goto out; + +        priv = this->private; + +        QUORUM_CHECK(fsetxattr,out); + +        ALLOC_OR_GOTO (local, afr_local_t, out); + +        ret = afr_local_init (local, priv, &op_errno); +        if (ret < 0) +                goto out; + +        transaction_frame = copy_frame (frame); +        if (!transaction_frame) { +                goto out; +        } + +        transaction_frame->local = local; + +        local->op_ret = -1; + +        local->cont.fsetxattr.dict  = dict_ref (dict); +        local->cont.fsetxattr.flags = flags; + +        local->transaction.fop    = afr_fsetxattr_wind; +        local->transaction.done   = afr_fsetxattr_done; +        local->transaction.unwind = afr_fsetxattr_unwind; + +        local->fd                 = fd_ref (fd); + +        local->transaction.main_frame = frame; +        local->transaction.start  = LLONG_MAX - 1; +        local->transaction.len    = 0; + +        afr_transaction (transaction_frame, this, AFR_METADATA_TRANSACTION); + +        ret = 0; +out: +        if (ret < 0) { +                if (transaction_frame) +                        AFR_STACK_DESTROY (transaction_frame); +                AFR_STACK_UNWIND (fsetxattr, frame, -1, op_errno); +        } + +        return 0; +} +  /* }}} */  /* {{{ removexattr */  | 
