diff options
Diffstat (limited to 'xlators/features/bit-rot/src/stub/bit-rot-stub.c')
| -rw-r--r-- | xlators/features/bit-rot/src/stub/bit-rot-stub.c | 51 | 
1 files changed, 51 insertions, 0 deletions
diff --git a/xlators/features/bit-rot/src/stub/bit-rot-stub.c b/xlators/features/bit-rot/src/stub/bit-rot-stub.c index b9a527681ab..d48a3f751f3 100644 --- a/xlators/features/bit-rot/src/stub/bit-rot-stub.c +++ b/xlators/features/bit-rot/src/stub/bit-rot-stub.c @@ -1642,6 +1642,10 @@ br_stub_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (ret < 0) {                  ret = br_stub_init_inode_versions (this, fd, inode, version,                                                     _gf_true); +                if (ret) { +                        op_ret = -1; +                        op_errno = EINVAL; +                }          } else {                  ctx = (br_stub_inode_ctx_t *)(long)ctx_addr;                  ret = br_stub_add_fd_to_inode (this, fd, ctx); @@ -1674,6 +1678,52 @@ unwind:          return 0;  } +int +br_stub_mknod_cbk (call_frame_t *frame, void *cookie, xlator_t *this, +                   int op_ret, int op_errno, inode_t *inode, +                    struct iatt *stbuf, struct iatt *preparent, +                    struct iatt *postparent, dict_t *xdata) +{ +        int32_t              ret      = -1; +        unsigned long        version  = BITROT_DEFAULT_CURRENT_VERSION; + +        if (op_ret < 0) +                goto unwind; + +        ret = br_stub_init_inode_versions (this, NULL, inode, version, +                                           _gf_true); +        /** +         * Like lookup, if init_inode_versions fail, return EINVAL +         */ +        if (ret) { +                op_ret = -1; +                op_errno = EINVAL; +        } + +unwind: +        STACK_UNWIND_STRICT (mknod, frame, op_ret, op_errno, +                             inode, stbuf, preparent, postparent, xdata); +        return 0; +} + +int +br_stub_mknod (call_frame_t *frame, xlator_t *this, +                loc_t *loc, mode_t mode, dev_t dev, mode_t umask, dict_t *xdata) +{ +        GF_VALIDATE_OR_GOTO ("bit-rot-stub", this, unwind); +        GF_VALIDATE_OR_GOTO (this->name, loc, unwind); +        GF_VALIDATE_OR_GOTO (this->name, loc->inode, unwind); + +        STACK_WIND (frame, br_stub_mknod_cbk, FIRST_CHILD (this), +                    FIRST_CHILD (this)->fops->mknod, +                    loc, mode, dev, umask, xdata); +        return 0; +unwind: +        STACK_UNWIND_STRICT (mknod, frame, -1, EINVAL, NULL, NULL, NULL, +                             NULL, NULL); +        return 0; +} +  /** }}} */  static inline int32_t @@ -2139,6 +2189,7 @@ struct xlator_fops fops = {          .writev    = br_stub_writev,          .truncate  = br_stub_truncate,          .ftruncate = br_stub_ftruncate, +        .mknod     = br_stub_mknod,  };  struct xlator_cbks cbks = {  | 
