• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 */
31 static int
nfs3_rpc_wrapper(struct rpc_clnt * clnt,struct rpc_message * msg,int flags)32 nfs3_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 
47 static int
nfs3_async_handle_jukebox(struct rpc_task * task,struct inode * inode)48 nfs3_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 
60 static int
do_proc_get_root(struct rpc_clnt * client,struct nfs_fh * fhandle,struct nfs_fsinfo * info)61 do_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  */
87 static int
nfs3_proc_get_root(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsinfo * info)88 nfs3_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  */
102 static int
nfs3_proc_getattr(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fattr * fattr,struct nfs4_label * label,struct inode * inode)103 nfs3_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 
126 static int
nfs3_proc_setattr(struct dentry * dentry,struct nfs_fattr * fattr,struct iattr * sattr)127 nfs3_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 
156 static int
nfs3_proc_lookup(struct inode * dir,struct dentry * dentry,struct nfs_fh * fhandle,struct nfs_fattr * fattr,struct nfs4_label * label)157 nfs3_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 
nfs3_proc_access(struct inode * inode,struct nfs_access_entry * entry)201 static 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);
226 out:
227 	dprintk("NFS reply access: %d\n", status);
228 	return status;
229 }
230 
nfs3_proc_readlink(struct inode * inode,struct page * page,unsigned int pgbase,unsigned int pglen)231 static 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);
256 out:
257 	dprintk("NFS reply readlink: %d\n", status);
258 	return status;
259 }
260 
261 struct 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 
nfs3_alloc_createdata(void)275 static 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 
292 static struct dentry *
nfs3_do_create(struct inode * dir,struct dentry * dentry,struct nfs3_createdata * data)293 nfs3_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 
nfs3_free_createdata(struct nfs3_createdata * data)305 static void nfs3_free_createdata(struct nfs3_createdata *data)
306 {
307 	kfree(data);
308 }
309 
310 /*
311  * Create a regular file.
312  */
313 static int
nfs3_proc_create(struct inode * dir,struct dentry * dentry,struct iattr * sattr,int flags)314 nfs3_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 
397 out_dput:
398 	dput(d_alias);
399 out_release_acls:
400 	posix_acl_release(acl);
401 	posix_acl_release(default_acl);
402 out:
403 	nfs3_free_createdata(data);
404 	dprintk("NFS reply create: %d\n", status);
405 	return status;
406 }
407 
408 static int
nfs3_proc_remove(struct inode * dir,struct dentry * dentry)409 nfs3_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);
431 out:
432 	dprintk("NFS reply remove: %d\n", status);
433 	return status;
434 }
435 
436 static void
nfs3_proc_unlink_setup(struct rpc_message * msg,struct dentry * dentry,struct inode * inode)437 nfs3_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 
nfs3_proc_unlink_rpc_prepare(struct rpc_task * task,struct nfs_unlinkdata * data)444 static void nfs3_proc_unlink_rpc_prepare(struct rpc_task *task, struct nfs_unlinkdata *data)
445 {
446 	rpc_call_start(task);
447 }
448 
449 static int
nfs3_proc_unlink_done(struct rpc_task * task,struct inode * dir)450 nfs3_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 
460 static void
nfs3_proc_rename_setup(struct rpc_message * msg,struct dentry * old_dentry,struct dentry * new_dentry)461 nfs3_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 
nfs3_proc_rename_rpc_prepare(struct rpc_task * task,struct nfs_renamedata * data)468 static void nfs3_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renamedata *data)
469 {
470 	rpc_call_start(task);
471 }
472 
473 static int
nfs3_proc_rename_done(struct rpc_task * task,struct inode * old_dir,struct inode * new_dir)474 nfs3_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 
488 static int
nfs3_proc_link(struct inode * inode,struct inode * dir,const struct qstr * name)489 nfs3_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);
514 out:
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 
521 static int
nfs3_proc_symlink(struct inode * dir,struct dentry * dentry,struct page * page,unsigned int len,struct iattr * sattr)522 nfs3_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);
552 out:
553 	dprintk("NFS reply symlink: %d\n", status);
554 	return status;
555 }
556 
557 static int
nfs3_proc_mkdir(struct inode * dir,struct dentry * dentry,struct iattr * sattr)558 nfs3_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);
593 out_release_acls:
594 	posix_acl_release(acl);
595 	posix_acl_release(default_acl);
596 out:
597 	nfs3_free_createdata(data);
598 	dprintk("NFS reply mkdir: %d\n", status);
599 	return status;
600 }
601 
602 static int
nfs3_proc_rmdir(struct inode * dir,const struct qstr * name)603 nfs3_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);
626 out:
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  */
640 static int
nfs3_proc_readdir(struct dentry * dentry,const struct cred * cred,u64 cookie,struct page ** pages,unsigned int count,bool plus)641 nfs3_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);
682 out:
683 	dprintk("NFS reply readdir%s: %d\n",
684 			plus? "plus" : "", status);
685 	return status;
686 }
687 
688 static int
nfs3_proc_mknod(struct inode * dir,struct dentry * dentry,struct iattr * sattr,dev_t rdev)689 nfs3_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);
744 out_release_acls:
745 	posix_acl_release(acl);
746 	posix_acl_release(default_acl);
747 out:
748 	nfs3_free_createdata(data);
749 	dprintk("NFS reply mknod: %d\n", status);
750 	return status;
751 }
752 
753 static int
nfs3_proc_statfs(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsstat * stat)754 nfs3_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 
771 static int
do_proc_fsinfo(struct rpc_clnt * client,struct nfs_fh * fhandle,struct nfs_fsinfo * info)772 do_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  */
793 static int
nfs3_proc_fsinfo(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsinfo * info)794 nfs3_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 
805 static int
nfs3_proc_pathconf(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_pathconf * info)806 nfs3_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 
nfs3_read_done(struct rpc_task * task,struct nfs_pgio_header * hdr)823 static 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 
nfs3_proc_read_setup(struct nfs_pgio_header * hdr,struct rpc_message * msg)842 static 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 
nfs3_proc_pgio_rpc_prepare(struct rpc_task * task,struct nfs_pgio_header * hdr)849 static 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 
nfs3_write_done(struct rpc_task * task,struct nfs_pgio_header * hdr)856 static 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 
nfs3_proc_write_setup(struct nfs_pgio_header * hdr,struct rpc_message * msg,struct rpc_clnt ** clnt)870 static 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 
nfs3_proc_commit_rpc_prepare(struct rpc_task * task,struct nfs_commit_data * data)877 static void nfs3_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data)
878 {
879 	rpc_call_start(task);
880 }
881 
nfs3_commit_done(struct rpc_task * task,struct nfs_commit_data * data)882 static 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 
nfs3_proc_commit_setup(struct nfs_commit_data * data,struct rpc_message * msg,struct rpc_clnt ** clnt)893 static 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 
nfs3_nlm_alloc_call(void * data)899 static 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 
nfs3_nlm_unlock_prepare(struct rpc_task * task,void * data)908 static 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 
nfs3_nlm_release_call(void * data)917 static 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 
928 static 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 
934 static int
nfs3_proc_lock(struct file * filp,int cmd,struct file_lock * fl)935 nfs3_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 
nfs3_have_delegation(struct inode * inode,fmode_t flags)958 static int nfs3_have_delegation(struct inode *inode, fmode_t flags)
959 {
960 	return 0;
961 }
962 
963 static 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 
983 static 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 
994 const 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