📄 nfs4xdr.c
字号:
if (iap->ia_valid & ATTR_SIZE) { bmval0 |= FATTR4_WORD0_SIZE; WRITE64(iap->ia_size); } if (iap->ia_valid & ATTR_MODE) { bmval1 |= FATTR4_WORD1_MODE; WRITE32(iap->ia_mode); } if (iap->ia_valid & ATTR_UID) { bmval1 |= FATTR4_WORD1_OWNER; WRITE32(owner_namelen); WRITEMEM(owner_name, owner_namelen); } if (iap->ia_valid & ATTR_GID) { bmval1 |= FATTR4_WORD1_OWNER_GROUP; WRITE32(owner_grouplen); WRITEMEM(owner_group, owner_grouplen); } if (iap->ia_valid & ATTR_ATIME_SET) { bmval1 |= FATTR4_WORD1_TIME_ACCESS_SET; WRITE32(NFS4_SET_TO_CLIENT_TIME); WRITE32(0); WRITE32(iap->ia_mtime.tv_sec); WRITE32(iap->ia_mtime.tv_nsec); } else if (iap->ia_valid & ATTR_ATIME) { bmval1 |= FATTR4_WORD1_TIME_ACCESS_SET; WRITE32(NFS4_SET_TO_SERVER_TIME); } if (iap->ia_valid & ATTR_MTIME_SET) { bmval1 |= FATTR4_WORD1_TIME_MODIFY_SET; WRITE32(NFS4_SET_TO_CLIENT_TIME); WRITE32(0); WRITE32(iap->ia_mtime.tv_sec); WRITE32(iap->ia_mtime.tv_nsec); } else if (iap->ia_valid & ATTR_MTIME) { bmval1 |= FATTR4_WORD1_TIME_MODIFY_SET; WRITE32(NFS4_SET_TO_SERVER_TIME); } /* * Now we backfill the bitmap and the attribute buffer length. */ if (len != ((char *)p - (char *)q) + 4) { printk ("encode_attr: Attr length calculation error! %u != %Zu\n", len, ((char *)p - (char *)q) + 4); BUG(); } len = (char *)p - (char *)q - 12; *q++ = htonl(bmval0); *q++ = htonl(bmval1); *q++ = htonl(len); status = 0;/* out: */ return status;}static int encode_access(struct xdr_stream *xdr, u32 access){ uint32_t *p; RESERVE_SPACE(8); WRITE32(OP_ACCESS); WRITE32(access); return 0;}static int encode_close(struct xdr_stream *xdr, const struct nfs_closeargs *arg){ uint32_t *p; RESERVE_SPACE(8+sizeof(arg->stateid.data)); WRITE32(OP_CLOSE); WRITE32(arg->seqid); WRITEMEM(arg->stateid.data, sizeof(arg->stateid.data)); return 0;}static int encode_commit(struct xdr_stream *xdr, const struct nfs_writeargs *args){ uint32_t *p; RESERVE_SPACE(16); WRITE32(OP_COMMIT); WRITE64(args->offset); WRITE32(args->count); return 0;}static int encode_create(struct xdr_stream *xdr, const struct nfs4_create_arg *create){ uint32_t *p; RESERVE_SPACE(8); WRITE32(OP_CREATE); WRITE32(create->ftype); switch (create->ftype) { case NF4LNK: RESERVE_SPACE(4 + create->u.symlink->len); WRITE32(create->u.symlink->len); WRITEMEM(create->u.symlink->name, create->u.symlink->len); break; case NF4BLK: case NF4CHR: RESERVE_SPACE(8); WRITE32(create->u.device.specdata1); WRITE32(create->u.device.specdata2); break; default: break; } RESERVE_SPACE(4 + create->name->len); WRITE32(create->name->len); WRITEMEM(create->name->name, create->name->len); return encode_attrs(xdr, create->attrs, create->server);}static int encode_getattr_one(struct xdr_stream *xdr, uint32_t bitmap){ uint32_t *p; RESERVE_SPACE(12); WRITE32(OP_GETATTR); WRITE32(1); WRITE32(bitmap); return 0;}static int encode_getattr_two(struct xdr_stream *xdr, uint32_t bm0, uint32_t bm1){ uint32_t *p; RESERVE_SPACE(16); WRITE32(OP_GETATTR); WRITE32(2); WRITE32(bm0); WRITE32(bm1); return 0;}static int encode_getfattr(struct xdr_stream *xdr, const u32* bitmask){ extern u32 nfs4_fattr_bitmap[]; return encode_getattr_two(xdr, bitmask[0] & nfs4_fattr_bitmap[0], bitmask[1] & nfs4_fattr_bitmap[1]);}static int encode_fsinfo(struct xdr_stream *xdr, const u32* bitmask){ extern u32 nfs4_fsinfo_bitmap[]; return encode_getattr_two(xdr, bitmask[0] & nfs4_fsinfo_bitmap[0], bitmask[1] & nfs4_fsinfo_bitmap[1]);}static int encode_getfh(struct xdr_stream *xdr){ uint32_t *p; RESERVE_SPACE(4); WRITE32(OP_GETFH); return 0;}static int encode_link(struct xdr_stream *xdr, const struct qstr *name){ uint32_t *p; RESERVE_SPACE(8 + name->len); WRITE32(OP_LINK); WRITE32(name->len); WRITEMEM(name->name, name->len); return 0;}/* * opcode,type,reclaim,offset,length,new_lock_owner = 32 * open_seqid,open_stateid,lock_seqid,lock_owner.clientid, lock_owner.id = 40 */static int encode_lock(struct xdr_stream *xdr, const struct nfs_lockargs *arg){ uint32_t *p; struct nfs_lock_opargs *opargs = arg->u.lock; RESERVE_SPACE(32); WRITE32(OP_LOCK); WRITE32(arg->type); WRITE32(opargs->reclaim); WRITE64(arg->offset); WRITE64(arg->length); WRITE32(opargs->new_lock_owner); if (opargs->new_lock_owner){ struct nfs_open_to_lock *ol = opargs->u.open_lock; RESERVE_SPACE(40); WRITE32(ol->open_seqid); WRITEMEM(&ol->open_stateid, sizeof(ol->open_stateid)); WRITE32(ol->lock_seqid); WRITE64(ol->lock_owner.clientid); WRITE32(4); WRITE32(ol->lock_owner.id); } else { struct nfs_exist_lock *el = opargs->u.exist_lock; RESERVE_SPACE(20); WRITEMEM(&el->stateid, sizeof(el->stateid)); WRITE32(el->seqid); } return 0;}static int encode_lockt(struct xdr_stream *xdr, const struct nfs_lockargs *arg){ uint32_t *p; struct nfs_lowner *opargs = arg->u.lockt; RESERVE_SPACE(40); WRITE32(OP_LOCKT); WRITE32(arg->type); WRITE64(arg->offset); WRITE64(arg->length); WRITE64(opargs->clientid); WRITE32(4); WRITE32(opargs->id); return 0;}static int encode_locku(struct xdr_stream *xdr, const struct nfs_lockargs *arg){ uint32_t *p; struct nfs_locku_opargs *opargs = arg->u.locku; RESERVE_SPACE(44); WRITE32(OP_LOCKU); WRITE32(arg->type); WRITE32(opargs->seqid); WRITEMEM(&opargs->stateid, sizeof(opargs->stateid)); WRITE64(arg->offset); WRITE64(arg->length); return 0;}static int encode_lookup(struct xdr_stream *xdr, const struct qstr *name){ int len = name->len; uint32_t *p; RESERVE_SPACE(8 + len); WRITE32(OP_LOOKUP); WRITE32(len); WRITEMEM(name->name, len); return 0;}static void encode_share_access(struct xdr_stream *xdr, int open_flags){ uint32_t *p; RESERVE_SPACE(8); switch (open_flags & (FMODE_READ|FMODE_WRITE)) { case FMODE_READ: WRITE32(NFS4_SHARE_ACCESS_READ); break; case FMODE_WRITE: WRITE32(NFS4_SHARE_ACCESS_WRITE); break; case FMODE_READ|FMODE_WRITE: WRITE32(NFS4_SHARE_ACCESS_BOTH); break; default: BUG(); } WRITE32(0); /* for linux, share_deny = 0 always */}static inline void encode_openhdr(struct xdr_stream *xdr, const struct nfs_openargs *arg){ uint32_t *p; /* * opcode 4, seqid 4, share_access 4, share_deny 4, clientid 8, ownerlen 4, * owner 4 = 32 */ RESERVE_SPACE(8); WRITE32(OP_OPEN); WRITE32(arg->seqid); encode_share_access(xdr, arg->open_flags); RESERVE_SPACE(16); WRITE64(arg->clientid); WRITE32(4); WRITE32(arg->id);}static inline void encode_createmode(struct xdr_stream *xdr, const struct nfs_openargs *arg){ uint32_t *p; RESERVE_SPACE(4); switch(arg->open_flags & O_EXCL) { case 0: WRITE32(NFS4_CREATE_UNCHECKED); encode_attrs(xdr, arg->u.attrs, arg->server); break; default: WRITE32(NFS4_CREATE_EXCLUSIVE); encode_nfs4_verifier(xdr, &arg->u.verifier); }}static void encode_opentype(struct xdr_stream *xdr, const struct nfs_openargs *arg){ uint32_t *p; RESERVE_SPACE(4); switch (arg->open_flags & O_CREAT) { case 0: WRITE32(NFS4_OPEN_NOCREATE); break; default: BUG_ON(arg->claim != NFS4_OPEN_CLAIM_NULL); WRITE32(NFS4_OPEN_CREATE); encode_createmode(xdr, arg); }}static inline void encode_delegation_type(struct xdr_stream *xdr, int delegation_type){ uint32_t *p; RESERVE_SPACE(4); switch (delegation_type) { case 0: WRITE32(NFS4_OPEN_DELEGATE_NONE); break; case FMODE_READ: WRITE32(NFS4_OPEN_DELEGATE_READ); break; case FMODE_WRITE|FMODE_READ: WRITE32(NFS4_OPEN_DELEGATE_WRITE); break; default: BUG(); }}static inline void encode_claim_null(struct xdr_stream *xdr, const struct qstr *name){ uint32_t *p; RESERVE_SPACE(4); WRITE32(NFS4_OPEN_CLAIM_NULL); encode_string(xdr, name->len, name->name);}static inline void encode_claim_previous(struct xdr_stream *xdr, int type){ uint32_t *p; RESERVE_SPACE(4); WRITE32(NFS4_OPEN_CLAIM_PREVIOUS); encode_delegation_type(xdr, type);}static inline void encode_claim_delegate_cur(struct xdr_stream *xdr, const struct qstr *name, const nfs4_stateid *stateid){ uint32_t *p; RESERVE_SPACE(4+sizeof(stateid->data)); WRITE32(NFS4_OPEN_CLAIM_DELEGATE_CUR); WRITEMEM(stateid->data, sizeof(stateid->data)); encode_string(xdr, name->len, name->name);}static int encode_open(struct xdr_stream *xdr, const struct nfs_openargs *arg){ encode_openhdr(xdr, arg); encode_opentype(xdr, arg); switch (arg->claim) { case NFS4_OPEN_CLAIM_NULL: encode_claim_null(xdr, arg->name); break; case NFS4_OPEN_CLAIM_PREVIOUS: encode_claim_previous(xdr, arg->u.delegation_type); break; case NFS4_OPEN_CLAIM_DELEGATE_CUR: encode_claim_delegate_cur(xdr, arg->name, &arg->u.delegation); break; default: BUG(); } return 0;}static int encode_open_confirm(struct xdr_stream *xdr, const struct nfs_open_confirmargs *arg){ uint32_t *p; RESERVE_SPACE(8+sizeof(arg->stateid.data)); WRITE32(OP_OPEN_CONFIRM); WRITEMEM(arg->stateid.data, sizeof(arg->stateid.data)); WRITE32(arg->seqid); return 0;}static int encode_open_downgrade(struct xdr_stream *xdr, const struct nfs_closeargs *arg){ uint32_t *p; RESERVE_SPACE(8+sizeof(arg->stateid.data)); WRITE32(OP_OPEN_DOWNGRADE); WRITEMEM(arg->stateid.data, sizeof(arg->stateid.data)); WRITE32(arg->seqid); encode_share_access(xdr, arg->open_flags); return 0;}static intencode_putfh(struct xdr_stream *xdr, const struct nfs_fh *fh){ int len = fh->size; uint32_t *p; RESERVE_SPACE(8 + len); WRITE32(OP_PUTFH); WRITE32(len); WRITEMEM(fh->data, len); return 0;}static int encode_putrootfh(struct xdr_stream *xdr){ uint32_t *p; RESERVE_SPACE(4); WRITE32(OP_PUTROOTFH); return 0;}static void encode_stateid(struct xdr_stream *xdr, const struct nfs_open_context *ctx){ extern nfs4_stateid zero_stateid; nfs4_stateid stateid; uint32_t *p; RESERVE_SPACE(16); if (ctx->state != NULL) { nfs4_copy_stateid(&stateid, ctx->state, ctx->lockowner); WRITEMEM(stateid.data, sizeof(stateid.data)); } else WRITEMEM(zero_stateid.data, sizeof(zero_stateid.data));}static int encode_read(struct xdr_stream *xdr, const struct nfs_readargs *args){ uint32_t *p; RESERVE_SPACE(4); WRITE32(OP_READ); encode_stateid(xdr, args->context); RESERVE_SPACE(12); WRITE64(args->offset); WRITE32(args->count); return 0;}static int encode_readdir(struct xdr_stream *xdr, const struct nfs4_readdir_arg *readdir, struct rpc_rqst *req){ struct rpc_auth *auth = req->rq_task->tk_auth; int replen; uint32_t *p; RESERVE_SPACE(32+sizeof(nfs4_verifier)); WRITE32(OP_READDIR); WRITE64(readdir->cookie); WRITEMEM(readdir->verifier.data, sizeof(readdir->verifier.data)); WRITE32(readdir->count >> 1); /* We're not doing readdirplus */ WRITE32(readdir->count); WRITE32(2); WRITE32(FATTR4_WORD0_FILEID); WRITE32(0); /* set up reply kvec * toplevel_status + taglen + rescount + OP_PUTFH + status * + OP_READDIR + status + verifer(2) = 9 */ replen = (RPC_REPHDRSIZE + auth->au_rslack + 9) << 2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -