diff options
Diffstat (limited to 'xlators/protocol/client/src')
| -rw-r--r-- | xlators/protocol/client/src/client-rpc-fops.c | 103 | ||||
| -rw-r--r-- | xlators/protocol/client/src/client.c | 37 | 
2 files changed, 140 insertions, 0 deletions
diff --git a/xlators/protocol/client/src/client-rpc-fops.c b/xlators/protocol/client/src/client-rpc-fops.c index 38f4391145d..6355450c393 100644 --- a/xlators/protocol/client/src/client-rpc-fops.c +++ b/xlators/protocol/client/src/client-rpc-fops.c @@ -2048,6 +2048,62 @@ out:  }  int +client3_3_zerofill_cbk(struct rpc_req *req, struct iovec *iov, int count, +                      void *myframe) +{ +        call_frame_t    *frame         = NULL; +        gfs3_zerofill_rsp rsp          = {0,}; +        struct iatt      prestat       = {0,}; +        struct iatt      poststat      = {0,}; +        int              ret           = 0; +        xlator_t *this                 = NULL; +        dict_t  *xdata                 = NULL; + +        this = THIS; + +        frame = myframe; + +        if (-1 == req->rpc_status) { +                rsp.op_ret   = -1; +                rsp.op_errno = ENOTCONN; +                goto out; +        } +        ret = xdr_to_generic(*iov, &rsp, (xdrproc_t) xdr_gfs3_zerofill_rsp); +        if (ret < 0) { +                gf_log (this->name, GF_LOG_ERROR, "XDR decoding failed"); +                rsp.op_ret   = -1; +                rsp.op_errno = EINVAL; +                goto out; +        } + +        if (-1 != rsp.op_ret) { +                gf_stat_to_iatt (&rsp.statpre, &prestat); +                gf_stat_to_iatt (&rsp.statpost, &poststat); +        } + +        GF_PROTOCOL_DICT_UNSERIALIZE (this, xdata, (rsp.xdata.xdata_val), +                                      (rsp.xdata.xdata_len), ret, +                                      rsp.op_errno, out); + +out: +        if (rsp.op_ret == -1) { +                gf_log (this->name, GF_LOG_WARNING, +                        "remote operation failed: %s", +                        strerror (gf_error_to_errno (rsp.op_errno))); +        } +        CLIENT_STACK_UNWIND (zerofill, frame, rsp.op_ret, +                             gf_error_to_errno (rsp.op_errno), &prestat, +                             &poststat, xdata); + +        free (rsp.xdata.xdata_val); + +        if (xdata) +                dict_unref (xdata); + +        return 0; +} + +int  client3_3_setattr_cbk (struct rpc_req *req, struct iovec *iov, int count,                         void *myframe)  { @@ -5987,6 +6043,50 @@ unwind:          return 0;  } +int32_t +client3_3_zerofill(call_frame_t *frame, xlator_t *this, void *data) +{ +        clnt_args_t       *args        = NULL; +        int64_t            remote_fd   = -1; +        clnt_conf_t       *conf        = NULL; +        gfs3_zerofill_req   req        = {{0},}; +        int                op_errno    = ESTALE; +        int                ret         = 0; + +        if (!frame || !this || !data) +                goto unwind; + +        args = data; +        conf = this->private; + +        CLIENT_GET_REMOTE_FD (this, args->fd, DEFAULT_REMOTE_FD, +                              remote_fd, op_errno, unwind); + +        req.fd = remote_fd; +        req.offset = args->offset; +        req.size = args->size; +        memcpy(req.gfid, args->fd->inode->gfid, 16); + +        GF_PROTOCOL_DICT_SERIALIZE (this, args->xdata, (&req.xdata.xdata_val), +                                    req.xdata.xdata_len, op_errno, unwind); + +        ret = client_submit_request(this, &req, frame, conf->fops, +                                    GFS3_OP_ZEROFILL, client3_3_zerofill_cbk, +                                    NULL, NULL, 0, NULL, 0, NULL, +                                    (xdrproc_t) xdr_gfs3_zerofill_req); +        if (ret) +                gf_log (this->name, GF_LOG_WARNING, "failed to send the fop"); + +        GF_FREE (req.xdata.xdata_val); + +        return 0; +unwind: +        CLIENT_STACK_UNWIND(zerofill, frame, -1, op_errno, NULL, NULL, NULL); +        GF_FREE (req.xdata.xdata_val); + +        return 0; +} +  /* Table Specific to FOPS */ @@ -6034,6 +6134,7 @@ rpc_clnt_procedure_t clnt3_3_fop_actors[GF_FOP_MAXVALUE] = {          [GF_FOP_READDIRP]    = { "READDIRP",    client3_3_readdirp },  	[GF_FOP_FALLOCATE]   = { "FALLOCATE",	client3_3_fallocate },  	[GF_FOP_DISCARD]     = { "DISCARD",	client3_3_discard }, +        [GF_FOP_ZEROFILL]    = { "ZEROFILL",    client3_3_zerofill},          [GF_FOP_RELEASE]     = { "RELEASE",     client3_3_release },          [GF_FOP_RELEASEDIR]  = { "RELEASEDIR",  client3_3_releasedir },          [GF_FOP_GETSPEC]     = { "GETSPEC",     client3_getspec }, @@ -6088,6 +6189,8 @@ char *clnt3_3_fop_names[GFS3_OP_MAXVALUE] = {          [GFS3_OP_FREMOVEXATTR] = "FREMOVEXATTR",  	[GFS3_OP_FALLOCATE]   = "FALLOCATE",  	[GFS3_OP_DISCARD]     = "DISCARD", +        [GFS3_OP_ZEROFILL]    = "ZEROFILL", +  };  rpc_clnt_prog_t clnt3_3_fop_prog = { diff --git a/xlators/protocol/client/src/client.c b/xlators/protocol/client/src/client.c index 7703c6e8fba..1f7d13ea452 100644 --- a/xlators/protocol/client/src/client.c +++ b/xlators/protocol/client/src/client.c @@ -2031,6 +2031,42 @@ out:  }  int32_t +client_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, +               size_t len, dict_t *xdata) +{ +        int          ret              = -1; +        clnt_conf_t *conf             = NULL; +        rpc_clnt_procedure_t *proc    = NULL; +        clnt_args_t  args             = {0,}; + +        conf = this->private; +        if (!conf || !conf->fops) +                goto out; + +        args.fd = fd; +        args.offset = offset; +        args.size = len; +        args.xdata = xdata; + +        proc = &conf->fops->proctable[GF_FOP_ZEROFILL]; +        if (!proc) { +                gf_log (this->name, GF_LOG_ERROR, +                        "rpc procedure not found for %s", +                        gf_fop_list[GF_FOP_ZEROFILL]); +                goto out; +        } +        if (proc->fn) +                ret = proc->fn (frame, this, &args); +out: +        if (ret) +                STACK_UNWIND_STRICT(zerofill, frame, -1, ENOTCONN, +                                    NULL, NULL, NULL); + +        return 0; +} + + +int32_t  client_getspec (call_frame_t *frame, xlator_t *this, const char *key,                  int32_t flags)  { @@ -2749,6 +2785,7 @@ struct xlator_fops fops = {          .fsetattr    = client_fsetattr,  	.fallocate   = client_fallocate,  	.discard     = client_discard, +        .zerofill    = client_zerofill,          .getspec     = client_getspec,  };  | 
