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

📄 nfs3proc.c

📁 《嵌入式系统设计与实例开发实验教材二源码》Linux内核移植与编译实验
💻 C
📖 第 1 页 / 共 2 页
字号:
	} else		if (argp->ftype != NF3SOCK && argp->ftype != NF3FIFO)			RETURN_STATUS(nfserr_inval);	type = nfs3_ftypes[argp->ftype];	nfserr = nfsd_create(rqstp, &resp->dirfh, argp->name, argp->len,				    &argp->attrs, type, rdev, &resp->fh);	RETURN_STATUS(nfserr);}/* * Remove file/fifo/socket etc. */static intnfsd3_proc_remove(struct svc_rqst *rqstp, struct nfsd3_diropargs *argp,					  struct nfsd3_attrstat  *resp){	int	nfserr;	dprintk("nfsd: REMOVE(3)   %s %.*s\n",				SVCFH_fmt(&argp->fh),				argp->len,				argp->name);	/* Unlink. -S_IFDIR means file must not be a directory */	fh_copy(&resp->fh, &argp->fh);	nfserr = nfsd_unlink(rqstp, &resp->fh, -S_IFDIR, argp->name, argp->len);	RETURN_STATUS(nfserr);}/* * Remove a directory */static intnfsd3_proc_rmdir(struct svc_rqst *rqstp, struct nfsd3_diropargs *argp,					 struct nfsd3_attrstat  *resp){	int	nfserr;	dprintk("nfsd: RMDIR(3)    %s %.*s\n",				SVCFH_fmt(&argp->fh),				argp->len,				argp->name);	fh_copy(&resp->fh, &argp->fh);	nfserr = nfsd_unlink(rqstp, &resp->fh, S_IFDIR, argp->name, argp->len);	RETURN_STATUS(nfserr);}static intnfsd3_proc_rename(struct svc_rqst *rqstp, struct nfsd3_renameargs *argp,					  struct nfsd3_renameres  *resp){	int	nfserr;	dprintk("nfsd: RENAME(3)   %s %.*s ->\n",				SVCFH_fmt(&argp->ffh),				argp->flen,				argp->fname);	dprintk("nfsd: -> %s %.*s\n",				SVCFH_fmt(&argp->tfh),				argp->tlen,				argp->tname);	fh_copy(&resp->ffh, &argp->ffh);	fh_copy(&resp->tfh, &argp->tfh);	nfserr = nfsd_rename(rqstp, &resp->ffh, argp->fname, argp->flen,				    &resp->tfh, argp->tname, argp->tlen);	RETURN_STATUS(nfserr);}static intnfsd3_proc_link(struct svc_rqst *rqstp, struct nfsd3_linkargs *argp,					struct nfsd3_linkres  *resp){	int	nfserr;	dprintk("nfsd: LINK(3)     %s ->\n",				SVCFH_fmt(&argp->ffh));	dprintk("nfsd:   -> %s %.*s\n",				SVCFH_fmt(&argp->tfh),				argp->tlen,				argp->tname);	fh_copy(&resp->fh,  &argp->ffh);	fh_copy(&resp->tfh, &argp->tfh);	nfserr = nfsd_link(rqstp, &resp->tfh, argp->tname, argp->tlen,				  &resp->fh);	RETURN_STATUS(nfserr);}/* * Read a portion of a directory. */static intnfsd3_proc_readdir(struct svc_rqst *rqstp, struct nfsd3_readdirargs *argp,					   struct nfsd3_readdirres  *resp){	u32 *		buffer;	int		nfserr, count;	unsigned int	want;	dprintk("nfsd: READDIR(3)  %s %d bytes at %d\n",				SVCFH_fmt(&argp->fh),				argp->count, (u32) argp->cookie);	/* Reserve buffer space for status, attributes and verifier */	svcbuf_reserve(&rqstp->rq_resbuf, &buffer, &count,				1 + NFS3_POST_OP_ATTR_WORDS + 2);	/* Make sure we've room for the NULL ptr & eof flag, and shrink to	 * client read size */	if ((count -= 2) > (want = (argp->count >> 2) - 2))		count = want;	/* Read directory and encode entries on the fly */	fh_copy(&resp->fh, &argp->fh);	nfserr = nfsd_readdir(rqstp, &resp->fh, (loff_t) argp->cookie, 					nfs3svc_encode_entry,					buffer, &count, argp->verf);	memcpy(resp->verf, argp->verf, 8);	resp->count = count;	RETURN_STATUS(nfserr);}/* * Read a portion of a directory, including file handles and attrs. * For now, we choose to ignore the dircount parameter. */static intnfsd3_proc_readdirplus(struct svc_rqst *rqstp, struct nfsd3_readdirargs *argp,					       struct nfsd3_readdirres  *resp){	u32 *	buffer;	int	nfserr, count, want;	dprintk("nfsd: READDIR+(3) %s %d bytes at %d\n",				SVCFH_fmt(&argp->fh),				argp->count, (u32) argp->cookie);	/* Reserve buffer space for status, attributes and verifier */	svcbuf_reserve(&rqstp->rq_resbuf, &buffer, &count,				1 + NFS3_POST_OP_ATTR_WORDS + 2);	/* Make sure we've room for the NULL ptr & eof flag, and shrink to	 * client read size */	if ((count -= 2) > (want = argp->count >> 2))		count = want;	/* Read directory and encode entries on the fly */	fh_copy(&resp->fh, &argp->fh);	nfserr = nfsd_readdir(rqstp, &resp->fh, (loff_t) argp->cookie, 					nfs3svc_encode_entry_plus,					buffer, &count, argp->verf);	memcpy(resp->verf, argp->verf, 8);	resp->count = count;	RETURN_STATUS(nfserr);}/* * Get file system stats */static intnfsd3_proc_fsstat(struct svc_rqst * rqstp, struct nfsd_fhandle    *argp,					   struct nfsd3_fsstatres *resp){	int	nfserr;	dprintk("nfsd: FSSTAT(3)   %s\n",				SVCFH_fmt(&argp->fh));	nfserr = nfsd_statfs(rqstp, &argp->fh, &resp->stats);	fh_put(&argp->fh);	RETURN_STATUS(nfserr);}/* * Get file system info */static intnfsd3_proc_fsinfo(struct svc_rqst * rqstp, struct nfsd_fhandle    *argp,					   struct nfsd3_fsinfores *resp){	int	nfserr;	dprintk("nfsd: FSINFO(3)   %s\n",				SVCFH_fmt(&argp->fh));	resp->f_rtmax  = NFSSVC_MAXBLKSIZE;	resp->f_rtpref = NFSSVC_MAXBLKSIZE;	resp->f_rtmult = PAGE_SIZE;	resp->f_wtmax  = NFSSVC_MAXBLKSIZE;	resp->f_wtpref = NFSSVC_MAXBLKSIZE;	resp->f_wtmult = PAGE_SIZE;	resp->f_dtpref = PAGE_SIZE;	resp->f_maxfilesize = ~(u32) 0;	resp->f_properties = NFS3_FSF_DEFAULT;	nfserr = fh_verify(rqstp, &argp->fh, 0, MAY_NOP);	/* Check special features of the file system. May request	 * different read/write sizes for file systems known to have	 * problems with large blocks */	if (nfserr == 0) {		struct super_block *sb = argp->fh.fh_dentry->d_inode->i_sb;		/* Note that we don't care for remote fs's here */		if (sb->s_magic == 0x4d44 /* MSDOS_SUPER_MAGIC */) {			resp->f_properties = NFS3_FSF_BILLYBOY;		}		resp->f_maxfilesize = sb->s_maxbytes;	}	fh_put(&argp->fh);	RETURN_STATUS(nfserr);}/* * Get pathconf info for the specified file */static intnfsd3_proc_pathconf(struct svc_rqst * rqstp, struct nfsd_fhandle      *argp,					     struct nfsd3_pathconfres *resp){	int	nfserr;	dprintk("nfsd: PATHCONF(3) %s\n",				SVCFH_fmt(&argp->fh));	/* Set default pathconf */	resp->p_link_max = 255;		/* at least */	resp->p_name_max = 255;		/* at least */	resp->p_no_trunc = 0;	resp->p_chown_restricted = 1;	resp->p_case_insensitive = 0;	resp->p_case_preserving = 1;	nfserr = fh_verify(rqstp, &argp->fh, 0, MAY_NOP);	if (nfserr == 0) {		struct super_block *sb = argp->fh.fh_dentry->d_inode->i_sb;		/* Note that we don't care for remote fs's here */		switch (sb->s_magic) {		case EXT2_SUPER_MAGIC:			resp->p_link_max = EXT2_LINK_MAX;			resp->p_name_max = EXT2_NAME_LEN;			break;		case 0x4d44:	/* MSDOS_SUPER_MAGIC */			resp->p_case_insensitive = 1;			resp->p_case_preserving  = 0;			break;		}	}	fh_put(&argp->fh);	RETURN_STATUS(nfserr);}/* * Commit a file (range) to stable storage. */static intnfsd3_proc_commit(struct svc_rqst * rqstp, struct nfsd3_commitargs *argp,					   struct nfsd3_commitres  *resp){	int	nfserr;	dprintk("nfsd: COMMIT(3)   %s %d@%ld\n",				SVCFH_fmt(&argp->fh),				argp->count,				(unsigned long) argp->offset);	if (argp->offset > NFS_OFFSET_MAX)		RETURN_STATUS(nfserr_inval);	fh_copy(&resp->fh, &argp->fh);	nfserr = nfsd_commit(rqstp, &resp->fh, argp->offset, argp->count);	RETURN_STATUS(nfserr);}/* * NFSv3 Server procedures. * Only the results of non-idempotent operations are cached. */#define nfs3svc_decode_voidargs		NULL#define nfs3svc_release_void		NULL#define nfs3svc_decode_fhandleargs	nfs3svc_decode_fhandle#define nfs3svc_encode_attrstatres	nfs3svc_encode_attrstat#define nfs3svc_encode_wccstatres	nfs3svc_encode_wccstat#define nfsd3_mkdirargs			nfsd3_createargs#define nfsd3_readdirplusargs		nfsd3_readdirargs#define nfsd3_fhandleargs		nfsd_fhandle#define nfsd3_fhandleres		nfsd3_attrstat#define nfsd3_attrstatres		nfsd3_attrstat#define nfsd3_wccstatres		nfsd3_attrstat#define nfsd3_createres			nfsd3_diropres#define nfsd3_voidres			nfsd3_voidargsstruct nfsd3_voidargs { int dummy; };#define PROC(name, argt, rest, relt, cache)	\ { (svc_procfunc) nfsd3_proc_##name,		\   (kxdrproc_t) nfs3svc_decode_##argt##args,	\   (kxdrproc_t) nfs3svc_encode_##rest##res,	\   (kxdrproc_t) nfs3svc_release_##relt,		\   sizeof(struct nfsd3_##argt##args),		\   sizeof(struct nfsd3_##rest##res),		\   0,						\   cache					\ }struct svc_procedure		nfsd_procedures3[22] = {  PROC(null,	 void,		void,		void,	 RC_NOCACHE),  PROC(getattr,	 fhandle,	attrstat,	fhandle, RC_NOCACHE),  PROC(setattr,  sattr,		wccstat,	fhandle,  RC_REPLBUFF),  PROC(lookup,	 dirop,		dirop,		fhandle2, RC_NOCACHE),  PROC(access,	 access,	access,		fhandle,  RC_NOCACHE),  PROC(readlink, fhandle,	readlink,	fhandle,  RC_NOCACHE),  PROC(read,	 read,		read,		fhandle, RC_NOCACHE),  PROC(write,	 write,		write,		fhandle,  RC_REPLBUFF),  PROC(create,	 create,	create,		fhandle2, RC_REPLBUFF),  PROC(mkdir,	 mkdir,		create,		fhandle2, RC_REPLBUFF),  PROC(symlink,	 symlink,	create,		fhandle2, RC_REPLBUFF),  PROC(mknod,	 mknod,		create,		fhandle2, RC_REPLBUFF),  PROC(remove,	 dirop,		wccstat,	fhandle,  RC_REPLBUFF),  PROC(rmdir,	 dirop,		wccstat,	fhandle,  RC_REPLBUFF),  PROC(rename,	 rename,	rename,		fhandle2, RC_REPLBUFF),  PROC(link,	 link,		link,		fhandle2, RC_REPLBUFF),  PROC(readdir,	 readdir,	readdir,	fhandle,  RC_NOCACHE),  PROC(readdirplus,readdirplus,	readdir,	fhandle,  RC_NOCACHE),  PROC(fsstat,	 fhandle,	fsstat,		void,     RC_NOCACHE),  PROC(fsinfo,   fhandle,	fsinfo,		void,     RC_NOCACHE),  PROC(pathconf, fhandle,	pathconf,	void,     RC_NOCACHE),  PROC(commit,	 commit,	commit,		fhandle,  RC_NOCACHE)};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -