diff options
Diffstat (limited to 'xlators/protocol/client/src/client-rpc-fops.c')
| -rw-r--r-- | xlators/protocol/client/src/client-rpc-fops.c | 101 | 
1 files changed, 101 insertions, 0 deletions
diff --git a/xlators/protocol/client/src/client-rpc-fops.c b/xlators/protocol/client/src/client-rpc-fops.c index 0dd422edaaa..62038acc4db 100644 --- a/xlators/protocol/client/src/client-rpc-fops.c +++ b/xlators/protocol/client/src/client-rpc-fops.c @@ -2271,6 +2271,58 @@ out:          return 0;  } + +int +client3_3_seek_cbk (struct rpc_req *req, struct iovec *iov, int count, +                    void *myframe) +{ +        call_frame_t          *frame     = NULL; +        struct gfs3_seek_rsp   rsp       = {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_seek_rsp); +        if (ret < 0) { +                gf_msg (this->name, GF_LOG_ERROR, EINVAL, +                        PC_MSG_XDR_DECODING_FAILED, "XDR decoding failed"); +                rsp.op_ret   = -1; +                rsp.op_errno = EINVAL; +                goto out; +        } + +        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_msg (this->name, GF_LOG_WARNING, +                        gf_error_to_errno (rsp.op_errno), +                        PC_MSG_REMOTE_OP_FAILED, +                        "remote operation failed"); +        } +        CLIENT_STACK_UNWIND (seek, frame, +                             rsp.op_ret, gf_error_to_errno (rsp.op_errno), +                             rsp.offset, 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) @@ -6341,6 +6393,53 @@ unwind:          return 0;  } +int32_t +client3_3_seek (call_frame_t *frame, xlator_t *this, void *data) +{ +        clnt_args_t            *args        = NULL; +        clnt_conf_t            *conf        = NULL; +        struct gfs3_seek_req    req         = {{0,},}; +        int                     op_errno    = ESTALE; +        int                     ret         = 0; +        int64_t                 remote_fd   = -1; + +        GF_ASSERT (frame); + +        if (!this || !data) +                goto unwind; + +        args = data; +        conf = this->private; + +        CLIENT_GET_REMOTE_FD (this, args->fd, DEFAULT_REMOTE_FD, +                              remote_fd, op_errno, unwind); + +        memcpy (req.gfid, args->fd->inode->gfid, 16); +        req.fd = remote_fd; +        req.offset = args->offset; +        req.what = args->what; + +        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_SEEK, client3_3_seek_cbk, +                                    NULL, NULL, 0, NULL, 0, NULL, +                                    (xdrproc_t) xdr_gfs3_seek_req); +        if (ret) +                gf_msg (this->name, GF_LOG_WARNING, 0, PC_MSG_FOP_SEND_FAILED, +                        "failed to send the fop"); + +        GF_FREE (req.xdata.xdata_val); + +        return 0; +unwind: +        CLIENT_STACK_UNWIND(ipc, frame, -1, op_errno, NULL); +        GF_FREE (req.xdata.xdata_val); + +        return 0; +} +  /* Table Specific to FOPS */ @@ -6394,6 +6493,7 @@ rpc_clnt_procedure_t clnt3_3_fop_actors[GF_FOP_MAXVALUE] = {          [GF_FOP_GETSPEC]      = { "GETSPEC",      client3_getspec },          [GF_FOP_FREMOVEXATTR] = { "FREMOVEXATTR", client3_3_fremovexattr },          [GF_FOP_IPC]          = { "IPC",          client3_3_ipc }, +        [GF_FOP_SEEK]         = { "SEEK",         client3_3_seek },  };  /* Used From RPC-CLNT library to log proper name of procedure based on number */ @@ -6446,6 +6546,7 @@ char *clnt3_3_fop_names[GFS3_OP_MAXVALUE] = {  	[GFS3_OP_DISCARD]     = "DISCARD",          [GFS3_OP_ZEROFILL]    = "ZEROFILL",          [GFS3_OP_IPC]         = "IPC", +        [GFS3_OP_SEEK]        = "SEEK",  };  | 
