⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nfs4xdr.c

📁 Linux Kernel 2.6.9 for OMAP1710
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -