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

📄 nfs3proc.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
}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	};	struct rpc_message msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_LINK],		.rpc_argp	= &arg,		.rpc_resp	= &res,	};	int			status;	dprintk("NFS call  link %s\n", name->name);	nfs_fattr_init(&dir_attr);	nfs_fattr_init(&fattr);	status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);	nfs_post_op_update_inode(dir, &dir_attr);	nfs_post_op_update_inode(inode, &fattr);	dprintk("NFS reply link: %d\n", status);	return status;}static intnfs3_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, dir_attr;	struct nfs3_symlinkargs	arg = {		.fromfh		= NFS_FH(dir),		.fromname	= dentry->d_name.name,		.fromlen	= dentry->d_name.len,		.pages		= &page,		.pathlen	= len,		.sattr		= sattr	};	struct nfs3_diropres	res = {		.dir_attr	= &dir_attr,		.fh		= &fhandle,		.fattr		= &fattr	};	struct rpc_message msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_SYMLINK],		.rpc_argp	= &arg,		.rpc_resp	= &res,	};	int			status;	if (len > NFS3_MAXPATHLEN)		return -ENAMETOOLONG;	dprintk("NFS call  symlink %s\n", dentry->d_name.name);	nfs_fattr_init(&dir_attr);	nfs_fattr_init(&fattr);	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);	nfs_post_op_update_inode(dir, &dir_attr);	if (status != 0)		goto out;	status = nfs_instantiate(dentry, &fhandle, &fattr);out:	dprintk("NFS reply symlink: %d\n", status);	return status;}static intnfs3_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr){	struct nfs_fh fhandle;	struct nfs_fattr fattr, dir_attr;	struct nfs3_mkdirargs	arg = {		.fh		= NFS_FH(dir),		.name		= dentry->d_name.name,		.len		= dentry->d_name.len,		.sattr		= sattr	};	struct nfs3_diropres	res = {		.dir_attr	= &dir_attr,		.fh		= &fhandle,		.fattr		= &fattr	};	struct rpc_message msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_MKDIR],		.rpc_argp	= &arg,		.rpc_resp	= &res,	};	int mode = sattr->ia_mode;	int status;	dprintk("NFS call  mkdir %s\n", dentry->d_name.name);	sattr->ia_mode &= ~current->fs->umask;	nfs_fattr_init(&dir_attr);	nfs_fattr_init(&fattr);	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);	nfs_post_op_update_inode(dir, &dir_attr);	if (status != 0)		goto out;	status = nfs_instantiate(dentry, &fhandle, &fattr);	if (status != 0)		goto out;	status = nfs3_proc_set_default_acl(dir, dentry->d_inode, mode);out:	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	};	struct rpc_message msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_RMDIR],		.rpc_argp	= &arg,		.rpc_resp	= &dir_attr,	};	int			status;	dprintk("NFS call  rmdir %s\n", name->name);	nfs_fattr_init(&dir_attr);	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);	nfs_post_op_update_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;	__be32			*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;	if (plus)		msg.rpc_proc = &nfs3_procedures[NFS3PROC_READDIRPLUS];	dprintk("NFS call  readdir%s %d\n",			plus? "plus" : "", (unsigned int) cookie);	nfs_fattr_init(&dir_attr);	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);	nfs_invalidate_atime(dir);	nfs_refresh_inode(dir, &dir_attr);	dprintk("NFS reply readdir: %d\n", status);	return status;}static intnfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,		dev_t rdev){	struct nfs_fh fh;	struct nfs_fattr fattr, dir_attr;	struct nfs3_mknodargs	arg = {		.fh		= NFS_FH(dir),		.name		= dentry->d_name.name,		.len		= dentry->d_name.len,		.sattr		= sattr,		.rdev		= rdev	};	struct nfs3_diropres	res = {		.dir_attr	= &dir_attr,		.fh		= &fh,		.fattr		= &fattr	};	struct rpc_message msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_MKNOD],		.rpc_argp	= &arg,		.rpc_resp	= &res,	};	mode_t mode = sattr->ia_mode;	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", dentry->d_name.name,			MAJOR(rdev), MINOR(rdev));	sattr->ia_mode &= ~current->fs->umask;	nfs_fattr_init(&dir_attr);	nfs_fattr_init(&fattr);	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);	nfs_post_op_update_inode(dir, &dir_attr);	if (status != 0)		goto out;	status = nfs_instantiate(dentry, &fh, &fattr);	if (status != 0)		goto out;	status = nfs3_proc_set_default_acl(dir, dentry->d_inode, mode);out:	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){	struct rpc_message msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_FSSTAT],		.rpc_argp	= fhandle,		.rpc_resp	= stat,	};	int	status;	dprintk("NFS call  fsstat\n");	nfs_fattr_init(stat->fattr);	status = rpc_call_sync(server->client, &msg, 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){	struct rpc_message msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_FSINFO],		.rpc_argp	= fhandle,		.rpc_resp	= info,	};	int	status;	dprintk("NFS call  fsinfo\n");	nfs_fattr_init(info->fattr);	status = rpc_call_sync(server->nfs_client->cl_rpcclient, &msg, 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){	struct rpc_message msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_PATHCONF],		.rpc_argp	= fhandle,		.rpc_resp	= info,	};	int	status;	dprintk("NFS call  pathconf\n");	nfs_fattr_init(info->fattr);	status = rpc_call_sync(server->client, &msg, 0);	dprintk("NFS reply pathconf: %d\n", status);	return status;}static int nfs3_read_done(struct rpc_task *task, struct nfs_read_data *data){	if (nfs3_async_handle_jukebox(task, data->inode))		return -EAGAIN;	nfs_invalidate_atime(data->inode);	nfs_refresh_inode(data->inode, &data->fattr);	return 0;}static void nfs3_proc_read_setup(struct nfs_read_data *data){	struct rpc_message	msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_READ],		.rpc_argp	= &data->args,		.rpc_resp	= &data->res,		.rpc_cred	= data->cred,	};	rpc_call_setup(&data->task, &msg, 0);}static int nfs3_write_done(struct rpc_task *task, struct nfs_write_data *data){	if (nfs3_async_handle_jukebox(task, data->inode))		return -EAGAIN;	if (task->tk_status >= 0)		nfs_post_op_update_inode_force_wcc(data->inode, data->res.fattr);	return 0;}static void nfs3_proc_write_setup(struct nfs_write_data *data, int how){	struct rpc_message	msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_WRITE],		.rpc_argp	= &data->args,		.rpc_resp	= &data->res,		.rpc_cred	= data->cred,	};	data->args.stable = NFS_UNSTABLE;	if (how & FLUSH_STABLE) {		data->args.stable = NFS_FILE_SYNC;		if (NFS_I(data->inode)->ncommit)			data->args.stable = NFS_DATA_SYNC;	}	/* Finalize the task. */	rpc_call_setup(&data->task, &msg, 0);}static int nfs3_commit_done(struct rpc_task *task, struct nfs_write_data *data){	if (nfs3_async_handle_jukebox(task, data->inode))		return -EAGAIN;	nfs_refresh_inode(data->inode, data->res.fattr);	return 0;}static void nfs3_proc_commit_setup(struct nfs_write_data *data, int how){	struct rpc_message	msg = {		.rpc_proc	= &nfs3_procedures[NFS3PROC_COMMIT],		.rpc_argp	= &data->args,		.rpc_resp	= &data->res,		.rpc_cred	= data->cred,	};	rpc_call_setup(&data->task, &msg, 0);}static intnfs3_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_v3_clientops = {	.version	= 3,			/* protocol version */	.dentry_ops	= &nfs_dentry_operations,	.dir_inode_ops	= &nfs3_dir_inode_operations,	.file_inode_ops	= &nfs3_file_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,	.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,	.read_done	= nfs3_read_done,	.write_setup	= nfs3_proc_write_setup,	.write_done	= nfs3_write_done,	.commit_setup	= nfs3_proc_commit_setup,	.commit_done	= nfs3_commit_done,	.file_open	= nfs_open,	.file_release	= nfs_release,	.lock		= nfs3_proc_lock,	.clear_acl_cache = nfs3_forget_cached_acls,};

⌨️ 快捷键说明

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