📄 nfs4xdr.c
字号:
xdr_inline_pages(&req->rq_rcv_buf, replen, readdir->pages, readdir->pgbase, readdir->count); return 0;}static int encode_readlink(struct xdr_stream *xdr, const struct nfs4_readlink *readlink, struct rpc_rqst *req){ struct rpc_auth *auth = req->rq_task->tk_auth; unsigned int replen; uint32_t *p; RESERVE_SPACE(4); WRITE32(OP_READLINK); /* set up reply kvec * toplevel_status + taglen + rescount + OP_PUTFH + status * + OP_READLINK + status + string length = 8 */ replen = (RPC_REPHDRSIZE + auth->au_rslack + 8) << 2; xdr_inline_pages(&req->rq_rcv_buf, replen, readlink->pages, readlink->pgbase, readlink->pglen); return 0;}static int encode_remove(struct xdr_stream *xdr, const struct qstr *name){ uint32_t *p; RESERVE_SPACE(8 + name->len); WRITE32(OP_REMOVE); WRITE32(name->len); WRITEMEM(name->name, name->len); return 0;}static int encode_rename(struct xdr_stream *xdr, const struct qstr *oldname, const struct qstr *newname){ uint32_t *p; RESERVE_SPACE(8 + oldname->len); WRITE32(OP_RENAME); WRITE32(oldname->len); WRITEMEM(oldname->name, oldname->len); RESERVE_SPACE(4 + newname->len); WRITE32(newname->len); WRITEMEM(newname->name, newname->len); return 0;}static int encode_renew(struct xdr_stream *xdr, const struct nfs4_client *client_stateid){ uint32_t *p; RESERVE_SPACE(12); WRITE32(OP_RENEW); WRITE64(client_stateid->cl_clientid); return 0;}static intencode_savefh(struct xdr_stream *xdr){ uint32_t *p; RESERVE_SPACE(4); WRITE32(OP_SAVEFH); return 0;}static int encode_setattr(struct xdr_stream *xdr, const struct nfs_setattrargs *arg, const struct nfs_server *server){ int status; uint32_t *p; RESERVE_SPACE(4+sizeof(arg->stateid.data)); WRITE32(OP_SETATTR); WRITEMEM(arg->stateid.data, sizeof(arg->stateid.data)); if ((status = encode_attrs(xdr, arg->iap, server))) return status; return 0;}static int encode_setclientid(struct xdr_stream *xdr, const struct nfs4_setclientid *setclientid){ uint32_t *p; RESERVE_SPACE(4 + sizeof(setclientid->sc_verifier->data)); WRITE32(OP_SETCLIENTID); WRITEMEM(setclientid->sc_verifier->data, sizeof(setclientid->sc_verifier->data)); encode_string(xdr, setclientid->sc_name_len, setclientid->sc_name); RESERVE_SPACE(4); WRITE32(setclientid->sc_prog); encode_string(xdr, setclientid->sc_netid_len, setclientid->sc_netid); encode_string(xdr, setclientid->sc_uaddr_len, setclientid->sc_uaddr); RESERVE_SPACE(4); WRITE32(setclientid->sc_cb_ident); return 0;}static int encode_setclientid_confirm(struct xdr_stream *xdr, const struct nfs4_client *client_state){ uint32_t *p; RESERVE_SPACE(12 + sizeof(client_state->cl_confirm.data)); WRITE32(OP_SETCLIENTID_CONFIRM); WRITE64(client_state->cl_clientid); WRITEMEM(client_state->cl_confirm.data, sizeof(client_state->cl_confirm.data)); return 0;}static int encode_write(struct xdr_stream *xdr, const struct nfs_writeargs *args){ uint32_t *p; RESERVE_SPACE(4); WRITE32(OP_WRITE); encode_stateid(xdr, args->context); RESERVE_SPACE(16); WRITE64(args->offset); WRITE32(args->stable); WRITE32(args->count); xdr_write_pages(xdr, args->pages, args->pgbase, args->count); return 0;}static int encode_delegreturn(struct xdr_stream *xdr, const nfs4_stateid *stateid){ uint32_t *p; RESERVE_SPACE(20); WRITE32(OP_DELEGRETURN); WRITEMEM(stateid->data, sizeof(stateid->data)); return 0;}/* * END OF "GENERIC" ENCODE ROUTINES. *//* * Encode an ACCESS request */static int nfs4_xdr_enc_access(struct rpc_rqst *req, uint32_t *p, const struct nfs4_accessargs *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 2, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); if ((status = encode_putfh(&xdr, args->fh)) == 0) status = encode_access(&xdr, args->access); return status;}/* * Encode LOOKUP request */static int nfs4_xdr_enc_lookup(struct rpc_rqst *req, uint32_t *p, const struct nfs4_lookup_arg *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 4, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); if ((status = encode_putfh(&xdr, args->dir_fh)) != 0) goto out; if ((status = encode_lookup(&xdr, args->name)) != 0) goto out; if ((status = encode_getfh(&xdr)) != 0) goto out; status = encode_getfattr(&xdr, args->bitmask);out: return status;}/* * Encode LOOKUP_ROOT request */static int nfs4_xdr_enc_lookup_root(struct rpc_rqst *req, uint32_t *p, const struct nfs4_lookup_root_arg *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 3, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); if ((status = encode_putrootfh(&xdr)) != 0) goto out; if ((status = encode_getfh(&xdr)) == 0) status = encode_getfattr(&xdr, args->bitmask);out: return status;}/* * Encode REMOVE request */static int nfs4_xdr_enc_remove(struct rpc_rqst *req, uint32_t *p, const struct nfs4_remove_arg *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 2, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); if ((status = encode_putfh(&xdr, args->fh)) == 0) status = encode_remove(&xdr, args->name); return status;}/* * Encode RENAME request */static int nfs4_xdr_enc_rename(struct rpc_rqst *req, uint32_t *p, const struct nfs4_rename_arg *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 4, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); if ((status = encode_putfh(&xdr, args->old_dir)) != 0) goto out; if ((status = encode_savefh(&xdr)) != 0) goto out; if ((status = encode_putfh(&xdr, args->new_dir)) != 0) goto out; status = encode_rename(&xdr, args->old_name, args->new_name);out: return status;}/* * Encode LINK request */static int nfs4_xdr_enc_link(struct rpc_rqst *req, uint32_t *p, const struct nfs4_link_arg *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 4, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); if ((status = encode_putfh(&xdr, args->fh)) != 0) goto out; if ((status = encode_savefh(&xdr)) != 0) goto out; if ((status = encode_putfh(&xdr, args->dir_fh)) != 0) goto out; status = encode_link(&xdr, args->name);out: return status;}/* * Encode CREATE request */static int nfs4_xdr_enc_create(struct rpc_rqst *req, uint32_t *p, const struct nfs4_create_arg *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 4, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); if ((status = encode_putfh(&xdr, args->dir_fh)) != 0) goto out; if ((status = encode_create(&xdr, args)) != 0) goto out; if ((status = encode_getfh(&xdr)) != 0) goto out; status = encode_getfattr(&xdr, args->bitmask);out: return status;}/* * Encode SYMLINK request */static int nfs4_xdr_enc_symlink(struct rpc_rqst *req, uint32_t *p, const struct nfs4_create_arg *args){ return nfs4_xdr_enc_create(req, p, args);}/* * Encode GETATTR request */static int nfs4_xdr_enc_getattr(struct rpc_rqst *req, uint32_t *p, const struct nfs4_getattr_arg *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 2, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); if ((status = encode_putfh(&xdr, args->fh)) == 0) status = encode_getfattr(&xdr, args->bitmask); return status;}/* * Encode a CLOSE request */static int nfs4_xdr_enc_close(struct rpc_rqst *req, uint32_t *p, struct nfs_closeargs *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 2, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); status = encode_putfh(&xdr, args->fh); if(status) goto out; status = encode_close(&xdr, args);out: return status;}/* * Encode an OPEN request */static int nfs4_xdr_enc_open(struct rpc_rqst *req, uint32_t *p, struct nfs_openargs *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 4, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); status = encode_putfh(&xdr, args->fh); if (status) goto out; status = encode_open(&xdr, args); if (status) goto out; status = encode_getfh(&xdr); if (status) goto out; status = encode_getfattr(&xdr, args->bitmask);out: return status;}/* * Encode an OPEN_CONFIRM request */static int nfs4_xdr_enc_open_confirm(struct rpc_rqst *req, uint32_t *p, struct nfs_open_confirmargs *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 2, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); status = encode_putfh(&xdr, args->fh); if(status) goto out; status = encode_open_confirm(&xdr, args);out: return status;}/* * Encode an OPEN request with no attributes. */static int nfs4_xdr_enc_open_noattr(struct rpc_rqst *req, uint32_t *p, struct nfs_openargs *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 2, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); status = encode_putfh(&xdr, args->fh); if (status) goto out; status = encode_open(&xdr, args);out: return status;}/* * Encode an OPEN_DOWNGRADE request */static int nfs4_xdr_enc_open_downgrade(struct rpc_rqst *req, uint32_t *p, struct nfs_closeargs *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 2, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); status = encode_putfh(&xdr, args->fh); if (status) goto out; status = encode_open_downgrade(&xdr, args);out: return status;}/* * Encode a LOCK request */static int nfs4_xdr_enc_lock(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 2, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); status = encode_putfh(&xdr, args->fh); if(status) goto out; status = encode_lock(&xdr, args);out: return status;}/* * Encode a LOCKT request */static int nfs4_xdr_enc_lockt(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 2, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); status = encode_putfh(&xdr, args->fh); if(status) goto out; status = encode_lockt(&xdr, args);out: return status;}/* * Encode a LOCKU request */static int nfs4_xdr_enc_locku(struct rpc_rqst *req, uint32_t *p, struct nfs_lockargs *args){ struct xdr_stream xdr; struct compound_hdr hdr = { .nops = 2, }; int status; xdr_init_encode(&xdr, &req->rq_snd_buf, p); encode_compound_hdr(&xdr, &hdr); status = encode_putfh(&xdr, args->fh); if(status) goto out; status = encode_locku(&xdr, args);out: return status;}/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -