diff options
Diffstat (limited to 'xlators/performance/io-threads/src/io-threads.c')
| -rw-r--r-- | xlators/performance/io-threads/src/io-threads.c | 51 | 
1 files changed, 51 insertions, 0 deletions
diff --git a/xlators/performance/io-threads/src/io-threads.c b/xlators/performance/io-threads/src/io-threads.c index a5fcd0300d0..bbcf4ed26ca 100644 --- a/xlators/performance/io-threads/src/io-threads.c +++ b/xlators/performance/io-threads/src/io-threads.c @@ -309,6 +309,7 @@ iot_schedule (call_frame_t *frame, xlator_t *this, call_stub_t *stub)          case GF_FOP_RCHECKSUM:  	case GF_FOP_FALLOCATE:  	case GF_FOP_DISCARD: +        case GF_FOP_ZEROFILL:                  pri = IOT_PRI_LO;                  break; @@ -2510,6 +2511,55 @@ out:  }  int +iot_zerofill_cbk(call_frame_t *frame, void *cookie, xlator_t *this, +                  int32_t op_ret, int32_t op_errno, +                  struct iatt *preop, struct iatt *postop, dict_t *xdata) +{ +        STACK_UNWIND_STRICT (zerofill, frame, op_ret, op_errno, preop, postop, +                             xdata); +        return 0; +} + +int +iot_zerofill_wrapper(call_frame_t *frame, xlator_t *this, fd_t *fd, +                     off_t offset, size_t len, dict_t *xdata) +{ +        STACK_WIND (frame, iot_zerofill_cbk, FIRST_CHILD (this), +                    FIRST_CHILD (this)->fops->zerofill, fd, offset, len, xdata); +        return 0; +} + +int +iot_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, +            size_t len, dict_t *xdata) +{ +        call_stub_t     *stub     = NULL; +        int              ret      = -1; + +        stub = fop_zerofill_stub(frame, iot_zerofill_wrapper, fd, +                                 offset, len, xdata); +        if (!stub) { +                gf_log (this->name, GF_LOG_ERROR, "cannot create zerofill stub" +                        "(out of memory)"); +                ret = -ENOMEM; +                goto out; +        } + +        ret = iot_schedule (frame, this, stub); + +out: +        if (ret < 0) { +                STACK_UNWIND_STRICT (zerofill, frame, -1, -ret, NULL, NULL, +                                     NULL); +                if (stub != NULL) { +                        call_stub_destroy (stub); +                } +        } +        return 0; +} + + +int  __iot_workers_scale (iot_conf_t *conf)  {          int       scale = 0; @@ -2840,6 +2890,7 @@ struct xlator_fops fops = {          .rchecksum   = iot_rchecksum,  	.fallocate   = iot_fallocate,  	.discard     = iot_discard, +        .zerofill    = iot_zerofill,  };  struct xlator_cbks cbks;  | 
