xref: /kernel/linux/linux-5.10/fs/nfs/nfs3proc.c (revision 8c2ecf20)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 *  linux/fs/nfs/nfs3proc.c
4 *
5 *  Client-side NFSv3 procedures stubs.
6 *
7 *  Copyright (C) 1997, Olaf Kirch
8 */
9
10#include <linux/mm.h>
11#include <linux/errno.h>
12#include <linux/string.h>
13#include <linux/sunrpc/clnt.h>
14#include <linux/slab.h>
15#include <linux/nfs.h>
16#include <linux/nfs3.h>
17#include <linux/nfs_fs.h>
18#include <linux/nfs_page.h>
19#include <linux/lockd/bind.h>
20#include <linux/nfs_mount.h>
21#include <linux/freezer.h>
22#include <linux/xattr.h>
23
24#include "iostat.h"
25#include "internal.h"
26#include "nfs3_fs.h"
27
28#define NFSDBG_FACILITY		NFSDBG_PROC
29
30/* A wrapper to handle the EJUKEBOX error messages */
31static int
32nfs3_rpc_wrapper(struct rpc_clnt *clnt, struct rpc_message *msg, int flags)
33{
34	int res;
35	do {
36		res = rpc_call_sync(clnt, msg, flags);
37		if (res != -EJUKEBOX)
38			break;
39		freezable_schedule_timeout_killable_unsafe(NFS_JUKEBOX_RETRY_TIME);
40		res = -ERESTARTSYS;
41	} while (!fatal_signal_pending(current));
42	return res;
43}
44
45#define rpc_call_sync(clnt, msg, flags)	nfs3_rpc_wrapper(clnt, msg, flags)
46
47static int
48nfs3_async_handle_jukebox(struct rpc_task *task, struct inode *inode)
49{
50	if (task->tk_status != -EJUKEBOX)
51		return 0;
52	if (task->tk_status == -EJUKEBOX)
53		nfs_inc_stats(inode, NFSIOS_DELAY);
54	task->tk_status = 0;
55	rpc_restart_call(task);
56	rpc_delay(task, NFS_JUKEBOX_RETRY_TIME);
57	return 1;
58}
59
60static int
61do_proc_get_root(struct rpc_clnt *client, struct nfs_fh *fhandle,
62		 struct nfs_fsinfo *info)
63{
64	struct rpc_message msg = {
65		.rpc_proc	= &nfs3_procedures[NFS3PROC_FSINFO],
66		.rpc_argp	= fhandle,
67		.rpc_resp	= info,
68	};
69	int	status;
70
71	dprintk("%s: call  fsinfo\n", __func__);
72	nfs_fattr_init(info->fattr);
73	status = rpc_call_sync(client, &msg, 0);
74	dprintk("%s: reply fsinfo: %d\n", __func__, status);
75	if (status == 0 && !(info->fattr->valid & NFS_ATTR_FATTR)) {
76		msg.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR];
77		msg.rpc_resp = info->fattr;
78		status = rpc_call_sync(client, &msg, 0);
79		dprintk("%s: reply getattr: %d\n", __func__, status);
80	}
81	return status;
82}
83
84/*
85 * Bare-bones access to getattr: this is for nfs_get_root/nfs_get_sb
86 */
87static int
88nfs3_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
89		   struct nfs_fsinfo *info)
90{
91	int	status;
92
93	status = do_proc_get_root(server->client, fhandle, info);
94	if (status && server->nfs_client->cl_rpcclient != server->client)
95		status = do_proc_get_root(server->nfs_client->cl_rpcclient, fhandle, info);
96	return status;
97}
98
99/*
100 * One function for each procedure in the NFS protocol.
101 */
102static int
103nfs3_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
104		struct nfs_fattr *fattr, struct nfs4_label *label,
105		struct inode *inode)
106{
107	struct rpc_message msg = {
108		.rpc_proc	= &nfs3_procedures[NFS3PROC_GETATTR],
109		.rpc_argp	= fhandle,
110		.rpc_resp	= fattr,
111	};
112	int	status;
113	unsigned short task_flags = 0;
114
115	/* Is this is an attribute revalidation, subject to softreval? */
116	if (inode && (server->flags & NFS_MOUNT_SOFTREVAL))
117		task_flags |= RPC_TASK_TIMEOUT;
118
119	dprintk("NFS call  getattr\n");
120	nfs_fattr_init(fattr);
121	status = rpc_call_sync(server->client, &msg, task_flags);
122	dprintk("NFS reply getattr: %d\n", status);
123	return status;
124}
125
126static int
127nfs3_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
128			struct iattr *sattr)
129{
130	struct inode *inode = d_inode(dentry);
131	struct nfs3_sattrargs	arg = {
132		.fh		= NFS_FH(inode),
133		.sattr		= sattr,
134	};
135	struct rpc_message msg = {
136		.rpc_proc	= &nfs3_procedures[NFS3PROC_SETATTR],
137		.rpc_argp	= &arg,
138		.rpc_resp	= fattr,
139	};
140	int	status;
141
142	dprintk("NFS call  setattr\n");
143	if (sattr->ia_valid & ATTR_FILE)
144		msg.rpc_cred = nfs_file_cred(sattr->ia_file);
145	nfs_fattr_init(fattr);
146	status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
147	if (status == 0) {
148		nfs_setattr_update_inode(inode, sattr, fattr);
149		if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_ACL)
150			nfs_zap_acl_cache(inode);
151	}
152	dprintk("NFS reply setattr: %d\n", status);
153	return status;
154}
155
156static int
157nfs3_proc_lookup(struct inode *dir, struct dentry *dentry,
158		 struct nfs_fh *fhandle, struct nfs_fattr *fattr,
159		 struct nfs4_label *label)
160{
161	struct nfs3_diropargs	arg = {
162		.fh		= NFS_FH(dir),
163		.name		= dentry->d_name.name,
164		.len		= dentry->d_name.len
165	};
166	struct nfs3_diropres	res = {
167		.fh		= fhandle,
168		.fattr		= fattr
169	};
170	struct rpc_message msg = {
171		.rpc_proc	= &nfs3_procedures[NFS3PROC_LOOKUP],
172		.rpc_argp	= &arg,
173		.rpc_resp	= &res,
174	};
175	int			status;
176	unsigned short task_flags = 0;
177
178	/* Is this is an attribute revalidation, subject to softreval? */
179	if (nfs_lookup_is_soft_revalidate(dentry))
180		task_flags |= RPC_TASK_TIMEOUT;
181
182	res.dir_attr = nfs_alloc_fattr();
183	if (res.dir_attr == NULL)
184		return -ENOMEM;
185
186	dprintk("NFS call  lookup %pd2\n", dentry);
187	nfs_fattr_init(fattr);
188	status = rpc_call_sync(NFS_CLIENT(dir), &msg, task_flags);
189	nfs_refresh_inode(dir, res.dir_attr);
190	if (status >= 0 && !(fattr->valid & NFS_ATTR_FATTR)) {
191		msg.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR];
192		msg.rpc_argp = fhandle;
193		msg.rpc_resp = fattr;
194		status = rpc_call_sync(NFS_CLIENT(dir), &msg, task_flags);
195	}
196	nfs_free_fattr(res.dir_attr);
197	dprintk("NFS reply lookup: %d\n", status);
198	return status;
199}
200
201static int nfs3_proc_access(struct inode *inode, struct nfs_access_entry *entry)
202{
203	struct nfs3_accessargs	arg = {
204		.fh		= NFS_FH(inode),
205		.access		= entry->mask,
206	};
207	struct nfs3_accessres	res;
208	struct rpc_message msg = {
209		.rpc_proc	= &nfs3_procedures[NFS3PROC_ACCESS],
210		.rpc_argp	= &arg,
211		.rpc_resp	= &res,
212		.rpc_cred	= entry->cred,
213	};
214	int status = -ENOMEM;
215
216	dprintk("NFS call  access\n");
217	res.fattr = nfs_alloc_fattr();
218	if (res.fattr == NULL)
219		goto out;
220
221	status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
222	nfs_refresh_inode(inode, res.fattr);
223	if (status == 0)
224		nfs_access_set_mask(entry, res.access);
225	nfs_free_fattr(res.fattr);
226out:
227	dprintk("NFS reply access: %d\n", status);
228	return status;
229}
230
231static int nfs3_proc_readlink(struct inode *inode, struct page *page,
232		unsigned int pgbase, unsigned int pglen)
233{
234	struct nfs_fattr	*fattr;
235	struct nfs3_readlinkargs args = {
236		.fh		= NFS_FH(inode),
237		.pgbase		= pgbase,
238		.pglen		= pglen,
239		.pages		= &page
240	};
241	struct rpc_message msg = {
242		.rpc_proc	= &nfs3_procedures[NFS3PROC_READLINK],
243		.rpc_argp	= &args,
244	};
245	int status = -ENOMEM;
246
247	dprintk("NFS call  readlink\n");
248	fattr = nfs_alloc_fattr();
249	if (fattr == NULL)
250		goto out;
251	msg.rpc_resp = fattr;
252
253	status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
254	nfs_refresh_inode(inode, fattr);
255	nfs_free_fattr(fattr);
256out:
257	dprintk("NFS reply readlink: %d\n", status);
258	return status;
259}
260
261struct nfs3_createdata {
262	struct rpc_message msg;
263	union {
264		struct nfs3_createargs create;
265		struct nfs3_mkdirargs mkdir;
266		struct nfs3_symlinkargs symlink;
267		struct nfs3_mknodargs mknod;
268	} arg;
269	struct nfs3_diropres res;
270	struct nfs_fh fh;
271	struct nfs_fattr fattr;
272	struct nfs_fattr dir_attr;
273};
274
275static struct nfs3_createdata *nfs3_alloc_createdata(void)
276{
277	struct nfs3_createdata *data;
278
279	data = kzalloc(sizeof(*data), GFP_KERNEL);
280	if (data != NULL) {
281		data->msg.rpc_argp = &data->arg;
282		data->msg.rpc_resp = &data->res;
283		data->res.fh = &data->fh;
284		data->res.fattr = &data->fattr;
285		data->res.dir_attr = &data->dir_attr;
286		nfs_fattr_init(data->res.fattr);
287		nfs_fattr_init(data->res.dir_attr);
288	}
289	return data;
290}
291
292static struct dentry *
293nfs3_do_create(struct inode *dir, struct dentry *dentry, struct nfs3_createdata *data)
294{
295	int status;
296
297	status = rpc_call_sync(NFS_CLIENT(dir), &data->msg, 0);
298	nfs_post_op_update_inode(dir, data->res.dir_attr);
299	if (status != 0)
300		return ERR_PTR(status);
301
302	return nfs_add_or_obtain(dentry, data->res.fh, data->res.fattr, NULL);
303}
304
305static void nfs3_free_createdata(struct nfs3_createdata *data)
306{
307	kfree(data);
308}
309
310/*
311 * Create a regular file.
312 */
313static int
314nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
315		 int flags)
316{
317	struct posix_acl *default_acl, *acl;
318	struct nfs3_createdata *data;
319	struct dentry *d_alias;
320	int status = -ENOMEM;
321
322	dprintk("NFS call  create %pd\n", dentry);
323
324	data = nfs3_alloc_createdata();
325	if (data == NULL)
326		goto out;
327
328	data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_CREATE];
329	data->arg.create.fh = NFS_FH(dir);
330	data->arg.create.name = dentry->d_name.name;
331	data->arg.create.len = dentry->d_name.len;
332	data->arg.create.sattr = sattr;
333
334	data->arg.create.createmode = NFS3_CREATE_UNCHECKED;
335	if (flags & O_EXCL) {
336		data->arg.create.createmode  = NFS3_CREATE_EXCLUSIVE;
337		data->arg.create.verifier[0] = cpu_to_be32(jiffies);
338		data->arg.create.verifier[1] = cpu_to_be32(current->pid);
339	}
340
341	status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl);
342	if (status)
343		goto out;
344
345	for (;;) {
346		d_alias = nfs3_do_create(dir, dentry, data);
347		status = PTR_ERR_OR_ZERO(d_alias);
348
349		if (status != -ENOTSUPP)
350			break;
351		/* If the server doesn't support the exclusive creation
352		 * semantics, try again with simple 'guarded' mode. */
353		switch (data->arg.create.createmode) {
354			case NFS3_CREATE_EXCLUSIVE:
355				data->arg.create.createmode = NFS3_CREATE_GUARDED;
356				break;
357
358			case NFS3_CREATE_GUARDED:
359				data->arg.create.createmode = NFS3_CREATE_UNCHECKED;
360				break;
361
362			case NFS3_CREATE_UNCHECKED:
363				goto out_release_acls;
364		}
365		nfs_fattr_init(data->res.dir_attr);
366		nfs_fattr_init(data->res.fattr);
367	}
368
369	if (status != 0)
370		goto out_release_acls;
371
372	if (d_alias)
373		dentry = d_alias;
374
375	/* When we created the file with exclusive semantics, make
376	 * sure we set the attributes afterwards. */
377	if (data->arg.create.createmode == NFS3_CREATE_EXCLUSIVE) {
378		dprintk("NFS call  setattr (post-create)\n");
379
380		if (!(sattr->ia_valid & ATTR_ATIME_SET))
381			sattr->ia_valid |= ATTR_ATIME;
382		if (!(sattr->ia_valid & ATTR_MTIME_SET))
383			sattr->ia_valid |= ATTR_MTIME;
384
385		/* Note: we could use a guarded setattr here, but I'm
386		 * not sure this buys us anything (and I'd have
387		 * to revamp the NFSv3 XDR code) */
388		status = nfs3_proc_setattr(dentry, data->res.fattr, sattr);
389		nfs_post_op_update_inode(d_inode(dentry), data->res.fattr);
390		dprintk("NFS reply setattr (post-create): %d\n", status);
391		if (status != 0)
392			goto out_dput;
393	}
394
395	status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl);
396
397out_dput:
398	dput(d_alias);
399out_release_acls:
400	posix_acl_release(acl);
401	posix_acl_release(default_acl);
402out:
403	nfs3_free_createdata(data);
404	dprintk("NFS reply create: %d\n", status);
405	return status;
406}
407
408static int
409nfs3_proc_remove(struct inode *dir, struct dentry *dentry)
410{
411	struct nfs_removeargs arg = {
412		.fh = NFS_FH(dir),
413		.name = dentry->d_name,
414	};
415	struct nfs_removeres res;
416	struct rpc_message msg = {
417		.rpc_proc = &nfs3_procedures[NFS3PROC_REMOVE],
418		.rpc_argp = &arg,
419		.rpc_resp = &res,
420	};
421	int status = -ENOMEM;
422
423	dprintk("NFS call  remove %pd2\n", dentry);
424	res.dir_attr = nfs_alloc_fattr();
425	if (res.dir_attr == NULL)
426		goto out;
427
428	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
429	nfs_post_op_update_inode(dir, res.dir_attr);
430	nfs_free_fattr(res.dir_attr);
431out:
432	dprintk("NFS reply remove: %d\n", status);
433	return status;
434}
435
436static void
437nfs3_proc_unlink_setup(struct rpc_message *msg,
438		struct dentry *dentry,
439		struct inode *inode)
440{
441	msg->rpc_proc = &nfs3_procedures[NFS3PROC_REMOVE];
442}
443
444static void nfs3_proc_unlink_rpc_prepare(struct rpc_task *task, struct nfs_unlinkdata *data)
445{
446	rpc_call_start(task);
447}
448
449static int
450nfs3_proc_unlink_done(struct rpc_task *task, struct inode *dir)
451{
452	struct nfs_removeres *res;
453	if (nfs3_async_handle_jukebox(task, dir))
454		return 0;
455	res = task->tk_msg.rpc_resp;
456	nfs_post_op_update_inode(dir, res->dir_attr);
457	return 1;
458}
459
460static void
461nfs3_proc_rename_setup(struct rpc_message *msg,
462		struct dentry *old_dentry,
463		struct dentry *new_dentry)
464{
465	msg->rpc_proc = &nfs3_procedures[NFS3PROC_RENAME];
466}
467
468static void nfs3_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renamedata *data)
469{
470	rpc_call_start(task);
471}
472
473static int
474nfs3_proc_rename_done(struct rpc_task *task, struct inode *old_dir,
475		      struct inode *new_dir)
476{
477	struct nfs_renameres *res;
478
479	if (nfs3_async_handle_jukebox(task, old_dir))
480		return 0;
481	res = task->tk_msg.rpc_resp;
482
483	nfs_post_op_update_inode(old_dir, res->old_fattr);
484	nfs_post_op_update_inode(new_dir, res->new_fattr);
485	return 1;
486}
487
488static int
489nfs3_proc_link(struct inode *inode, struct inode *dir, const struct qstr *name)
490{
491	struct nfs3_linkargs	arg = {
492		.fromfh		= NFS_FH(inode),
493		.tofh		= NFS_FH(dir),
494		.toname		= name->name,
495		.tolen		= name->len
496	};
497	struct nfs3_linkres	res;
498	struct rpc_message msg = {
499		.rpc_proc	= &nfs3_procedures[NFS3PROC_LINK],
500		.rpc_argp	= &arg,
501		.rpc_resp	= &res,
502	};
503	int status = -ENOMEM;
504
505	dprintk("NFS call  link %s\n", name->name);
506	res.fattr = nfs_alloc_fattr();
507	res.dir_attr = nfs_alloc_fattr();
508	if (res.fattr == NULL || res.dir_attr == NULL)
509		goto out;
510
511	status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
512	nfs_post_op_update_inode(dir, res.dir_attr);
513	nfs_post_op_update_inode(inode, res.fattr);
514out:
515	nfs_free_fattr(res.dir_attr);
516	nfs_free_fattr(res.fattr);
517	dprintk("NFS reply link: %d\n", status);
518	return status;
519}
520
521static int
522nfs3_proc_symlink(struct inode *dir, struct dentry *dentry, struct page *page,
523		  unsigned int len, struct iattr *sattr)
524{
525	struct nfs3_createdata *data;
526	struct dentry *d_alias;
527	int status = -ENOMEM;
528
529	if (len > NFS3_MAXPATHLEN)
530		return -ENAMETOOLONG;
531
532	dprintk("NFS call  symlink %pd\n", dentry);
533
534	data = nfs3_alloc_createdata();
535	if (data == NULL)
536		goto out;
537	data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_SYMLINK];
538	data->arg.symlink.fromfh = NFS_FH(dir);
539	data->arg.symlink.fromname = dentry->d_name.name;
540	data->arg.symlink.fromlen = dentry->d_name.len;
541	data->arg.symlink.pages = &page;
542	data->arg.symlink.pathlen = len;
543	data->arg.symlink.sattr = sattr;
544
545	d_alias = nfs3_do_create(dir, dentry, data);
546	status = PTR_ERR_OR_ZERO(d_alias);
547
548	if (status == 0)
549		dput(d_alias);
550
551	nfs3_free_createdata(data);
552out:
553	dprintk("NFS reply symlink: %d\n", status);
554	return status;
555}
556
557static int
558nfs3_proc_mkdir(struct inode *dir, struct dentry *dentry, struct iattr *sattr)
559{
560	struct posix_acl *default_acl, *acl;
561	struct nfs3_createdata *data;
562	struct dentry *d_alias;
563	int status = -ENOMEM;
564
565	dprintk("NFS call  mkdir %pd\n", dentry);
566
567	data = nfs3_alloc_createdata();
568	if (data == NULL)
569		goto out;
570
571	status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl);
572	if (status)
573		goto out;
574
575	data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_MKDIR];
576	data->arg.mkdir.fh = NFS_FH(dir);
577	data->arg.mkdir.name = dentry->d_name.name;
578	data->arg.mkdir.len = dentry->d_name.len;
579	data->arg.mkdir.sattr = sattr;
580
581	d_alias = nfs3_do_create(dir, dentry, data);
582	status = PTR_ERR_OR_ZERO(d_alias);
583
584	if (status != 0)
585		goto out_release_acls;
586
587	if (d_alias)
588		dentry = d_alias;
589
590	status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl);
591
592	dput(d_alias);
593out_release_acls:
594	posix_acl_release(acl);
595	posix_acl_release(default_acl);
596out:
597	nfs3_free_createdata(data);
598	dprintk("NFS reply mkdir: %d\n", status);
599	return status;
600}
601
602static int
603nfs3_proc_rmdir(struct inode *dir, const struct qstr *name)
604{
605	struct nfs_fattr	*dir_attr;
606	struct nfs3_diropargs	arg = {
607		.fh		= NFS_FH(dir),
608		.name		= name->name,
609		.len		= name->len
610	};
611	struct rpc_message msg = {
612		.rpc_proc	= &nfs3_procedures[NFS3PROC_RMDIR],
613		.rpc_argp	= &arg,
614	};
615	int status = -ENOMEM;
616
617	dprintk("NFS call  rmdir %s\n", name->name);
618	dir_attr = nfs_alloc_fattr();
619	if (dir_attr == NULL)
620		goto out;
621
622	msg.rpc_resp = dir_attr;
623	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
624	nfs_post_op_update_inode(dir, dir_attr);
625	nfs_free_fattr(dir_attr);
626out:
627	dprintk("NFS reply rmdir: %d\n", status);
628	return status;
629}
630
631/*
632 * The READDIR implementation is somewhat hackish - we pass the user buffer
633 * to the encode function, which installs it in the receive iovec.
634 * The decode function itself doesn't perform any decoding, it just makes
635 * sure the reply is syntactically correct.
636 *
637 * Also note that this implementation handles both plain readdir and
638 * readdirplus.
639 */
640static int
641nfs3_proc_readdir(struct dentry *dentry, const struct cred *cred,
642		  u64 cookie, struct page **pages, unsigned int count, bool plus)
643{
644	struct inode		*dir = d_inode(dentry);
645	__be32			*verf = NFS_I(dir)->cookieverf;
646	struct nfs3_readdirargs	arg = {
647		.fh		= NFS_FH(dir),
648		.cookie		= cookie,
649		.verf		= {verf[0], verf[1]},
650		.plus		= plus,
651		.count		= count,
652		.pages		= pages
653	};
654	struct nfs3_readdirres	res = {
655		.verf		= verf,
656		.plus		= plus
657	};
658	struct rpc_message	msg = {
659		.rpc_proc	= &nfs3_procedures[NFS3PROC_READDIR],
660		.rpc_argp	= &arg,
661		.rpc_resp	= &res,
662		.rpc_cred	= cred,
663	};
664	int status = -ENOMEM;
665
666	if (plus)
667		msg.rpc_proc = &nfs3_procedures[NFS3PROC_READDIRPLUS];
668
669	dprintk("NFS call  readdir%s %d\n",
670			plus? "plus" : "", (unsigned int) cookie);
671
672	res.dir_attr = nfs_alloc_fattr();
673	if (res.dir_attr == NULL)
674		goto out;
675
676	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
677
678	nfs_invalidate_atime(dir);
679	nfs_refresh_inode(dir, res.dir_attr);
680
681	nfs_free_fattr(res.dir_attr);
682out:
683	dprintk("NFS reply readdir%s: %d\n",
684			plus? "plus" : "", status);
685	return status;
686}
687
688static int
689nfs3_proc_mknod(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
690		dev_t rdev)
691{
692	struct posix_acl *default_acl, *acl;
693	struct nfs3_createdata *data;
694	struct dentry *d_alias;
695	int status = -ENOMEM;
696
697	dprintk("NFS call  mknod %pd %u:%u\n", dentry,
698			MAJOR(rdev), MINOR(rdev));
699
700	data = nfs3_alloc_createdata();
701	if (data == NULL)
702		goto out;
703
704	status = posix_acl_create(dir, &sattr->ia_mode, &default_acl, &acl);
705	if (status)
706		goto out;
707
708	data->msg.rpc_proc = &nfs3_procedures[NFS3PROC_MKNOD];
709	data->arg.mknod.fh = NFS_FH(dir);
710	data->arg.mknod.name = dentry->d_name.name;
711	data->arg.mknod.len = dentry->d_name.len;
712	data->arg.mknod.sattr = sattr;
713	data->arg.mknod.rdev = rdev;
714
715	switch (sattr->ia_mode & S_IFMT) {
716	case S_IFBLK:
717		data->arg.mknod.type = NF3BLK;
718		break;
719	case S_IFCHR:
720		data->arg.mknod.type = NF3CHR;
721		break;
722	case S_IFIFO:
723		data->arg.mknod.type = NF3FIFO;
724		break;
725	case S_IFSOCK:
726		data->arg.mknod.type = NF3SOCK;
727		break;
728	default:
729		status = -EINVAL;
730		goto out_release_acls;
731	}
732
733	d_alias = nfs3_do_create(dir, dentry, data);
734	status = PTR_ERR_OR_ZERO(d_alias);
735	if (status != 0)
736		goto out_release_acls;
737
738	if (d_alias)
739		dentry = d_alias;
740
741	status = nfs3_proc_setacls(d_inode(dentry), acl, default_acl);
742
743	dput(d_alias);
744out_release_acls:
745	posix_acl_release(acl);
746	posix_acl_release(default_acl);
747out:
748	nfs3_free_createdata(data);
749	dprintk("NFS reply mknod: %d\n", status);
750	return status;
751}
752
753static int
754nfs3_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
755		 struct nfs_fsstat *stat)
756{
757	struct rpc_message msg = {
758		.rpc_proc	= &nfs3_procedures[NFS3PROC_FSSTAT],
759		.rpc_argp	= fhandle,
760		.rpc_resp	= stat,
761	};
762	int	status;
763
764	dprintk("NFS call  fsstat\n");
765	nfs_fattr_init(stat->fattr);
766	status = rpc_call_sync(server->client, &msg, 0);
767	dprintk("NFS reply fsstat: %d\n", status);
768	return status;
769}
770
771static int
772do_proc_fsinfo(struct rpc_clnt *client, struct nfs_fh *fhandle,
773		 struct nfs_fsinfo *info)
774{
775	struct rpc_message msg = {
776		.rpc_proc	= &nfs3_procedures[NFS3PROC_FSINFO],
777		.rpc_argp	= fhandle,
778		.rpc_resp	= info,
779	};
780	int	status;
781
782	dprintk("NFS call  fsinfo\n");
783	nfs_fattr_init(info->fattr);
784	status = rpc_call_sync(client, &msg, 0);
785	dprintk("NFS reply fsinfo: %d\n", status);
786	return status;
787}
788
789/*
790 * Bare-bones access to fsinfo: this is for nfs_get_root/nfs_get_sb via
791 * nfs_create_server
792 */
793static int
794nfs3_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
795		   struct nfs_fsinfo *info)
796{
797	int	status;
798
799	status = do_proc_fsinfo(server->client, fhandle, info);
800	if (status && server->nfs_client->cl_rpcclient != server->client)
801		status = do_proc_fsinfo(server->nfs_client->cl_rpcclient, fhandle, info);
802	return status;
803}
804
805static int
806nfs3_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
807		   struct nfs_pathconf *info)
808{
809	struct rpc_message msg = {
810		.rpc_proc	= &nfs3_procedures[NFS3PROC_PATHCONF],
811		.rpc_argp	= fhandle,
812		.rpc_resp	= info,
813	};
814	int	status;
815
816	dprintk("NFS call  pathconf\n");
817	nfs_fattr_init(info->fattr);
818	status = rpc_call_sync(server->client, &msg, 0);
819	dprintk("NFS reply pathconf: %d\n", status);
820	return status;
821}
822
823static int nfs3_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
824{
825	struct inode *inode = hdr->inode;
826	struct nfs_server *server = NFS_SERVER(inode);
827
828	if (hdr->pgio_done_cb != NULL)
829		return hdr->pgio_done_cb(task, hdr);
830
831	if (nfs3_async_handle_jukebox(task, inode))
832		return -EAGAIN;
833
834	if (task->tk_status >= 0 && !server->read_hdrsize)
835		cmpxchg(&server->read_hdrsize, 0, hdr->res.replen);
836
837	nfs_invalidate_atime(inode);
838	nfs_refresh_inode(inode, &hdr->fattr);
839	return 0;
840}
841
842static void nfs3_proc_read_setup(struct nfs_pgio_header *hdr,
843				 struct rpc_message *msg)
844{
845	msg->rpc_proc = &nfs3_procedures[NFS3PROC_READ];
846	hdr->args.replen = NFS_SERVER(hdr->inode)->read_hdrsize;
847}
848
849static int nfs3_proc_pgio_rpc_prepare(struct rpc_task *task,
850				      struct nfs_pgio_header *hdr)
851{
852	rpc_call_start(task);
853	return 0;
854}
855
856static int nfs3_write_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
857{
858	struct inode *inode = hdr->inode;
859
860	if (hdr->pgio_done_cb != NULL)
861		return hdr->pgio_done_cb(task, hdr);
862
863	if (nfs3_async_handle_jukebox(task, inode))
864		return -EAGAIN;
865	if (task->tk_status >= 0)
866		nfs_writeback_update_inode(hdr);
867	return 0;
868}
869
870static void nfs3_proc_write_setup(struct nfs_pgio_header *hdr,
871				  struct rpc_message *msg,
872				  struct rpc_clnt **clnt)
873{
874	msg->rpc_proc = &nfs3_procedures[NFS3PROC_WRITE];
875}
876
877static void nfs3_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data)
878{
879	rpc_call_start(task);
880}
881
882static int nfs3_commit_done(struct rpc_task *task, struct nfs_commit_data *data)
883{
884	if (data->commit_done_cb != NULL)
885		return data->commit_done_cb(task, data);
886
887	if (nfs3_async_handle_jukebox(task, data->inode))
888		return -EAGAIN;
889	nfs_refresh_inode(data->inode, data->res.fattr);
890	return 0;
891}
892
893static void nfs3_proc_commit_setup(struct nfs_commit_data *data, struct rpc_message *msg,
894				   struct rpc_clnt **clnt)
895{
896	msg->rpc_proc = &nfs3_procedures[NFS3PROC_COMMIT];
897}
898
899static void nfs3_nlm_alloc_call(void *data)
900{
901	struct nfs_lock_context *l_ctx = data;
902	if (l_ctx && test_bit(NFS_CONTEXT_UNLOCK, &l_ctx->open_context->flags)) {
903		get_nfs_open_context(l_ctx->open_context);
904		nfs_get_lock_context(l_ctx->open_context);
905	}
906}
907
908static bool nfs3_nlm_unlock_prepare(struct rpc_task *task, void *data)
909{
910	struct nfs_lock_context *l_ctx = data;
911	if (l_ctx && test_bit(NFS_CONTEXT_UNLOCK, &l_ctx->open_context->flags))
912		return nfs_async_iocounter_wait(task, l_ctx);
913	return false;
914
915}
916
917static void nfs3_nlm_release_call(void *data)
918{
919	struct nfs_lock_context *l_ctx = data;
920	struct nfs_open_context *ctx;
921	if (l_ctx && test_bit(NFS_CONTEXT_UNLOCK, &l_ctx->open_context->flags)) {
922		ctx = l_ctx->open_context;
923		nfs_put_lock_context(l_ctx);
924		put_nfs_open_context(ctx);
925	}
926}
927
928static const struct nlmclnt_operations nlmclnt_fl_close_lock_ops = {
929	.nlmclnt_alloc_call = nfs3_nlm_alloc_call,
930	.nlmclnt_unlock_prepare = nfs3_nlm_unlock_prepare,
931	.nlmclnt_release_call = nfs3_nlm_release_call,
932};
933
934static int
935nfs3_proc_lock(struct file *filp, int cmd, struct file_lock *fl)
936{
937	struct inode *inode = file_inode(filp);
938	struct nfs_lock_context *l_ctx = NULL;
939	struct nfs_open_context *ctx = nfs_file_open_context(filp);
940	int status;
941
942	if (fl->fl_flags & FL_CLOSE) {
943		l_ctx = nfs_get_lock_context(ctx);
944		if (IS_ERR(l_ctx))
945			l_ctx = NULL;
946		else
947			set_bit(NFS_CONTEXT_UNLOCK, &ctx->flags);
948	}
949
950	status = nlmclnt_proc(NFS_SERVER(inode)->nlm_host, cmd, fl, l_ctx);
951
952	if (l_ctx)
953		nfs_put_lock_context(l_ctx);
954
955	return status;
956}
957
958static int nfs3_have_delegation(struct inode *inode, fmode_t flags)
959{
960	return 0;
961}
962
963static const struct inode_operations nfs3_dir_inode_operations = {
964	.create		= nfs_create,
965	.lookup		= nfs_lookup,
966	.link		= nfs_link,
967	.unlink		= nfs_unlink,
968	.symlink	= nfs_symlink,
969	.mkdir		= nfs_mkdir,
970	.rmdir		= nfs_rmdir,
971	.mknod		= nfs_mknod,
972	.rename		= nfs_rename,
973	.permission	= nfs_permission,
974	.getattr	= nfs_getattr,
975	.setattr	= nfs_setattr,
976#ifdef CONFIG_NFS_V3_ACL
977	.listxattr	= nfs3_listxattr,
978	.get_acl	= nfs3_get_acl,
979	.set_acl	= nfs3_set_acl,
980#endif
981};
982
983static const struct inode_operations nfs3_file_inode_operations = {
984	.permission	= nfs_permission,
985	.getattr	= nfs_getattr,
986	.setattr	= nfs_setattr,
987#ifdef CONFIG_NFS_V3_ACL
988	.listxattr	= nfs3_listxattr,
989	.get_acl	= nfs3_get_acl,
990	.set_acl	= nfs3_set_acl,
991#endif
992};
993
994const struct nfs_rpc_ops nfs_v3_clientops = {
995	.version	= 3,			/* protocol version */
996	.dentry_ops	= &nfs_dentry_operations,
997	.dir_inode_ops	= &nfs3_dir_inode_operations,
998	.file_inode_ops	= &nfs3_file_inode_operations,
999	.file_ops	= &nfs_file_operations,
1000	.nlmclnt_ops	= &nlmclnt_fl_close_lock_ops,
1001	.getroot	= nfs3_proc_get_root,
1002	.submount	= nfs_submount,
1003	.try_get_tree	= nfs_try_get_tree,
1004	.getattr	= nfs3_proc_getattr,
1005	.setattr	= nfs3_proc_setattr,
1006	.lookup		= nfs3_proc_lookup,
1007	.access		= nfs3_proc_access,
1008	.readlink	= nfs3_proc_readlink,
1009	.create		= nfs3_proc_create,
1010	.remove		= nfs3_proc_remove,
1011	.unlink_setup	= nfs3_proc_unlink_setup,
1012	.unlink_rpc_prepare = nfs3_proc_unlink_rpc_prepare,
1013	.unlink_done	= nfs3_proc_unlink_done,
1014	.rename_setup	= nfs3_proc_rename_setup,
1015	.rename_rpc_prepare = nfs3_proc_rename_rpc_prepare,
1016	.rename_done	= nfs3_proc_rename_done,
1017	.link		= nfs3_proc_link,
1018	.symlink	= nfs3_proc_symlink,
1019	.mkdir		= nfs3_proc_mkdir,
1020	.rmdir		= nfs3_proc_rmdir,
1021	.readdir	= nfs3_proc_readdir,
1022	.mknod		= nfs3_proc_mknod,
1023	.statfs		= nfs3_proc_statfs,
1024	.fsinfo		= nfs3_proc_fsinfo,
1025	.pathconf	= nfs3_proc_pathconf,
1026	.decode_dirent	= nfs3_decode_dirent,
1027	.pgio_rpc_prepare = nfs3_proc_pgio_rpc_prepare,
1028	.read_setup	= nfs3_proc_read_setup,
1029	.read_done	= nfs3_read_done,
1030	.write_setup	= nfs3_proc_write_setup,
1031	.write_done	= nfs3_write_done,
1032	.commit_setup	= nfs3_proc_commit_setup,
1033	.commit_rpc_prepare = nfs3_proc_commit_rpc_prepare,
1034	.commit_done	= nfs3_commit_done,
1035	.lock		= nfs3_proc_lock,
1036	.clear_acl_cache = forget_all_cached_acls,
1037	.close_context	= nfs_close_context,
1038	.have_delegation = nfs3_have_delegation,
1039	.alloc_client	= nfs_alloc_client,
1040	.init_client	= nfs_init_client,
1041	.free_client	= nfs_free_client,
1042	.create_server	= nfs3_create_server,
1043	.clone_server	= nfs3_clone_server,
1044};
1045