Merge tag 'spi-fix-v5.8-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[linux-2.6-microblaze.git] / fs / nfs / nfs3proc.c
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
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
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
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
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
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
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
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
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
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
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 *
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
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
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;
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
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
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
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
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
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
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
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
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
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
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
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
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
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;
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 };