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