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

📄 nfs3proc.c

📁 Linux Kernel 2.6.9 for OMAP1710
💻 C
📖 第 1 页 / 共 2 页
字号:
}static intnfs3_proc_unlink_done(struct dentry *dir, struct rpc_task *task){	struct rpc_message *msg = &task->tk_msg;	struct nfs_fattr	*dir_attr;	if (nfs3_async_handle_jukebox(task))		return 1;	if (msg->rpc_argp) {		dir_attr = (struct nfs_fattr*)msg->rpc_resp;		nfs_refresh_inode(dir->d_inode, dir_attr);		kfree(msg->rpc_argp);	}	return 0;}static intnfs3_proc_rename(struct inode *old_dir, struct qstr *old_name,		 struct inode *new_dir, struct qstr *new_name){	struct nfs_fattr	old_dir_attr, new_dir_attr;	struct nfs3_renameargs	arg = {		.fromfh		= NFS_FH(old_dir),		.fromname	= old_name->name,		.fromlen	= old_name->len,		.tofh		= NFS_FH(new_dir),		.toname		= new_name->name,		.tolen		= new_name->len	};	struct nfs3_renameres	res = {		.fromattr	= &old_dir_attr,		.toattr		= &new_dir_attr	};	int			status;	dprintk("NFS call  rename %s -> %s\n", old_name->name, new_name->name);	old_dir_attr.valid = 0;	new_dir_attr.valid = 0;	status = rpc_call(NFS_CLIENT(old_dir), NFS3PROC_RENAME, &arg, &res, 0);	nfs_refresh_inode(old_dir, &old_dir_attr);	nfs_refresh_inode(new_dir, &new_dir_attr);	dprintk("NFS reply rename: %d\n", status);	return status;}static intnfs3_proc_link(struct inode *inode, struct inode *dir, struct qstr *name){	struct nfs_fattr	dir_attr, fattr;	struct nfs3_linkargs	arg = {		.fromfh		= NFS_FH(inode),		.tofh		= NFS_FH(dir),		.toname		= name->name,		.tolen		= name->len	};	struct nfs3_linkres	res = {		.dir_attr	= &dir_attr,		.fattr		= &fattr	};	int			status;	dprintk("NFS call  link %s\n", name->name);	dir_attr.valid = 0;	fattr.valid = 0;	status = rpc_call(NFS_CLIENT(inode), NFS3PROC_LINK, &arg, &res, 0);	nfs_refresh_inode(dir, &dir_attr);	nfs_refresh_inode(inode, &fattr);	dprintk("NFS reply link: %d\n", status);	return status;}static intnfs3_proc_symlink(struct inode *dir, struct qstr *name, struct qstr *path,		  struct iattr *sattr, struct nfs_fh *fhandle,		  struct nfs_fattr *fattr){	struct nfs_fattr	dir_attr;	struct nfs3_symlinkargs	arg = {		.fromfh		= NFS_FH(dir),		.fromname	= name->name,		.fromlen	= name->len,		.topath		= path->name,		.tolen		= path->len,		.sattr		= sattr	};	struct nfs3_diropres	res = {		.dir_attr	= &dir_attr,		.fh		= fhandle,		.fattr		= fattr	};	int			status;	if (path->len > NFS3_MAXPATHLEN)		return -ENAMETOOLONG;	dprintk("NFS call  symlink %s -> %s\n", name->name, path->name);	dir_attr.valid = 0;	fattr->valid = 0;	status = rpc_call(NFS_CLIENT(dir), NFS3PROC_SYMLINK, &arg, &res, 0);	nfs_refresh_inode(dir, &dir_attr);	dprintk("NFS reply symlink: %d\n", status);	return status;}static intnfs3_proc_mkdir(struct inode *dir, struct qstr *name, struct iattr *sattr,		struct nfs_fh *fhandle, struct nfs_fattr *fattr){	struct nfs_fattr	dir_attr;	struct nfs3_mkdirargs	arg = {		.fh		= NFS_FH(dir),		.name		= name->name,		.len		= name->len,		.sattr		= sattr	};	struct nfs3_diropres	res = {		.dir_attr	= &dir_attr,		.fh		= fhandle,		.fattr		= fattr	};	int			status;	dprintk("NFS call  mkdir %s\n", name->name);	dir_attr.valid = 0;	fattr->valid = 0;	status = rpc_call(NFS_CLIENT(dir), NFS3PROC_MKDIR, &arg, &res, 0);	nfs_refresh_inode(dir, &dir_attr);	dprintk("NFS reply mkdir: %d\n", status);	return status;}static intnfs3_proc_rmdir(struct inode *dir, struct qstr *name){	struct nfs_fattr	dir_attr;	struct nfs3_diropargs	arg = {		.fh		= NFS_FH(dir),		.name		= name->name,		.len		= name->len	};	int			status;	dprintk("NFS call  rmdir %s\n", name->name);	dir_attr.valid = 0;	status = rpc_call(NFS_CLIENT(dir), NFS3PROC_RMDIR, &arg, &dir_attr, 0);	nfs_refresh_inode(dir, &dir_attr);	dprintk("NFS reply rmdir: %d\n", status);	return status;}/* * The READDIR implementation is somewhat hackish - we pass the user buffer * to the encode function, which installs it in the receive iovec. * The decode function itself doesn't perform any decoding, it just makes * sure the reply is syntactically correct. * * Also note that this implementation handles both plain readdir and * readdirplus. */static intnfs3_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_fattr	dir_attr;	u32			*verf = NFS_COOKIEVERF(dir);	struct nfs3_readdirargs	arg = {		.fh		= NFS_FH(dir),		.cookie		= cookie,		.verf		= {verf[0], verf[1]},		.plus		= plus,		.count		= count,		.pages		= &page	};	struct nfs3_readdirres	res = {		.dir_attr	= &dir_attr,		.verf		= verf,		.plus		= plus	};	struct rpc_message	msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_READDIR],		.rpc_argp	= &arg,		.rpc_resp	= &res,		.rpc_cred	= cred	};	int			status;	lock_kernel();	if (plus)		msg.rpc_proc = &nfs3_procedures[NFS3PROC_READDIRPLUS];	dprintk("NFS call  readdir%s %d\n",			plus? "plus" : "", (unsigned int) cookie);	dir_attr.valid = 0;	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);	nfs_refresh_inode(dir, &dir_attr);	dprintk("NFS reply readdir: %d\n", status);	unlock_kernel();	return status;}static intnfs3_proc_mknod(struct inode *dir, struct qstr *name, struct iattr *sattr,		dev_t rdev, struct nfs_fh *fh, struct nfs_fattr *fattr){	struct nfs_fattr	dir_attr;	struct nfs3_mknodargs	arg = {		.fh		= NFS_FH(dir),		.name		= name->name,		.len		= name->len,		.sattr		= sattr,		.rdev		= rdev	};	struct nfs3_diropres	res = {		.dir_attr	= &dir_attr,		.fh		= fh,		.fattr		= fattr	};	int			status;	switch (sattr->ia_mode & S_IFMT) {	case S_IFBLK:	arg.type = NF3BLK;  break;	case S_IFCHR:	arg.type = NF3CHR;  break;	case S_IFIFO:	arg.type = NF3FIFO; break;	case S_IFSOCK:	arg.type = NF3SOCK; break;	default:	return -EINVAL;	}	dprintk("NFS call  mknod %s %u:%u\n", name->name,			MAJOR(rdev), MINOR(rdev));	dir_attr.valid = 0;	fattr->valid = 0;	status = rpc_call(NFS_CLIENT(dir), NFS3PROC_MKNOD, &arg, &res, 0);	nfs_refresh_inode(dir, &dir_attr);	dprintk("NFS reply mknod: %d\n", status);	return status;}static intnfs3_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,		 struct nfs_fsstat *stat){	int	status;	dprintk("NFS call  fsstat\n");	stat->fattr->valid = 0;	status = rpc_call(server->client, NFS3PROC_FSSTAT, fhandle, stat, 0);	dprintk("NFS reply statfs: %d\n", status);	return status;}static intnfs3_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,		 struct nfs_fsinfo *info){	int	status;	dprintk("NFS call  fsinfo\n");	info->fattr->valid = 0;	status = rpc_call(server->client_sys, NFS3PROC_FSINFO, fhandle, info, 0);	dprintk("NFS reply fsinfo: %d\n", status);	return status;}static intnfs3_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,		   struct nfs_pathconf *info){	int	status;	dprintk("NFS call  pathconf\n");	info->fattr->valid = 0;	status = rpc_call(server->client, NFS3PROC_PATHCONF, fhandle, info, 0);	dprintk("NFS reply pathconf: %d\n", status);	return status;}extern u32 *nfs3_decode_dirent(u32 *, struct nfs_entry *, int);static voidnfs3_read_done(struct rpc_task *task){	struct nfs_write_data *data = (struct nfs_write_data *) task->tk_calldata;	if (nfs3_async_handle_jukebox(task))		return;	/* Call back common NFS readpage processing */	if (task->tk_status >= 0)		nfs_refresh_inode(data->inode, &data->fattr);	nfs_readpage_result(task);}static voidnfs3_proc_read_setup(struct nfs_read_data *data){	struct rpc_task		*task = &data->task;	struct inode		*inode = data->inode;	int			flags;	struct rpc_message	msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_READ],		.rpc_argp	= &data->args,		.rpc_resp	= &data->res,		.rpc_cred	= data->cred,	};	/* N.B. Do we need to test? Never called for swapfile inode */	flags = RPC_TASK_ASYNC | (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0);	/* Finalize the task. */	rpc_init_task(task, NFS_CLIENT(inode), nfs3_read_done, flags);	rpc_call_setup(task, &msg, 0);}static voidnfs3_write_done(struct rpc_task *task){	struct nfs_write_data *data;	if (nfs3_async_handle_jukebox(task))		return;	data = (struct nfs_write_data *)task->tk_calldata;	if (task->tk_status >= 0)		nfs_refresh_inode(data->inode, data->res.fattr);	nfs_writeback_done(task);}static voidnfs3_proc_write_setup(struct nfs_write_data *data, int how){	struct rpc_task		*task = &data->task;	struct inode		*inode = data->inode;	int			stable;	int			flags;	struct rpc_message	msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_WRITE],		.rpc_argp	= &data->args,		.rpc_resp	= &data->res,		.rpc_cred	= data->cred,	};	if (how & FLUSH_STABLE) {		if (!NFS_I(inode)->ncommit)			stable = NFS_FILE_SYNC;		else			stable = NFS_DATA_SYNC;	} else		stable = NFS_UNSTABLE;	data->args.stable = stable;	/* Set the initial flags for the task.  */	flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;	/* Finalize the task. */	rpc_init_task(task, NFS_CLIENT(inode), nfs3_write_done, flags);	rpc_call_setup(task, &msg, 0);}static voidnfs3_commit_done(struct rpc_task *task){	struct nfs_write_data *data;	if (nfs3_async_handle_jukebox(task))		return;	data = (struct nfs_write_data *)task->tk_calldata;	if (task->tk_status >= 0)		nfs_refresh_inode(data->inode, data->res.fattr);	nfs_commit_done(task);}static voidnfs3_proc_commit_setup(struct nfs_write_data *data, int how){	struct rpc_task		*task = &data->task;	struct inode		*inode = data->inode;	int			flags;	struct rpc_message	msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_COMMIT],		.rpc_argp	= &data->args,		.rpc_resp	= &data->res,		.rpc_cred	= data->cred,	};	/* Set the initial flags for the task.  */	flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;	/* Finalize the task. */	rpc_init_task(task, NFS_CLIENT(inode), nfs3_commit_done, flags);	rpc_call_setup(task, &msg, 0);}static intnfs3_proc_lock(struct file *filp, int cmd, struct file_lock *fl){	return nlmclnt_proc(filp->f_dentry->d_inode, cmd, fl);}struct nfs_rpc_ops	nfs_v3_clientops = {	.version	= 3,			/* protocol version */	.dentry_ops	= &nfs_dentry_operations,	.dir_inode_ops	= &nfs_dir_inode_operations,	.getroot	= nfs3_proc_get_root,	.getattr	= nfs3_proc_getattr,	.setattr	= nfs3_proc_setattr,	.lookup		= nfs3_proc_lookup,	.access		= nfs3_proc_access,	.readlink	= nfs3_proc_readlink,	.read		= nfs3_proc_read,	.write		= nfs3_proc_write,	.commit		= nfs3_proc_commit,	.create		= nfs3_proc_create,	.remove		= nfs3_proc_remove,	.unlink_setup	= nfs3_proc_unlink_setup,	.unlink_done	= nfs3_proc_unlink_done,	.rename		= nfs3_proc_rename,	.link		= nfs3_proc_link,	.symlink	= nfs3_proc_symlink,	.mkdir		= nfs3_proc_mkdir,	.rmdir		= nfs3_proc_rmdir,	.readdir	= nfs3_proc_readdir,	.mknod		= nfs3_proc_mknod,	.statfs		= nfs3_proc_statfs,	.fsinfo		= nfs3_proc_fsinfo,	.pathconf	= nfs3_proc_pathconf,	.decode_dirent	= nfs3_decode_dirent,	.read_setup	= nfs3_proc_read_setup,	.write_setup	= nfs3_proc_write_setup,	.commit_setup	= nfs3_proc_commit_setup,	.file_open	= nfs_open,	.file_release	= nfs_release,	.lock		= nfs3_proc_lock,};

⌨️ 快捷键说明

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