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

📄 proc.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	nfs_mark_for_revalidate(old_dir);	nfs_mark_for_revalidate(new_dir);	dprintk("NFS reply rename: %d\n", status);	return status;}static intnfs_proc_link(struct inode *inode, struct inode *dir, struct qstr *name){	struct nfs_linkargs	arg = {		.fromfh		= NFS_FH(inode),		.tofh		= NFS_FH(dir),		.toname		= name->name,		.tolen		= name->len	};	struct rpc_message msg = {		.rpc_proc	= &nfs_procedures[NFSPROC_LINK],		.rpc_argp	= &arg,	};	int			status;	dprintk("NFS call  link %s\n", name->name);	status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);	nfs_mark_for_revalidate(inode);	nfs_mark_for_revalidate(dir);	dprintk("NFS reply link: %d\n", status);	return status;}static intnfs_proc_symlink(struct inode *dir, struct dentry *dentry, struct page *page,		 unsigned int len, struct iattr *sattr){	struct nfs_fh fhandle;	struct nfs_fattr fattr;	struct nfs_symlinkargs	arg = {		.fromfh		= NFS_FH(dir),		.fromname	= dentry->d_name.name,		.fromlen	= dentry->d_name.len,		.pages		= &page,		.pathlen	= len,		.sattr		= sattr	};	struct rpc_message msg = {		.rpc_proc	= &nfs_procedures[NFSPROC_SYMLINK],		.rpc_argp	= &arg,	};	int			status;	if (len > NFS2_MAXPATHLEN)		return -ENAMETOOLONG;	dprintk("NFS call  symlink %s\n", dentry->d_name.name);	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);	nfs_mark_for_revalidate(dir);	/*	 * V2 SYMLINK requests don't return any attributes.  Setting the	 * filehandle size to zero indicates to nfs_instantiate that it	 * should fill in the data with a LOOKUP call on the wire.	 */	if (status == 0) {		nfs_fattr_init(&fattr);		fhandle.size = 0;		status = nfs_instantiate(dentry, &fhandle, &fattr);	}	dprintk("NFS reply symlink: %d\n", status);	return status;}static intnfs_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr){	struct nfs_fh fhandle;	struct nfs_fattr fattr;	struct nfs_createargs	arg = {		.fh		= NFS_FH(dir),		.name		= dentry->d_name.name,		.len		= dentry->d_name.len,		.sattr		= sattr	};	struct nfs_diropok	res = {		.fh		= &fhandle,		.fattr		= &fattr	};	struct rpc_message msg = {		.rpc_proc	= &nfs_procedures[NFSPROC_MKDIR],		.rpc_argp	= &arg,		.rpc_resp	= &res,	};	int			status;	dprintk("NFS call  mkdir %s\n", dentry->d_name.name);	nfs_fattr_init(&fattr);	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);	nfs_mark_for_revalidate(dir);	if (status == 0)		status = nfs_instantiate(dentry, &fhandle, &fattr);	dprintk("NFS reply mkdir: %d\n", status);	return status;}static intnfs_proc_rmdir(struct inode *dir, struct qstr *name){	struct nfs_diropargs	arg = {		.fh		= NFS_FH(dir),		.name		= name->name,		.len		= name->len	};	struct rpc_message msg = {		.rpc_proc	= &nfs_procedures[NFSPROC_RMDIR],		.rpc_argp	= &arg,	};	int			status;	dprintk("NFS call  rmdir %s\n", name->name);	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);	nfs_mark_for_revalidate(dir);	dprintk("NFS reply rmdir: %d\n", status);	return status;}/* * The READDIR implementation is somewhat hackish - we pass a temporary * buffer to the encode function, which installs it in the receive * the receive iovec. The decode function just parses the reply to make * sure it is syntactically correct; the entries itself are decoded * from nfs_readdir by calling the decode_entry function directly. */static intnfs_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,		 u64 cookie, struct page *page, unsigned int count, int plus){	struct inode		*dir = dentry->d_inode;	struct nfs_readdirargs	arg = {		.fh		= NFS_FH(dir),		.cookie		= cookie,		.count		= count,		.pages		= &page,	};	struct rpc_message	msg = {		.rpc_proc	= &nfs_procedures[NFSPROC_READDIR],		.rpc_argp	= &arg,		.rpc_cred	= cred,	};	int			status;	dprintk("NFS call  readdir %d\n", (unsigned int)cookie);	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);	nfs_invalidate_atime(dir);	dprintk("NFS reply readdir: %d\n", status);	return status;}static intnfs_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,			struct nfs_fsstat *stat){	struct nfs2_fsstat fsinfo;	struct rpc_message msg = {		.rpc_proc	= &nfs_procedures[NFSPROC_STATFS],		.rpc_argp	= fhandle,		.rpc_resp	= &fsinfo,	};	int	status;	dprintk("NFS call  statfs\n");	nfs_fattr_init(stat->fattr);	status = rpc_call_sync(server->client, &msg, 0);	dprintk("NFS reply statfs: %d\n", status);	if (status)		goto out;	stat->tbytes = (u64)fsinfo.blocks * fsinfo.bsize;	stat->fbytes = (u64)fsinfo.bfree  * fsinfo.bsize;	stat->abytes = (u64)fsinfo.bavail * fsinfo.bsize;	stat->tfiles = 0;	stat->ffiles = 0;	stat->afiles = 0;out:	return status;}static intnfs_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,			struct nfs_fsinfo *info){	struct nfs2_fsstat fsinfo;	struct rpc_message msg = {		.rpc_proc	= &nfs_procedures[NFSPROC_STATFS],		.rpc_argp	= fhandle,		.rpc_resp	= &fsinfo,	};	int	status;	dprintk("NFS call  fsinfo\n");	nfs_fattr_init(info->fattr);	status = rpc_call_sync(server->client, &msg, 0);	dprintk("NFS reply fsinfo: %d\n", status);	if (status)		goto out;	info->rtmax  = NFS_MAXDATA;	info->rtpref = fsinfo.tsize;	info->rtmult = fsinfo.bsize;	info->wtmax  = NFS_MAXDATA;	info->wtpref = fsinfo.tsize;	info->wtmult = fsinfo.bsize;	info->dtpref = fsinfo.tsize;	info->maxfilesize = 0x7FFFFFFF;	info->lease_time = 0;out:	return status;}static intnfs_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,		  struct nfs_pathconf *info){	info->max_link = 0;	info->max_namelen = NFS2_MAXNAMLEN;	return 0;}static int nfs_read_done(struct rpc_task *task, struct nfs_read_data *data){	nfs_invalidate_atime(data->inode);	if (task->tk_status >= 0) {		nfs_refresh_inode(data->inode, data->res.fattr);		/* Emulate the eof flag, which isn't normally needed in NFSv2		 * as it is guaranteed to always return the file attributes		 */		if (data->args.offset + data->args.count >= data->res.fattr->size)			data->res.eof = 1;	}	return 0;}static void nfs_proc_read_setup(struct nfs_read_data *data){	struct rpc_message	msg = {		.rpc_proc	= &nfs_procedures[NFSPROC_READ],		.rpc_argp	= &data->args,		.rpc_resp	= &data->res,		.rpc_cred	= data->cred,	};	rpc_call_setup(&data->task, &msg, 0);}static int nfs_write_done(struct rpc_task *task, struct nfs_write_data *data){	if (task->tk_status >= 0)		nfs_post_op_update_inode_force_wcc(data->inode, data->res.fattr);	return 0;}static void nfs_proc_write_setup(struct nfs_write_data *data, int how){	struct rpc_message	msg = {		.rpc_proc	= &nfs_procedures[NFSPROC_WRITE],		.rpc_argp	= &data->args,		.rpc_resp	= &data->res,		.rpc_cred	= data->cred,	};	/* Note: NFSv2 ignores @stable and always uses NFS_FILE_SYNC */	data->args.stable = NFS_FILE_SYNC;	/* Finalize the task. */	rpc_call_setup(&data->task, &msg, 0);}static voidnfs_proc_commit_setup(struct nfs_write_data *data, int how){	BUG();}static intnfs_proc_lock(struct file *filp, int cmd, struct file_lock *fl){	return nlmclnt_proc(filp->f_path.dentry->d_inode, cmd, fl);}const struct nfs_rpc_ops nfs_v2_clientops = {	.version	= 2,		       /* protocol version */	.dentry_ops	= &nfs_dentry_operations,	.dir_inode_ops	= &nfs_dir_inode_operations,	.file_inode_ops	= &nfs_file_inode_operations,	.getroot	= nfs_proc_get_root,	.getattr	= nfs_proc_getattr,	.setattr	= nfs_proc_setattr,	.lookup		= nfs_proc_lookup,	.access		= NULL,		       /* access */	.readlink	= nfs_proc_readlink,	.create		= nfs_proc_create,	.remove		= nfs_proc_remove,	.unlink_setup	= nfs_proc_unlink_setup,	.unlink_done	= nfs_proc_unlink_done,	.rename		= nfs_proc_rename,	.link		= nfs_proc_link,	.symlink	= nfs_proc_symlink,	.mkdir		= nfs_proc_mkdir,	.rmdir		= nfs_proc_rmdir,	.readdir	= nfs_proc_readdir,	.mknod		= nfs_proc_mknod,	.statfs		= nfs_proc_statfs,	.fsinfo		= nfs_proc_fsinfo,	.pathconf	= nfs_proc_pathconf,	.decode_dirent	= nfs_decode_dirent,	.read_setup	= nfs_proc_read_setup,	.read_done	= nfs_read_done,	.write_setup	= nfs_proc_write_setup,	.write_done	= nfs_write_done,	.commit_setup	= nfs_proc_commit_setup,	.file_open	= nfs_open,	.file_release	= nfs_release,	.lock		= nfs_proc_lock,};

⌨️ 快捷键说明

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