f1ff4fa6cce59f3dd28b64c7bf4a5b1a93b61be6
[safe/jmp/linux-2.6] / fs / nfs / nfs4proc.c
1 /*
2  *  fs/nfs/nfs4proc.c
3  *
4  *  Client-side procedure declarations for NFSv4.
5  *
6  *  Copyright (c) 2002 The Regents of the University of Michigan.
7  *  All rights reserved.
8  *
9  *  Kendrick Smith <kmsmith@umich.edu>
10  *  Andy Adamson   <andros@umich.edu>
11  *
12  *  Redistribution and use in source and binary forms, with or without
13  *  modification, are permitted provided that the following conditions
14  *  are met:
15  *
16  *  1. Redistributions of source code must retain the above copyright
17  *     notice, this list of conditions and the following disclaimer.
18  *  2. Redistributions in binary form must reproduce the above copyright
19  *     notice, this list of conditions and the following disclaimer in the
20  *     documentation and/or other materials provided with the distribution.
21  *  3. Neither the name of the University nor the names of its
22  *     contributors may be used to endorse or promote products derived
23  *     from this software without specific prior written permission.
24  *
25  *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
26  *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
27  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28  *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29  *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
32  *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  */
37
38 #include <linux/mm.h>
39 #include <linux/utsname.h>
40 #include <linux/delay.h>
41 #include <linux/errno.h>
42 #include <linux/string.h>
43 #include <linux/sunrpc/clnt.h>
44 #include <linux/nfs.h>
45 #include <linux/nfs4.h>
46 #include <linux/nfs_fs.h>
47 #include <linux/nfs_page.h>
48 #include <linux/smp_lock.h>
49 #include <linux/namei.h>
50 #include <linux/mount.h>
51
52 #include "nfs4_fs.h"
53 #include "delegation.h"
54 #include "iostat.h"
55
56 #define NFSDBG_FACILITY         NFSDBG_PROC
57
58 #define NFS4_POLL_RETRY_MIN     (1*HZ)
59 #define NFS4_POLL_RETRY_MAX     (15*HZ)
60
61 struct nfs4_opendata;
62 static int _nfs4_proc_open(struct nfs4_opendata *data);
63 static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
64 static int nfs4_async_handle_error(struct rpc_task *, const struct nfs_server *);
65 static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry);
66 static int nfs4_handle_exception(const struct nfs_server *server, int errorcode, struct nfs4_exception *exception);
67 static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs4_client *clp);
68 extern u32 *nfs4_decode_dirent(u32 *p, struct nfs_entry *entry, int plus);
69 extern struct rpc_procinfo nfs4_procedures[];
70
71 /* Prevent leaks of NFSv4 errors into userland */
72 int nfs4_map_errors(int err)
73 {
74         if (err < -1000) {
75                 dprintk("%s could not handle NFSv4 error %d\n",
76                                 __FUNCTION__, -err);
77                 return -EIO;
78         }
79         return err;
80 }
81
82 /*
83  * This is our standard bitmap for GETATTR requests.
84  */
85 const u32 nfs4_fattr_bitmap[2] = {
86         FATTR4_WORD0_TYPE
87         | FATTR4_WORD0_CHANGE
88         | FATTR4_WORD0_SIZE
89         | FATTR4_WORD0_FSID
90         | FATTR4_WORD0_FILEID,
91         FATTR4_WORD1_MODE
92         | FATTR4_WORD1_NUMLINKS
93         | FATTR4_WORD1_OWNER
94         | FATTR4_WORD1_OWNER_GROUP
95         | FATTR4_WORD1_RAWDEV
96         | FATTR4_WORD1_SPACE_USED
97         | FATTR4_WORD1_TIME_ACCESS
98         | FATTR4_WORD1_TIME_METADATA
99         | FATTR4_WORD1_TIME_MODIFY
100 };
101
102 const u32 nfs4_statfs_bitmap[2] = {
103         FATTR4_WORD0_FILES_AVAIL
104         | FATTR4_WORD0_FILES_FREE
105         | FATTR4_WORD0_FILES_TOTAL,
106         FATTR4_WORD1_SPACE_AVAIL
107         | FATTR4_WORD1_SPACE_FREE
108         | FATTR4_WORD1_SPACE_TOTAL
109 };
110
111 const u32 nfs4_pathconf_bitmap[2] = {
112         FATTR4_WORD0_MAXLINK
113         | FATTR4_WORD0_MAXNAME,
114         0
115 };
116
117 const u32 nfs4_fsinfo_bitmap[2] = { FATTR4_WORD0_MAXFILESIZE
118                         | FATTR4_WORD0_MAXREAD
119                         | FATTR4_WORD0_MAXWRITE
120                         | FATTR4_WORD0_LEASE_TIME,
121                         0
122 };
123
124 static void nfs4_setup_readdir(u64 cookie, u32 *verifier, struct dentry *dentry,
125                 struct nfs4_readdir_arg *readdir)
126 {
127         u32 *start, *p;
128
129         BUG_ON(readdir->count < 80);
130         if (cookie > 2) {
131                 readdir->cookie = cookie;
132                 memcpy(&readdir->verifier, verifier, sizeof(readdir->verifier));
133                 return;
134         }
135
136         readdir->cookie = 0;
137         memset(&readdir->verifier, 0, sizeof(readdir->verifier));
138         if (cookie == 2)
139                 return;
140         
141         /*
142          * NFSv4 servers do not return entries for '.' and '..'
143          * Therefore, we fake these entries here.  We let '.'
144          * have cookie 0 and '..' have cookie 1.  Note that
145          * when talking to the server, we always send cookie 0
146          * instead of 1 or 2.
147          */
148         start = p = (u32 *)kmap_atomic(*readdir->pages, KM_USER0);
149         
150         if (cookie == 0) {
151                 *p++ = xdr_one;                                  /* next */
152                 *p++ = xdr_zero;                   /* cookie, first word */
153                 *p++ = xdr_one;                   /* cookie, second word */
154                 *p++ = xdr_one;                             /* entry len */
155                 memcpy(p, ".\0\0\0", 4);                        /* entry */
156                 p++;
157                 *p++ = xdr_one;                         /* bitmap length */
158                 *p++ = htonl(FATTR4_WORD0_FILEID);             /* bitmap */
159                 *p++ = htonl(8);              /* attribute buffer length */
160                 p = xdr_encode_hyper(p, dentry->d_inode->i_ino);
161         }
162         
163         *p++ = xdr_one;                                  /* next */
164         *p++ = xdr_zero;                   /* cookie, first word */
165         *p++ = xdr_two;                   /* cookie, second word */
166         *p++ = xdr_two;                             /* entry len */
167         memcpy(p, "..\0\0", 4);                         /* entry */
168         p++;
169         *p++ = xdr_one;                         /* bitmap length */
170         *p++ = htonl(FATTR4_WORD0_FILEID);             /* bitmap */
171         *p++ = htonl(8);              /* attribute buffer length */
172         p = xdr_encode_hyper(p, dentry->d_parent->d_inode->i_ino);
173
174         readdir->pgbase = (char *)p - (char *)start;
175         readdir->count -= readdir->pgbase;
176         kunmap_atomic(start, KM_USER0);
177 }
178
179 static void renew_lease(const struct nfs_server *server, unsigned long timestamp)
180 {
181         struct nfs4_client *clp = server->nfs4_state;
182         spin_lock(&clp->cl_lock);
183         if (time_before(clp->cl_last_renewal,timestamp))
184                 clp->cl_last_renewal = timestamp;
185         spin_unlock(&clp->cl_lock);
186 }
187
188 static void update_changeattr(struct inode *inode, struct nfs4_change_info *cinfo)
189 {
190         struct nfs_inode *nfsi = NFS_I(inode);
191
192         spin_lock(&inode->i_lock);
193         nfsi->cache_validity |= NFS_INO_INVALID_ATTR;
194         if (cinfo->before == nfsi->change_attr && cinfo->atomic)
195                 nfsi->change_attr = cinfo->after;
196         spin_unlock(&inode->i_lock);
197 }
198
199 struct nfs4_opendata {
200         atomic_t count;
201         struct nfs_openargs o_arg;
202         struct nfs_openres o_res;
203         struct nfs_open_confirmargs c_arg;
204         struct nfs_open_confirmres c_res;
205         struct nfs_fattr f_attr;
206         struct nfs_fattr dir_attr;
207         struct dentry *dentry;
208         struct dentry *dir;
209         struct nfs4_state_owner *owner;
210         struct iattr attrs;
211         unsigned long timestamp;
212         int rpc_status;
213         int cancelled;
214 };
215
216 static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
217                 struct nfs4_state_owner *sp, int flags,
218                 const struct iattr *attrs)
219 {
220         struct dentry *parent = dget_parent(dentry);
221         struct inode *dir = parent->d_inode;
222         struct nfs_server *server = NFS_SERVER(dir);
223         struct nfs4_opendata *p;
224
225         p = kzalloc(sizeof(*p), GFP_KERNEL);
226         if (p == NULL)
227                 goto err;
228         p->o_arg.seqid = nfs_alloc_seqid(&sp->so_seqid);
229         if (p->o_arg.seqid == NULL)
230                 goto err_free;
231         atomic_set(&p->count, 1);
232         p->dentry = dget(dentry);
233         p->dir = parent;
234         p->owner = sp;
235         atomic_inc(&sp->so_count);
236         p->o_arg.fh = NFS_FH(dir);
237         p->o_arg.open_flags = flags,
238         p->o_arg.clientid = server->nfs4_state->cl_clientid;
239         p->o_arg.id = sp->so_id;
240         p->o_arg.name = &dentry->d_name;
241         p->o_arg.server = server;
242         p->o_arg.bitmask = server->attr_bitmask;
243         p->o_arg.claim = NFS4_OPEN_CLAIM_NULL;
244         p->o_res.f_attr = &p->f_attr;
245         p->o_res.dir_attr = &p->dir_attr;
246         p->o_res.server = server;
247         nfs_fattr_init(&p->f_attr);
248         nfs_fattr_init(&p->dir_attr);
249         if (flags & O_EXCL) {
250                 u32 *s = (u32 *) p->o_arg.u.verifier.data;
251                 s[0] = jiffies;
252                 s[1] = current->pid;
253         } else if (flags & O_CREAT) {
254                 p->o_arg.u.attrs = &p->attrs;
255                 memcpy(&p->attrs, attrs, sizeof(p->attrs));
256         }
257         p->c_arg.fh = &p->o_res.fh;
258         p->c_arg.stateid = &p->o_res.stateid;
259         p->c_arg.seqid = p->o_arg.seqid;
260         return p;
261 err_free:
262         kfree(p);
263 err:
264         dput(parent);
265         return NULL;
266 }
267
268 static void nfs4_opendata_free(struct nfs4_opendata *p)
269 {
270         if (p != NULL && atomic_dec_and_test(&p->count)) {
271                 nfs_free_seqid(p->o_arg.seqid);
272                 nfs4_put_state_owner(p->owner);
273                 dput(p->dir);
274                 dput(p->dentry);
275                 kfree(p);
276         }
277 }
278
279 /* Helper for asynchronous RPC calls */
280 static int nfs4_call_async(struct rpc_clnt *clnt,
281                 const struct rpc_call_ops *tk_ops, void *calldata)
282 {
283         struct rpc_task *task;
284
285         if (!(task = rpc_new_task(clnt, RPC_TASK_ASYNC, tk_ops, calldata)))
286                 return -ENOMEM;
287         rpc_execute(task);
288         return 0;
289 }
290
291 static int nfs4_wait_for_completion_rpc_task(struct rpc_task *task)
292 {
293         sigset_t oldset;
294         int ret;
295
296         rpc_clnt_sigmask(task->tk_client, &oldset);
297         ret = rpc_wait_for_completion_task(task);
298         rpc_clnt_sigunmask(task->tk_client, &oldset);
299         return ret;
300 }
301
302 static inline void update_open_stateflags(struct nfs4_state *state, mode_t open_flags)
303 {
304         switch (open_flags) {
305                 case FMODE_WRITE:
306                         state->n_wronly++;
307                         break;
308                 case FMODE_READ:
309                         state->n_rdonly++;
310                         break;
311                 case FMODE_READ|FMODE_WRITE:
312                         state->n_rdwr++;
313         }
314 }
315
316 static void update_open_stateid(struct nfs4_state *state, nfs4_stateid *stateid, int open_flags)
317 {
318         struct inode *inode = state->inode;
319
320         open_flags &= (FMODE_READ|FMODE_WRITE);
321         /* Protect against nfs4_find_state_byowner() */
322         spin_lock(&state->owner->so_lock);
323         spin_lock(&inode->i_lock);
324         memcpy(&state->stateid, stateid, sizeof(state->stateid));
325         update_open_stateflags(state, open_flags);
326         nfs4_state_set_mode_locked(state, state->state | open_flags);
327         spin_unlock(&inode->i_lock);
328         spin_unlock(&state->owner->so_lock);
329 }
330
331 static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data)
332 {
333         struct inode *inode;
334         struct nfs4_state *state = NULL;
335
336         if (!(data->f_attr.valid & NFS_ATTR_FATTR))
337                 goto out;
338         inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh, &data->f_attr);
339         if (inode == NULL)
340                 goto out;
341         state = nfs4_get_open_state(inode, data->owner);
342         if (state == NULL)
343                 goto put_inode;
344         update_open_stateid(state, &data->o_res.stateid, data->o_arg.open_flags);
345 put_inode:
346         iput(inode);
347 out:
348         return state;
349 }
350
351 static struct nfs_open_context *nfs4_state_find_open_context(struct nfs4_state *state)
352 {
353         struct nfs_inode *nfsi = NFS_I(state->inode);
354         struct nfs_open_context *ctx;
355
356         spin_lock(&state->inode->i_lock);
357         list_for_each_entry(ctx, &nfsi->open_files, list) {
358                 if (ctx->state != state)
359                         continue;
360                 get_nfs_open_context(ctx);
361                 spin_unlock(&state->inode->i_lock);
362                 return ctx;
363         }
364         spin_unlock(&state->inode->i_lock);
365         return ERR_PTR(-ENOENT);
366 }
367
368 static int nfs4_open_recover_helper(struct nfs4_opendata *opendata, mode_t openflags, nfs4_stateid *stateid)
369 {
370         int ret;
371
372         opendata->o_arg.open_flags = openflags;
373         ret = _nfs4_proc_open(opendata);
374         if (ret != 0)
375                 return ret; 
376         memcpy(stateid->data, opendata->o_res.stateid.data,
377                         sizeof(stateid->data));
378         return 0;
379 }
380
381 static int nfs4_open_recover(struct nfs4_opendata *opendata, struct nfs4_state *state)
382 {
383         nfs4_stateid stateid;
384         struct nfs4_state *newstate;
385         int mode = 0;
386         int delegation = 0;
387         int ret;
388
389         /* memory barrier prior to reading state->n_* */
390         smp_rmb();
391         if (state->n_rdwr != 0) {
392                 ret = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE, &stateid);
393                 if (ret != 0)
394                         return ret;
395                 mode |= FMODE_READ|FMODE_WRITE;
396                 if (opendata->o_res.delegation_type != 0)
397                         delegation = opendata->o_res.delegation_type;
398                 smp_rmb();
399         }
400         if (state->n_wronly != 0) {
401                 ret = nfs4_open_recover_helper(opendata, FMODE_WRITE, &stateid);
402                 if (ret != 0)
403                         return ret;
404                 mode |= FMODE_WRITE;
405                 if (opendata->o_res.delegation_type != 0)
406                         delegation = opendata->o_res.delegation_type;
407                 smp_rmb();
408         }
409         if (state->n_rdonly != 0) {
410                 ret = nfs4_open_recover_helper(opendata, FMODE_READ, &stateid);
411                 if (ret != 0)
412                         return ret;
413                 mode |= FMODE_READ;
414         }
415         clear_bit(NFS_DELEGATED_STATE, &state->flags);
416         if (mode == 0)
417                 return 0;
418         if (opendata->o_res.delegation_type == 0)
419                 opendata->o_res.delegation_type = delegation;
420         opendata->o_arg.open_flags |= mode;
421         newstate = nfs4_opendata_to_nfs4_state(opendata);
422         if (newstate != NULL) {
423                 if (opendata->o_res.delegation_type != 0) {
424                         struct nfs_inode *nfsi = NFS_I(newstate->inode);
425                         int delegation_flags = 0;
426                         if (nfsi->delegation)
427                                 delegation_flags = nfsi->delegation->flags;
428                         if (!(delegation_flags & NFS_DELEGATION_NEED_RECLAIM))
429                                 nfs_inode_set_delegation(newstate->inode,
430                                                 opendata->owner->so_cred,
431                                                 &opendata->o_res);
432                         else
433                                 nfs_inode_reclaim_delegation(newstate->inode,
434                                                 opendata->owner->so_cred,
435                                                 &opendata->o_res);
436                 }
437                 nfs4_close_state(newstate, opendata->o_arg.open_flags);
438         }
439         if (newstate != state)
440                 return -ESTALE;
441         return 0;
442 }
443
444 /*
445  * OPEN_RECLAIM:
446  *      reclaim state on the server after a reboot.
447  */
448 static int _nfs4_do_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state, struct dentry *dentry)
449 {
450         struct nfs_delegation *delegation = NFS_I(state->inode)->delegation;
451         struct nfs4_opendata *opendata;
452         int delegation_type = 0;
453         int status;
454
455         if (delegation != NULL) {
456                 if (!(delegation->flags & NFS_DELEGATION_NEED_RECLAIM)) {
457                         memcpy(&state->stateid, &delegation->stateid,
458                                         sizeof(state->stateid));
459                         set_bit(NFS_DELEGATED_STATE, &state->flags);
460                         return 0;
461                 }
462                 delegation_type = delegation->type;
463         }
464         opendata = nfs4_opendata_alloc(dentry, sp, 0, NULL);
465         if (opendata == NULL)
466                 return -ENOMEM;
467         opendata->o_arg.claim = NFS4_OPEN_CLAIM_PREVIOUS;
468         opendata->o_arg.fh = NFS_FH(state->inode);
469         nfs_copy_fh(&opendata->o_res.fh, opendata->o_arg.fh);
470         opendata->o_arg.u.delegation_type = delegation_type;
471         status = nfs4_open_recover(opendata, state);
472         nfs4_opendata_free(opendata);
473         return status;
474 }
475
476 static int nfs4_do_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state, struct dentry *dentry)
477 {
478         struct nfs_server *server = NFS_SERVER(state->inode);
479         struct nfs4_exception exception = { };
480         int err;
481         do {
482                 err = _nfs4_do_open_reclaim(sp, state, dentry);
483                 if (err != -NFS4ERR_DELAY)
484                         break;
485                 nfs4_handle_exception(server, err, &exception);
486         } while (exception.retry);
487         return err;
488 }
489
490 static int nfs4_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state)
491 {
492         struct nfs_open_context *ctx;
493         int ret;
494
495         ctx = nfs4_state_find_open_context(state);
496         if (IS_ERR(ctx))
497                 return PTR_ERR(ctx);
498         ret = nfs4_do_open_reclaim(sp, state, ctx->dentry);
499         put_nfs_open_context(ctx);
500         return ret;
501 }
502
503 static int _nfs4_open_delegation_recall(struct dentry *dentry, struct nfs4_state *state)
504 {
505         struct nfs4_state_owner  *sp  = state->owner;
506         struct nfs4_opendata *opendata;
507         int ret;
508
509         if (!test_bit(NFS_DELEGATED_STATE, &state->flags))
510                 return 0;
511         opendata = nfs4_opendata_alloc(dentry, sp, 0, NULL);
512         if (opendata == NULL)
513                 return -ENOMEM;
514         opendata->o_arg.claim = NFS4_OPEN_CLAIM_DELEGATE_CUR;
515         memcpy(opendata->o_arg.u.delegation.data, state->stateid.data,
516                         sizeof(opendata->o_arg.u.delegation.data));
517         ret = nfs4_open_recover(opendata, state);
518         nfs4_opendata_free(opendata);
519         return ret;
520 }
521
522 int nfs4_open_delegation_recall(struct dentry *dentry, struct nfs4_state *state)
523 {
524         struct nfs4_exception exception = { };
525         struct nfs_server *server = NFS_SERVER(dentry->d_inode);
526         int err;
527         do {
528                 err = _nfs4_open_delegation_recall(dentry, state);
529                 switch (err) {
530                         case 0:
531                                 return err;
532                         case -NFS4ERR_STALE_CLIENTID:
533                         case -NFS4ERR_STALE_STATEID:
534                         case -NFS4ERR_EXPIRED:
535                                 /* Don't recall a delegation if it was lost */
536                                 nfs4_schedule_state_recovery(server->nfs4_state);
537                                 return err;
538                 }
539                 err = nfs4_handle_exception(server, err, &exception);
540         } while (exception.retry);
541         return err;
542 }
543
544 static void nfs4_open_confirm_prepare(struct rpc_task *task, void *calldata)
545 {
546         struct nfs4_opendata *data = calldata;
547         struct  rpc_message msg = {
548                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM],
549                 .rpc_argp = &data->c_arg,
550                 .rpc_resp = &data->c_res,
551                 .rpc_cred = data->owner->so_cred,
552         };
553         data->timestamp = jiffies;
554         rpc_call_setup(task, &msg, 0);
555 }
556
557 static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata)
558 {
559         struct nfs4_opendata *data = calldata;
560
561         data->rpc_status = task->tk_status;
562         if (RPC_ASSASSINATED(task))
563                 return;
564         if (data->rpc_status == 0) {
565                 memcpy(data->o_res.stateid.data, data->c_res.stateid.data,
566                                 sizeof(data->o_res.stateid.data));
567                 renew_lease(data->o_res.server, data->timestamp);
568         }
569         nfs_increment_open_seqid(data->rpc_status, data->c_arg.seqid);
570         nfs_confirm_seqid(&data->owner->so_seqid, data->rpc_status);
571 }
572
573 static void nfs4_open_confirm_release(void *calldata)
574 {
575         struct nfs4_opendata *data = calldata;
576         struct nfs4_state *state = NULL;
577
578         /* If this request hasn't been cancelled, do nothing */
579         if (data->cancelled == 0)
580                 goto out_free;
581         /* In case of error, no cleanup! */
582         if (data->rpc_status != 0)
583                 goto out_free;
584         nfs_confirm_seqid(&data->owner->so_seqid, 0);
585         state = nfs4_opendata_to_nfs4_state(data);
586         if (state != NULL)
587                 nfs4_close_state(state, data->o_arg.open_flags);
588 out_free:
589         nfs4_opendata_free(data);
590 }
591
592 static const struct rpc_call_ops nfs4_open_confirm_ops = {
593         .rpc_call_prepare = nfs4_open_confirm_prepare,
594         .rpc_call_done = nfs4_open_confirm_done,
595         .rpc_release = nfs4_open_confirm_release,
596 };
597
598 /*
599  * Note: On error, nfs4_proc_open_confirm will free the struct nfs4_opendata
600  */
601 static int _nfs4_proc_open_confirm(struct nfs4_opendata *data)
602 {
603         struct nfs_server *server = NFS_SERVER(data->dir->d_inode);
604         struct rpc_task *task;
605         int status;
606
607         atomic_inc(&data->count);
608         task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_open_confirm_ops, data);
609         if (IS_ERR(task)) {
610                 nfs4_opendata_free(data);
611                 return PTR_ERR(task);
612         }
613         status = nfs4_wait_for_completion_rpc_task(task);
614         if (status != 0) {
615                 data->cancelled = 1;
616                 smp_wmb();
617         } else
618                 status = data->rpc_status;
619         rpc_release_task(task);
620         return status;
621 }
622
623 static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
624 {
625         struct nfs4_opendata *data = calldata;
626         struct nfs4_state_owner *sp = data->owner;
627         struct rpc_message msg = {
628                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN],
629                 .rpc_argp = &data->o_arg,
630                 .rpc_resp = &data->o_res,
631                 .rpc_cred = sp->so_cred,
632         };
633         
634         if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0)
635                 return;
636         /* Update sequence id. */
637         data->o_arg.id = sp->so_id;
638         data->o_arg.clientid = sp->so_client->cl_clientid;
639         if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS)
640                 msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
641         data->timestamp = jiffies;
642         rpc_call_setup(task, &msg, 0);
643 }
644
645 static void nfs4_open_done(struct rpc_task *task, void *calldata)
646 {
647         struct nfs4_opendata *data = calldata;
648
649         data->rpc_status = task->tk_status;
650         if (RPC_ASSASSINATED(task))
651                 return;
652         if (task->tk_status == 0) {
653                 switch (data->o_res.f_attr->mode & S_IFMT) {
654                         case S_IFREG:
655                                 break;
656                         case S_IFLNK:
657                                 data->rpc_status = -ELOOP;
658                                 break;
659                         case S_IFDIR:
660                                 data->rpc_status = -EISDIR;
661                                 break;
662                         default:
663                                 data->rpc_status = -ENOTDIR;
664                 }
665                 renew_lease(data->o_res.server, data->timestamp);
666         }
667         nfs_increment_open_seqid(data->rpc_status, data->o_arg.seqid);
668 }
669
670 static void nfs4_open_release(void *calldata)
671 {
672         struct nfs4_opendata *data = calldata;
673         struct nfs4_state *state = NULL;
674
675         /* If this request hasn't been cancelled, do nothing */
676         if (data->cancelled == 0)
677                 goto out_free;
678         /* In case of error, no cleanup! */
679         if (data->rpc_status != 0)
680                 goto out_free;
681         /* In case we need an open_confirm, no cleanup! */
682         if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM)
683                 goto out_free;
684         nfs_confirm_seqid(&data->owner->so_seqid, 0);
685         state = nfs4_opendata_to_nfs4_state(data);
686         if (state != NULL)
687                 nfs4_close_state(state, data->o_arg.open_flags);
688 out_free:
689         nfs4_opendata_free(data);
690 }
691
692 static const struct rpc_call_ops nfs4_open_ops = {
693         .rpc_call_prepare = nfs4_open_prepare,
694         .rpc_call_done = nfs4_open_done,
695         .rpc_release = nfs4_open_release,
696 };
697
698 /*
699  * Note: On error, nfs4_proc_open will free the struct nfs4_opendata
700  */
701 static int _nfs4_proc_open(struct nfs4_opendata *data)
702 {
703         struct inode *dir = data->dir->d_inode;
704         struct nfs_server *server = NFS_SERVER(dir);
705         struct nfs_openargs *o_arg = &data->o_arg;
706         struct nfs_openres *o_res = &data->o_res;
707         struct rpc_task *task;
708         int status;
709
710         atomic_inc(&data->count);
711         task = rpc_run_task(server->client, RPC_TASK_ASYNC, &nfs4_open_ops, data);
712         if (IS_ERR(task)) {
713                 nfs4_opendata_free(data);
714                 return PTR_ERR(task);
715         }
716         status = nfs4_wait_for_completion_rpc_task(task);
717         if (status != 0) {
718                 data->cancelled = 1;
719                 smp_wmb();
720         } else
721                 status = data->rpc_status;
722         rpc_release_task(task);
723         if (status != 0)
724                 return status;
725
726         if (o_arg->open_flags & O_CREAT) {
727                 update_changeattr(dir, &o_res->cinfo);
728                 nfs_post_op_update_inode(dir, o_res->dir_attr);
729         } else
730                 nfs_refresh_inode(dir, o_res->dir_attr);
731         if(o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) {
732                 status = _nfs4_proc_open_confirm(data);
733                 if (status != 0)
734                         return status;
735         }
736         nfs_confirm_seqid(&data->owner->so_seqid, 0);
737         if (!(o_res->f_attr->valid & NFS_ATTR_FATTR))
738                 return server->rpc_ops->getattr(server, &o_res->fh, o_res->f_attr);
739         return 0;
740 }
741
742 static int _nfs4_do_access(struct inode *inode, struct rpc_cred *cred, int openflags)
743 {
744         struct nfs_access_entry cache;
745         int mask = 0;
746         int status;
747
748         if (openflags & FMODE_READ)
749                 mask |= MAY_READ;
750         if (openflags & FMODE_WRITE)
751                 mask |= MAY_WRITE;
752         status = nfs_access_get_cached(inode, cred, &cache);
753         if (status == 0)
754                 goto out;
755
756         /* Be clever: ask server to check for all possible rights */
757         cache.mask = MAY_EXEC | MAY_WRITE | MAY_READ;
758         cache.cred = cred;
759         cache.jiffies = jiffies;
760         status = _nfs4_proc_access(inode, &cache);
761         if (status != 0)
762                 return status;
763         nfs_access_add_cache(inode, &cache);
764 out:
765         if ((cache.mask & mask) == mask)
766                 return 0;
767         return -EACCES;
768 }
769
770 int nfs4_recover_expired_lease(struct nfs_server *server)
771 {
772         struct nfs4_client *clp = server->nfs4_state;
773
774         if (test_and_clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state))
775                 nfs4_schedule_state_recovery(clp);
776         return nfs4_wait_clnt_recover(server->client, clp);
777 }
778
779 /*
780  * OPEN_EXPIRED:
781  *      reclaim state on the server after a network partition.
782  *      Assumes caller holds the appropriate lock
783  */
784 static int _nfs4_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state, struct dentry *dentry)
785 {
786         struct inode *inode = state->inode;
787         struct nfs_delegation *delegation = NFS_I(inode)->delegation;
788         struct nfs4_opendata *opendata;
789         int openflags = state->state & (FMODE_READ|FMODE_WRITE);
790         int ret;
791
792         if (delegation != NULL && !(delegation->flags & NFS_DELEGATION_NEED_RECLAIM)) {
793                 ret = _nfs4_do_access(inode, sp->so_cred, openflags);
794                 if (ret < 0)
795                         return ret;
796                 memcpy(&state->stateid, &delegation->stateid, sizeof(state->stateid));
797                 set_bit(NFS_DELEGATED_STATE, &state->flags);
798                 return 0;
799         }
800         opendata = nfs4_opendata_alloc(dentry, sp, openflags, NULL);
801         if (opendata == NULL)
802                 return -ENOMEM;
803         ret = nfs4_open_recover(opendata, state);
804         if (ret == -ESTALE) {
805                 /* Invalidate the state owner so we don't ever use it again */
806                 nfs4_drop_state_owner(sp);
807                 d_drop(dentry);
808         }
809         nfs4_opendata_free(opendata);
810         return ret;
811 }
812
813 static inline int nfs4_do_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state, struct dentry *dentry)
814 {
815         struct nfs_server *server = NFS_SERVER(dentry->d_inode);
816         struct nfs4_exception exception = { };
817         int err;
818
819         do {
820                 err = _nfs4_open_expired(sp, state, dentry);
821                 if (err == -NFS4ERR_DELAY)
822                         nfs4_handle_exception(server, err, &exception);
823         } while (exception.retry);
824         return err;
825 }
826
827 static int nfs4_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state)
828 {
829         struct nfs_open_context *ctx;
830         int ret;
831
832         ctx = nfs4_state_find_open_context(state);
833         if (IS_ERR(ctx))
834                 return PTR_ERR(ctx);
835         ret = nfs4_do_open_expired(sp, state, ctx->dentry);
836         put_nfs_open_context(ctx);
837         return ret;
838 }
839
840 /*
841  * Returns a referenced nfs4_state if there is an open delegation on the file
842  */
843 static int _nfs4_open_delegated(struct inode *inode, int flags, struct rpc_cred *cred, struct nfs4_state **res)
844 {
845         struct nfs_delegation *delegation;
846         struct nfs_server *server = NFS_SERVER(inode);
847         struct nfs4_client *clp = server->nfs4_state;
848         struct nfs_inode *nfsi = NFS_I(inode);
849         struct nfs4_state_owner *sp = NULL;
850         struct nfs4_state *state = NULL;
851         int open_flags = flags & (FMODE_READ|FMODE_WRITE);
852         int err;
853
854         err = -ENOMEM;
855         if (!(sp = nfs4_get_state_owner(server, cred))) {
856                 dprintk("%s: nfs4_get_state_owner failed!\n", __FUNCTION__);
857                 return err;
858         }
859         err = nfs4_recover_expired_lease(server);
860         if (err != 0)
861                 goto out_put_state_owner;
862         /* Protect against reboot recovery - NOTE ORDER! */
863         down_read(&clp->cl_sem);
864         /* Protect against delegation recall */
865         down_read(&nfsi->rwsem);
866         delegation = NFS_I(inode)->delegation;
867         err = -ENOENT;
868         if (delegation == NULL || (delegation->type & open_flags) != open_flags)
869                 goto out_err;
870         err = -ENOMEM;
871         state = nfs4_get_open_state(inode, sp);
872         if (state == NULL)
873                 goto out_err;
874
875         err = -ENOENT;
876         if ((state->state & open_flags) == open_flags) {
877                 spin_lock(&inode->i_lock);
878                 update_open_stateflags(state, open_flags);
879                 spin_unlock(&inode->i_lock);
880                 goto out_ok;
881         } else if (state->state != 0)
882                 goto out_put_open_state;
883
884         lock_kernel();
885         err = _nfs4_do_access(inode, cred, open_flags);
886         unlock_kernel();
887         if (err != 0)
888                 goto out_put_open_state;
889         set_bit(NFS_DELEGATED_STATE, &state->flags);
890         update_open_stateid(state, &delegation->stateid, open_flags);
891 out_ok:
892         nfs4_put_state_owner(sp);
893         up_read(&nfsi->rwsem);
894         up_read(&clp->cl_sem);
895         *res = state;
896         return 0;
897 out_put_open_state:
898         nfs4_put_open_state(state);
899 out_err:
900         up_read(&nfsi->rwsem);
901         up_read(&clp->cl_sem);
902         if (err != -EACCES)
903                 nfs_inode_return_delegation(inode);
904 out_put_state_owner:
905         nfs4_put_state_owner(sp);
906         return err;
907 }
908
909 static struct nfs4_state *nfs4_open_delegated(struct inode *inode, int flags, struct rpc_cred *cred)
910 {
911         struct nfs4_exception exception = { };
912         struct nfs4_state *res = ERR_PTR(-EIO);
913         int err;
914
915         do {
916                 err = _nfs4_open_delegated(inode, flags, cred, &res);
917                 if (err == 0)
918                         break;
919                 res = ERR_PTR(nfs4_handle_exception(NFS_SERVER(inode),
920                                         err, &exception));
921         } while (exception.retry);
922         return res;
923 }
924
925 /*
926  * Returns a referenced nfs4_state
927  */
928 static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, int flags, struct iattr *sattr, struct rpc_cred *cred, struct nfs4_state **res)
929 {
930         struct nfs4_state_owner  *sp;
931         struct nfs4_state     *state = NULL;
932         struct nfs_server       *server = NFS_SERVER(dir);
933         struct nfs4_client *clp = server->nfs4_state;
934         struct nfs4_opendata *opendata;
935         int                     status;
936
937         /* Protect against reboot recovery conflicts */
938         status = -ENOMEM;
939         if (!(sp = nfs4_get_state_owner(server, cred))) {
940                 dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n");
941                 goto out_err;
942         }
943         status = nfs4_recover_expired_lease(server);
944         if (status != 0)
945                 goto err_put_state_owner;
946         down_read(&clp->cl_sem);
947         status = -ENOMEM;
948         opendata = nfs4_opendata_alloc(dentry, sp, flags, sattr);
949         if (opendata == NULL)
950                 goto err_put_state_owner;
951
952         status = _nfs4_proc_open(opendata);
953         if (status != 0)
954                 goto err_opendata_free;
955
956         status = -ENOMEM;
957         state = nfs4_opendata_to_nfs4_state(opendata);
958         if (state == NULL)
959                 goto err_opendata_free;
960         if (opendata->o_res.delegation_type != 0)
961                 nfs_inode_set_delegation(state->inode, cred, &opendata->o_res);
962         nfs4_opendata_free(opendata);
963         nfs4_put_state_owner(sp);
964         up_read(&clp->cl_sem);
965         *res = state;
966         return 0;
967 err_opendata_free:
968         nfs4_opendata_free(opendata);
969 err_put_state_owner:
970         nfs4_put_state_owner(sp);
971 out_err:
972         /* Note: clp->cl_sem must be released before nfs4_put_open_state()! */
973         up_read(&clp->cl_sem);
974         *res = NULL;
975         return status;
976 }
977
978
979 static struct nfs4_state *nfs4_do_open(struct inode *dir, struct dentry *dentry, int flags, struct iattr *sattr, struct rpc_cred *cred)
980 {
981         struct nfs4_exception exception = { };
982         struct nfs4_state *res;
983         int status;
984
985         do {
986                 status = _nfs4_do_open(dir, dentry, flags, sattr, cred, &res);
987                 if (status == 0)
988                         break;
989                 /* NOTE: BAD_SEQID means the server and client disagree about the
990                  * book-keeping w.r.t. state-changing operations
991                  * (OPEN/CLOSE/LOCK/LOCKU...)
992                  * It is actually a sign of a bug on the client or on the server.
993                  *
994                  * If we receive a BAD_SEQID error in the particular case of
995                  * doing an OPEN, we assume that nfs_increment_open_seqid() will
996                  * have unhashed the old state_owner for us, and that we can
997                  * therefore safely retry using a new one. We should still warn
998                  * the user though...
999                  */
1000                 if (status == -NFS4ERR_BAD_SEQID) {
1001                         printk(KERN_WARNING "NFS: v4 server returned a bad sequence-id error!\n");
1002                         exception.retry = 1;
1003                         continue;
1004                 }
1005                 /*
1006                  * BAD_STATEID on OPEN means that the server cancelled our
1007                  * state before it received the OPEN_CONFIRM.
1008                  * Recover by retrying the request as per the discussion
1009                  * on Page 181 of RFC3530.
1010                  */
1011                 if (status == -NFS4ERR_BAD_STATEID) {
1012                         exception.retry = 1;
1013                         continue;
1014                 }
1015                 res = ERR_PTR(nfs4_handle_exception(NFS_SERVER(dir),
1016                                         status, &exception));
1017         } while (exception.retry);
1018         return res;
1019 }
1020
1021 static int _nfs4_do_setattr(struct nfs_server *server, struct nfs_fattr *fattr,
1022                 struct nfs_fh *fhandle, struct iattr *sattr,
1023                 struct nfs4_state *state)
1024 {
1025         struct nfs_setattrargs  arg = {
1026                 .fh             = fhandle,
1027                 .iap            = sattr,
1028                 .server         = server,
1029                 .bitmask = server->attr_bitmask,
1030         };
1031         struct nfs_setattrres  res = {
1032                 .fattr          = fattr,
1033                 .server         = server,
1034         };
1035         struct rpc_message msg = {
1036                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_SETATTR],
1037                 .rpc_argp       = &arg,
1038                 .rpc_resp       = &res,
1039         };
1040         unsigned long timestamp = jiffies;
1041         int status;
1042
1043         nfs_fattr_init(fattr);
1044
1045         if (state != NULL) {
1046                 msg.rpc_cred = state->owner->so_cred;
1047                 nfs4_copy_stateid(&arg.stateid, state, current->files);
1048         } else
1049                 memcpy(&arg.stateid, &zero_stateid, sizeof(arg.stateid));
1050
1051         status = rpc_call_sync(server->client, &msg, 0);
1052         if (status == 0 && state != NULL)
1053                 renew_lease(server, timestamp);
1054         return status;
1055 }
1056
1057 static int nfs4_do_setattr(struct nfs_server *server, struct nfs_fattr *fattr,
1058                 struct nfs_fh *fhandle, struct iattr *sattr,
1059                 struct nfs4_state *state)
1060 {
1061         struct nfs4_exception exception = { };
1062         int err;
1063         do {
1064                 err = nfs4_handle_exception(server,
1065                                 _nfs4_do_setattr(server, fattr, fhandle, sattr,
1066                                         state),
1067                                 &exception);
1068         } while (exception.retry);
1069         return err;
1070 }
1071
1072 struct nfs4_closedata {
1073         struct inode *inode;
1074         struct nfs4_state *state;
1075         struct nfs_closeargs arg;
1076         struct nfs_closeres res;
1077         struct nfs_fattr fattr;
1078         unsigned long timestamp;
1079 };
1080
1081 static void nfs4_free_closedata(void *data)
1082 {
1083         struct nfs4_closedata *calldata = data;
1084         struct nfs4_state_owner *sp = calldata->state->owner;
1085
1086         nfs4_put_open_state(calldata->state);
1087         nfs_free_seqid(calldata->arg.seqid);
1088         nfs4_put_state_owner(sp);
1089         kfree(calldata);
1090 }
1091
1092 static void nfs4_close_done(struct rpc_task *task, void *data)
1093 {
1094         struct nfs4_closedata *calldata = data;
1095         struct nfs4_state *state = calldata->state;
1096         struct nfs_server *server = NFS_SERVER(calldata->inode);
1097
1098         if (RPC_ASSASSINATED(task))
1099                 return;
1100         /* hmm. we are done with the inode, and in the process of freeing
1101          * the state_owner. we keep this around to process errors
1102          */
1103         nfs_increment_open_seqid(task->tk_status, calldata->arg.seqid);
1104         switch (task->tk_status) {
1105                 case 0:
1106                         memcpy(&state->stateid, &calldata->res.stateid,
1107                                         sizeof(state->stateid));
1108                         renew_lease(server, calldata->timestamp);
1109                         break;
1110                 case -NFS4ERR_STALE_STATEID:
1111                 case -NFS4ERR_EXPIRED:
1112                         nfs4_schedule_state_recovery(server->nfs4_state);
1113                         break;
1114                 default:
1115                         if (nfs4_async_handle_error(task, server) == -EAGAIN) {
1116                                 rpc_restart_call(task);
1117                                 return;
1118                         }
1119         }
1120         nfs_refresh_inode(calldata->inode, calldata->res.fattr);
1121 }
1122
1123 static void nfs4_close_prepare(struct rpc_task *task, void *data)
1124 {
1125         struct nfs4_closedata *calldata = data;
1126         struct nfs4_state *state = calldata->state;
1127         struct rpc_message msg = {
1128                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE],
1129                 .rpc_argp = &calldata->arg,
1130                 .rpc_resp = &calldata->res,
1131                 .rpc_cred = state->owner->so_cred,
1132         };
1133         int mode = 0, old_mode;
1134
1135         if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
1136                 return;
1137         /* Recalculate the new open mode in case someone reopened the file
1138          * while we were waiting in line to be scheduled.
1139          */
1140         spin_lock(&state->owner->so_lock);
1141         spin_lock(&calldata->inode->i_lock);
1142         mode = old_mode = state->state;
1143         if (state->n_rdwr == 0) {
1144                 if (state->n_rdonly == 0)
1145                         mode &= ~FMODE_READ;
1146                 if (state->n_wronly == 0)
1147                         mode &= ~FMODE_WRITE;
1148         }
1149         nfs4_state_set_mode_locked(state, mode);
1150         spin_unlock(&calldata->inode->i_lock);
1151         spin_unlock(&state->owner->so_lock);
1152         if (mode == old_mode || test_bit(NFS_DELEGATED_STATE, &state->flags)) {
1153                 /* Note: exit _without_ calling nfs4_close_done */
1154                 task->tk_action = NULL;
1155                 return;
1156         }
1157         nfs_fattr_init(calldata->res.fattr);
1158         if (mode != 0)
1159                 msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE];
1160         calldata->arg.open_flags = mode;
1161         calldata->timestamp = jiffies;
1162         rpc_call_setup(task, &msg, 0);
1163 }
1164
1165 static const struct rpc_call_ops nfs4_close_ops = {
1166         .rpc_call_prepare = nfs4_close_prepare,
1167         .rpc_call_done = nfs4_close_done,
1168         .rpc_release = nfs4_free_closedata,
1169 };
1170
1171 /* 
1172  * It is possible for data to be read/written from a mem-mapped file 
1173  * after the sys_close call (which hits the vfs layer as a flush).
1174  * This means that we can't safely call nfsv4 close on a file until 
1175  * the inode is cleared. This in turn means that we are not good
1176  * NFSv4 citizens - we do not indicate to the server to update the file's 
1177  * share state even when we are done with one of the three share 
1178  * stateid's in the inode.
1179  *
1180  * NOTE: Caller must be holding the sp->so_owner semaphore!
1181  */
1182 int nfs4_do_close(struct inode *inode, struct nfs4_state *state) 
1183 {
1184         struct nfs_server *server = NFS_SERVER(inode);
1185         struct nfs4_closedata *calldata;
1186         int status = -ENOMEM;
1187
1188         calldata = kmalloc(sizeof(*calldata), GFP_KERNEL);
1189         if (calldata == NULL)
1190                 goto out;
1191         calldata->inode = inode;
1192         calldata->state = state;
1193         calldata->arg.fh = NFS_FH(inode);
1194         calldata->arg.stateid = &state->stateid;
1195         /* Serialization for the sequence id */
1196         calldata->arg.seqid = nfs_alloc_seqid(&state->owner->so_seqid);
1197         if (calldata->arg.seqid == NULL)
1198                 goto out_free_calldata;
1199         calldata->arg.bitmask = server->attr_bitmask;
1200         calldata->res.fattr = &calldata->fattr;
1201         calldata->res.server = server;
1202
1203         status = nfs4_call_async(server->client, &nfs4_close_ops, calldata);
1204         if (status == 0)
1205                 goto out;
1206
1207         nfs_free_seqid(calldata->arg.seqid);
1208 out_free_calldata:
1209         kfree(calldata);
1210 out:
1211         return status;
1212 }
1213
1214 static void nfs4_intent_set_file(struct nameidata *nd, struct dentry *dentry, struct nfs4_state *state)
1215 {
1216         struct file *filp;
1217
1218         filp = lookup_instantiate_filp(nd, dentry, NULL);
1219         if (!IS_ERR(filp)) {
1220                 struct nfs_open_context *ctx;
1221                 ctx = (struct nfs_open_context *)filp->private_data;
1222                 ctx->state = state;
1223         } else
1224                 nfs4_close_state(state, nd->intent.open.flags);
1225 }
1226
1227 struct dentry *
1228 nfs4_atomic_open(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
1229 {
1230         struct iattr attr;
1231         struct rpc_cred *cred;
1232         struct nfs4_state *state;
1233         struct dentry *res;
1234
1235         if (nd->flags & LOOKUP_CREATE) {
1236                 attr.ia_mode = nd->intent.open.create_mode;
1237                 attr.ia_valid = ATTR_MODE;
1238                 if (!IS_POSIXACL(dir))
1239                         attr.ia_mode &= ~current->fs->umask;
1240         } else {
1241                 attr.ia_valid = 0;
1242                 BUG_ON(nd->intent.open.flags & O_CREAT);
1243         }
1244
1245         cred = rpcauth_lookupcred(NFS_SERVER(dir)->client->cl_auth, 0);
1246         if (IS_ERR(cred))
1247                 return (struct dentry *)cred;
1248         state = nfs4_do_open(dir, dentry, nd->intent.open.flags, &attr, cred);
1249         put_rpccred(cred);
1250         if (IS_ERR(state)) {
1251                 if (PTR_ERR(state) == -ENOENT)
1252                         d_add(dentry, NULL);
1253                 return (struct dentry *)state;
1254         }
1255         res = d_add_unique(dentry, igrab(state->inode));
1256         if (res != NULL)
1257                 dentry = res;
1258         nfs4_intent_set_file(nd, dentry, state);
1259         return res;
1260 }
1261
1262 int
1263 nfs4_open_revalidate(struct inode *dir, struct dentry *dentry, int openflags, struct nameidata *nd)
1264 {
1265         struct rpc_cred *cred;
1266         struct nfs4_state *state;
1267
1268         cred = rpcauth_lookupcred(NFS_SERVER(dir)->client->cl_auth, 0);
1269         if (IS_ERR(cred))
1270                 return PTR_ERR(cred);
1271         state = nfs4_open_delegated(dentry->d_inode, openflags, cred);
1272         if (IS_ERR(state))
1273                 state = nfs4_do_open(dir, dentry, openflags, NULL, cred);
1274         put_rpccred(cred);
1275         if (IS_ERR(state)) {
1276                 switch (PTR_ERR(state)) {
1277                         case -EPERM:
1278                         case -EACCES:
1279                         case -EDQUOT:
1280                         case -ENOSPC:
1281                         case -EROFS:
1282                                 lookup_instantiate_filp(nd, (struct dentry *)state, NULL);
1283                                 return 1;
1284                         case -ENOENT:
1285                                 if (dentry->d_inode == NULL)
1286                                         return 1;
1287                 }
1288                 goto out_drop;
1289         }
1290         if (state->inode == dentry->d_inode) {
1291                 nfs4_intent_set_file(nd, dentry, state);
1292                 return 1;
1293         }
1294         nfs4_close_state(state, openflags);
1295 out_drop:
1296         d_drop(dentry);
1297         return 0;
1298 }
1299
1300
1301 static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
1302 {
1303         struct nfs4_server_caps_res res = {};
1304         struct rpc_message msg = {
1305                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SERVER_CAPS],
1306                 .rpc_argp = fhandle,
1307                 .rpc_resp = &res,
1308         };
1309         int status;
1310
1311         status = rpc_call_sync(server->client, &msg, 0);
1312         if (status == 0) {
1313                 memcpy(server->attr_bitmask, res.attr_bitmask, sizeof(server->attr_bitmask));
1314                 if (res.attr_bitmask[0] & FATTR4_WORD0_ACL)
1315                         server->caps |= NFS_CAP_ACLS;
1316                 if (res.has_links != 0)
1317                         server->caps |= NFS_CAP_HARDLINKS;
1318                 if (res.has_symlinks != 0)
1319                         server->caps |= NFS_CAP_SYMLINKS;
1320                 server->acl_bitmask = res.acl_bitmask;
1321         }
1322         return status;
1323 }
1324
1325 static int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
1326 {
1327         struct nfs4_exception exception = { };
1328         int err;
1329         do {
1330                 err = nfs4_handle_exception(server,
1331                                 _nfs4_server_capabilities(server, fhandle),
1332                                 &exception);
1333         } while (exception.retry);
1334         return err;
1335 }
1336
1337 static int _nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
1338                 struct nfs_fsinfo *info)
1339 {
1340         struct nfs4_lookup_root_arg args = {
1341                 .bitmask = nfs4_fattr_bitmap,
1342         };
1343         struct nfs4_lookup_res res = {
1344                 .server = server,
1345                 .fattr = info->fattr,
1346                 .fh = fhandle,
1347         };
1348         struct rpc_message msg = {
1349                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP_ROOT],
1350                 .rpc_argp = &args,
1351                 .rpc_resp = &res,
1352         };
1353         nfs_fattr_init(info->fattr);
1354         return rpc_call_sync(server->client, &msg, 0);
1355 }
1356
1357 static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
1358                 struct nfs_fsinfo *info)
1359 {
1360         struct nfs4_exception exception = { };
1361         int err;
1362         do {
1363                 err = nfs4_handle_exception(server,
1364                                 _nfs4_lookup_root(server, fhandle, info),
1365                                 &exception);
1366         } while (exception.retry);
1367         return err;
1368 }
1369
1370 static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
1371                 struct nfs_fsinfo *info)
1372 {
1373         struct nfs_fattr *      fattr = info->fattr;
1374         unsigned char *         p;
1375         struct qstr             q;
1376         struct nfs4_lookup_arg args = {
1377                 .dir_fh = fhandle,
1378                 .name = &q,
1379                 .bitmask = nfs4_fattr_bitmap,
1380         };
1381         struct nfs4_lookup_res res = {
1382                 .server = server,
1383                 .fattr = fattr,
1384                 .fh = fhandle,
1385         };
1386         struct rpc_message msg = {
1387                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP],
1388                 .rpc_argp = &args,
1389                 .rpc_resp = &res,
1390         };
1391         int status;
1392
1393         /*
1394          * Now we do a separate LOOKUP for each component of the mount path.
1395          * The LOOKUPs are done separately so that we can conveniently
1396          * catch an ERR_WRONGSEC if it occurs along the way...
1397          */
1398         status = nfs4_lookup_root(server, fhandle, info);
1399         if (status)
1400                 goto out;
1401
1402         p = server->mnt_path;
1403         for (;;) {
1404                 struct nfs4_exception exception = { };
1405
1406                 while (*p == '/')
1407                         p++;
1408                 if (!*p)
1409                         break;
1410                 q.name = p;
1411                 while (*p && (*p != '/'))
1412                         p++;
1413                 q.len = p - q.name;
1414
1415                 do {
1416                         nfs_fattr_init(fattr);
1417                         status = nfs4_handle_exception(server,
1418                                         rpc_call_sync(server->client, &msg, 0),
1419                                         &exception);
1420                 } while (exception.retry);
1421                 if (status == 0)
1422                         continue;
1423                 if (status == -ENOENT) {
1424                         printk(KERN_NOTICE "NFS: mount path %s does not exist!\n", server->mnt_path);
1425                         printk(KERN_NOTICE "NFS: suggestion: try mounting '/' instead.\n");
1426                 }
1427                 break;
1428         }
1429         if (status == 0)
1430                 status = nfs4_server_capabilities(server, fhandle);
1431         if (status == 0)
1432                 status = nfs4_do_fsinfo(server, fhandle, info);
1433 out:
1434         return nfs4_map_errors(status);
1435 }
1436
1437 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
1438 {
1439         struct nfs4_getattr_arg args = {
1440                 .fh = fhandle,
1441                 .bitmask = server->attr_bitmask,
1442         };
1443         struct nfs4_getattr_res res = {
1444                 .fattr = fattr,
1445                 .server = server,
1446         };
1447         struct rpc_message msg = {
1448                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETATTR],
1449                 .rpc_argp = &args,
1450                 .rpc_resp = &res,
1451         };
1452         
1453         nfs_fattr_init(fattr);
1454         return rpc_call_sync(server->client, &msg, 0);
1455 }
1456
1457 static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
1458 {
1459         struct nfs4_exception exception = { };
1460         int err;
1461         do {
1462                 err = nfs4_handle_exception(server,
1463                                 _nfs4_proc_getattr(server, fhandle, fattr),
1464                                 &exception);
1465         } while (exception.retry);
1466         return err;
1467 }
1468
1469 /* 
1470  * The file is not closed if it is opened due to the a request to change
1471  * the size of the file. The open call will not be needed once the
1472  * VFS layer lookup-intents are implemented.
1473  *
1474  * Close is called when the inode is destroyed.
1475  * If we haven't opened the file for O_WRONLY, we
1476  * need to in the size_change case to obtain a stateid.
1477  *
1478  * Got race?
1479  * Because OPEN is always done by name in nfsv4, it is
1480  * possible that we opened a different file by the same
1481  * name.  We can recognize this race condition, but we
1482  * can't do anything about it besides returning an error.
1483  *
1484  * This will be fixed with VFS changes (lookup-intent).
1485  */
1486 static int
1487 nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
1488                   struct iattr *sattr)
1489 {
1490         struct rpc_cred *cred;
1491         struct inode *inode = dentry->d_inode;
1492         struct nfs_open_context *ctx;
1493         struct nfs4_state *state = NULL;
1494         int status;
1495
1496         nfs_fattr_init(fattr);
1497         
1498         cred = rpcauth_lookupcred(NFS_SERVER(inode)->client->cl_auth, 0);
1499         if (IS_ERR(cred))
1500                 return PTR_ERR(cred);
1501
1502         /* Search for an existing open(O_WRITE) file */
1503         ctx = nfs_find_open_context(inode, cred, FMODE_WRITE);
1504         if (ctx != NULL)
1505                 state = ctx->state;
1506
1507         status = nfs4_do_setattr(NFS_SERVER(inode), fattr,
1508                         NFS_FH(inode), sattr, state);
1509         if (status == 0)
1510                 nfs_setattr_update_inode(inode, sattr);
1511         if (ctx != NULL)
1512                 put_nfs_open_context(ctx);
1513         put_rpccred(cred);
1514         return status;
1515 }
1516
1517 static int _nfs4_proc_lookup(struct inode *dir, struct qstr *name,
1518                 struct nfs_fh *fhandle, struct nfs_fattr *fattr)
1519 {
1520         int                    status;
1521         struct nfs_server *server = NFS_SERVER(dir);
1522         struct nfs4_lookup_arg args = {
1523                 .bitmask = server->attr_bitmask,
1524                 .dir_fh = NFS_FH(dir),
1525                 .name = name,
1526         };
1527         struct nfs4_lookup_res res = {
1528                 .server = server,
1529                 .fattr = fattr,
1530                 .fh = fhandle,
1531         };
1532         struct rpc_message msg = {
1533                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP],
1534                 .rpc_argp = &args,
1535                 .rpc_resp = &res,
1536         };
1537         
1538         nfs_fattr_init(fattr);
1539         
1540         dprintk("NFS call  lookup %s\n", name->name);
1541         status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
1542         dprintk("NFS reply lookup: %d\n", status);
1543         return status;
1544 }
1545
1546 static int nfs4_proc_lookup(struct inode *dir, struct qstr *name, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
1547 {
1548         struct nfs4_exception exception = { };
1549         int err;
1550         do {
1551                 err = nfs4_handle_exception(NFS_SERVER(dir),
1552                                 _nfs4_proc_lookup(dir, name, fhandle, fattr),
1553                                 &exception);
1554         } while (exception.retry);
1555         return err;
1556 }
1557
1558 static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
1559 {
1560         struct nfs4_accessargs args = {
1561                 .fh = NFS_FH(inode),
1562         };
1563         struct nfs4_accessres res = { 0 };
1564         struct rpc_message msg = {
1565                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ACCESS],
1566                 .rpc_argp = &args,
1567                 .rpc_resp = &res,
1568                 .rpc_cred = entry->cred,
1569         };
1570         int mode = entry->mask;
1571         int status;
1572
1573         /*
1574          * Determine which access bits we want to ask for...
1575          */
1576         if (mode & MAY_READ)
1577                 args.access |= NFS4_ACCESS_READ;
1578         if (S_ISDIR(inode->i_mode)) {
1579                 if (mode & MAY_WRITE)
1580                         args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE;
1581                 if (mode & MAY_EXEC)
1582                         args.access |= NFS4_ACCESS_LOOKUP;
1583         } else {
1584                 if (mode & MAY_WRITE)
1585                         args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND;
1586                 if (mode & MAY_EXEC)
1587                         args.access |= NFS4_ACCESS_EXECUTE;
1588         }
1589         status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
1590         if (!status) {
1591                 entry->mask = 0;
1592                 if (res.access & NFS4_ACCESS_READ)
1593                         entry->mask |= MAY_READ;
1594                 if (res.access & (NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE))
1595                         entry->mask |= MAY_WRITE;
1596                 if (res.access & (NFS4_ACCESS_LOOKUP|NFS4_ACCESS_EXECUTE))
1597                         entry->mask |= MAY_EXEC;
1598         }
1599         return status;
1600 }
1601
1602 static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
1603 {
1604         struct nfs4_exception exception = { };
1605         int err;
1606         do {
1607                 err = nfs4_handle_exception(NFS_SERVER(inode),
1608                                 _nfs4_proc_access(inode, entry),
1609                                 &exception);
1610         } while (exception.retry);
1611         return err;
1612 }
1613
1614 /*
1615  * TODO: For the time being, we don't try to get any attributes
1616  * along with any of the zero-copy operations READ, READDIR,
1617  * READLINK, WRITE.
1618  *
1619  * In the case of the first three, we want to put the GETATTR
1620  * after the read-type operation -- this is because it is hard
1621  * to predict the length of a GETATTR response in v4, and thus
1622  * align the READ data correctly.  This means that the GETATTR
1623  * may end up partially falling into the page cache, and we should
1624  * shift it into the 'tail' of the xdr_buf before processing.
1625  * To do this efficiently, we need to know the total length
1626  * of data received, which doesn't seem to be available outside
1627  * of the RPC layer.
1628  *
1629  * In the case of WRITE, we also want to put the GETATTR after
1630  * the operation -- in this case because we want to make sure
1631  * we get the post-operation mtime and size.  This means that
1632  * we can't use xdr_encode_pages() as written: we need a variant
1633  * of it which would leave room in the 'tail' iovec.
1634  *
1635  * Both of these changes to the XDR layer would in fact be quite
1636  * minor, but I decided to leave them for a subsequent patch.
1637  */
1638 static int _nfs4_proc_readlink(struct inode *inode, struct page *page,
1639                 unsigned int pgbase, unsigned int pglen)
1640 {
1641         struct nfs4_readlink args = {
1642                 .fh       = NFS_FH(inode),
1643                 .pgbase   = pgbase,
1644                 .pglen    = pglen,
1645                 .pages    = &page,
1646         };
1647         struct rpc_message msg = {
1648                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READLINK],
1649                 .rpc_argp = &args,
1650                 .rpc_resp = NULL,
1651         };
1652
1653         return rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
1654 }
1655
1656 static int nfs4_proc_readlink(struct inode *inode, struct page *page,
1657                 unsigned int pgbase, unsigned int pglen)
1658 {
1659         struct nfs4_exception exception = { };
1660         int err;
1661         do {
1662                 err = nfs4_handle_exception(NFS_SERVER(inode),
1663                                 _nfs4_proc_readlink(inode, page, pgbase, pglen),
1664                                 &exception);
1665         } while (exception.retry);
1666         return err;
1667 }
1668
1669 static int _nfs4_proc_read(struct nfs_read_data *rdata)
1670 {
1671         int flags = rdata->flags;
1672         struct inode *inode = rdata->inode;
1673         struct nfs_fattr *fattr = rdata->res.fattr;
1674         struct nfs_server *server = NFS_SERVER(inode);
1675         struct rpc_message msg = {
1676                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_READ],
1677                 .rpc_argp       = &rdata->args,
1678                 .rpc_resp       = &rdata->res,
1679                 .rpc_cred       = rdata->cred,
1680         };
1681         unsigned long timestamp = jiffies;
1682         int status;
1683
1684         dprintk("NFS call  read %d @ %Ld\n", rdata->args.count,
1685                         (long long) rdata->args.offset);
1686
1687         nfs_fattr_init(fattr);
1688         status = rpc_call_sync(server->client, &msg, flags);
1689         if (!status)
1690                 renew_lease(server, timestamp);
1691         dprintk("NFS reply read: %d\n", status);
1692         return status;
1693 }
1694
1695 static int nfs4_proc_read(struct nfs_read_data *rdata)
1696 {
1697         struct nfs4_exception exception = { };
1698         int err;
1699         do {
1700                 err = nfs4_handle_exception(NFS_SERVER(rdata->inode),
1701                                 _nfs4_proc_read(rdata),
1702                                 &exception);
1703         } while (exception.retry);
1704         return err;
1705 }
1706
1707 static int _nfs4_proc_write(struct nfs_write_data *wdata)
1708 {
1709         int rpcflags = wdata->flags;
1710         struct inode *inode = wdata->inode;
1711         struct nfs_fattr *fattr = wdata->res.fattr;
1712         struct nfs_server *server = NFS_SERVER(inode);
1713         struct rpc_message msg = {
1714                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_WRITE],
1715                 .rpc_argp       = &wdata->args,
1716                 .rpc_resp       = &wdata->res,
1717                 .rpc_cred       = wdata->cred,
1718         };
1719         int status;
1720
1721         dprintk("NFS call  write %d @ %Ld\n", wdata->args.count,
1722                         (long long) wdata->args.offset);
1723
1724         wdata->args.bitmask = server->attr_bitmask;
1725         wdata->res.server = server;
1726         wdata->timestamp = jiffies;
1727         nfs_fattr_init(fattr);
1728         status = rpc_call_sync(server->client, &msg, rpcflags);
1729         dprintk("NFS reply write: %d\n", status);
1730         if (status < 0)
1731                 return status;
1732         renew_lease(server, wdata->timestamp);
1733         nfs_post_op_update_inode(inode, fattr);
1734         return wdata->res.count;
1735 }
1736
1737 static int nfs4_proc_write(struct nfs_write_data *wdata)
1738 {
1739         struct nfs4_exception exception = { };
1740         int err;
1741         do {
1742                 err = nfs4_handle_exception(NFS_SERVER(wdata->inode),
1743                                 _nfs4_proc_write(wdata),
1744                                 &exception);
1745         } while (exception.retry);
1746         return err;
1747 }
1748
1749 static int _nfs4_proc_commit(struct nfs_write_data *cdata)
1750 {
1751         struct inode *inode = cdata->inode;
1752         struct nfs_fattr *fattr = cdata->res.fattr;
1753         struct nfs_server *server = NFS_SERVER(inode);
1754         struct rpc_message msg = {
1755                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_COMMIT],
1756                 .rpc_argp       = &cdata->args,
1757                 .rpc_resp       = &cdata->res,
1758                 .rpc_cred       = cdata->cred,
1759         };
1760         int status;
1761
1762         dprintk("NFS call  commit %d @ %Ld\n", cdata->args.count,
1763                         (long long) cdata->args.offset);
1764
1765         cdata->args.bitmask = server->attr_bitmask;
1766         cdata->res.server = server;
1767         cdata->timestamp = jiffies;
1768         nfs_fattr_init(fattr);
1769         status = rpc_call_sync(server->client, &msg, 0);
1770         if (status >= 0)
1771                 renew_lease(server, cdata->timestamp);
1772         dprintk("NFS reply commit: %d\n", status);
1773         if (status >= 0)
1774                 nfs_post_op_update_inode(inode, fattr);
1775         return status;
1776 }
1777
1778 static int nfs4_proc_commit(struct nfs_write_data *cdata)
1779 {
1780         struct nfs4_exception exception = { };
1781         int err;
1782         do {
1783                 err = nfs4_handle_exception(NFS_SERVER(cdata->inode),
1784                                 _nfs4_proc_commit(cdata),
1785                                 &exception);
1786         } while (exception.retry);
1787         return err;
1788 }
1789
1790 /*
1791  * Got race?
1792  * We will need to arrange for the VFS layer to provide an atomic open.
1793  * Until then, this create/open method is prone to inefficiency and race
1794  * conditions due to the lookup, create, and open VFS calls from sys_open()
1795  * placed on the wire.
1796  *
1797  * Given the above sorry state of affairs, I'm simply sending an OPEN.
1798  * The file will be opened again in the subsequent VFS open call
1799  * (nfs4_proc_file_open).
1800  *
1801  * The open for read will just hang around to be used by any process that
1802  * opens the file O_RDONLY. This will all be resolved with the VFS changes.
1803  */
1804
1805 static int
1806 nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
1807                  int flags, struct nameidata *nd)
1808 {
1809         struct nfs4_state *state;
1810         struct rpc_cred *cred;
1811         int status = 0;
1812
1813         cred = rpcauth_lookupcred(NFS_SERVER(dir)->client->cl_auth, 0);
1814         if (IS_ERR(cred)) {
1815                 status = PTR_ERR(cred);
1816                 goto out;
1817         }
1818         state = nfs4_do_open(dir, dentry, flags, sattr, cred);
1819         put_rpccred(cred);
1820         if (IS_ERR(state)) {
1821                 status = PTR_ERR(state);
1822                 goto out;
1823         }
1824         d_instantiate(dentry, igrab(state->inode));
1825         if (flags & O_EXCL) {
1826                 struct nfs_fattr fattr;
1827                 status = nfs4_do_setattr(NFS_SERVER(dir), &fattr,
1828                                      NFS_FH(state->inode), sattr, state);
1829                 if (status == 0)
1830                         nfs_setattr_update_inode(state->inode, sattr);
1831         }
1832         if (status == 0 && nd != NULL && (nd->flags & LOOKUP_OPEN))
1833                 nfs4_intent_set_file(nd, dentry, state);
1834         else
1835                 nfs4_close_state(state, flags);
1836 out:
1837         return status;
1838 }
1839
1840 static int _nfs4_proc_remove(struct inode *dir, struct qstr *name)
1841 {
1842         struct nfs_server *server = NFS_SERVER(dir);
1843         struct nfs4_remove_arg args = {
1844                 .fh = NFS_FH(dir),
1845                 .name = name,
1846                 .bitmask = server->attr_bitmask,
1847         };
1848         struct nfs_fattr dir_attr;
1849         struct nfs4_remove_res  res = {
1850                 .server = server,
1851                 .dir_attr = &dir_attr,
1852         };
1853         struct rpc_message msg = {
1854                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_REMOVE],
1855                 .rpc_argp       = &args,
1856                 .rpc_resp       = &res,
1857         };
1858         int                     status;
1859
1860         nfs_fattr_init(res.dir_attr);
1861         status = rpc_call_sync(server->client, &msg, 0);
1862         if (status == 0) {
1863                 update_changeattr(dir, &res.cinfo);
1864                 nfs_post_op_update_inode(dir, res.dir_attr);
1865         }
1866         return status;
1867 }
1868
1869 static int nfs4_proc_remove(struct inode *dir, struct qstr *name)
1870 {
1871         struct nfs4_exception exception = { };
1872         int err;
1873         do {
1874                 err = nfs4_handle_exception(NFS_SERVER(dir),
1875                                 _nfs4_proc_remove(dir, name),
1876                                 &exception);
1877         } while (exception.retry);
1878         return err;
1879 }
1880
1881 struct unlink_desc {
1882         struct nfs4_remove_arg  args;
1883         struct nfs4_remove_res  res;
1884         struct nfs_fattr dir_attr;
1885 };
1886
1887 static int nfs4_proc_unlink_setup(struct rpc_message *msg, struct dentry *dir,
1888                 struct qstr *name)
1889 {
1890         struct nfs_server *server = NFS_SERVER(dir->d_inode);
1891         struct unlink_desc *up;
1892
1893         up = (struct unlink_desc *) kmalloc(sizeof(*up), GFP_KERNEL);
1894         if (!up)
1895                 return -ENOMEM;
1896         
1897         up->args.fh = NFS_FH(dir->d_inode);
1898         up->args.name = name;
1899         up->args.bitmask = server->attr_bitmask;
1900         up->res.server = server;
1901         up->res.dir_attr = &up->dir_attr;
1902         
1903         msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE];
1904         msg->rpc_argp = &up->args;
1905         msg->rpc_resp = &up->res;
1906         return 0;
1907 }
1908
1909 static int nfs4_proc_unlink_done(struct dentry *dir, struct rpc_task *task)
1910 {
1911         struct rpc_message *msg = &task->tk_msg;
1912         struct unlink_desc *up;
1913         
1914         if (msg->rpc_resp != NULL) {
1915                 up = container_of(msg->rpc_resp, struct unlink_desc, res);
1916                 update_changeattr(dir->d_inode, &up->res.cinfo);
1917                 nfs_post_op_update_inode(dir->d_inode, up->res.dir_attr);
1918                 kfree(up);
1919                 msg->rpc_resp = NULL;
1920                 msg->rpc_argp = NULL;
1921         }
1922         return 0;
1923 }
1924
1925 static int _nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name,
1926                 struct inode *new_dir, struct qstr *new_name)
1927 {
1928         struct nfs_server *server = NFS_SERVER(old_dir);
1929         struct nfs4_rename_arg arg = {
1930                 .old_dir = NFS_FH(old_dir),
1931                 .new_dir = NFS_FH(new_dir),
1932                 .old_name = old_name,
1933                 .new_name = new_name,
1934                 .bitmask = server->attr_bitmask,
1935         };
1936         struct nfs_fattr old_fattr, new_fattr;
1937         struct nfs4_rename_res res = {
1938                 .server = server,
1939                 .old_fattr = &old_fattr,
1940                 .new_fattr = &new_fattr,
1941         };
1942         struct rpc_message msg = {
1943                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENAME],
1944                 .rpc_argp = &arg,
1945                 .rpc_resp = &res,
1946         };
1947         int                     status;
1948         
1949         nfs_fattr_init(res.old_fattr);
1950         nfs_fattr_init(res.new_fattr);
1951         status = rpc_call_sync(server->client, &msg, 0);
1952
1953         if (!status) {
1954                 update_changeattr(old_dir, &res.old_cinfo);
1955                 nfs_post_op_update_inode(old_dir, res.old_fattr);
1956                 update_changeattr(new_dir, &res.new_cinfo);
1957                 nfs_post_op_update_inode(new_dir, res.new_fattr);
1958         }
1959         return status;
1960 }
1961
1962 static int nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name,
1963                 struct inode *new_dir, struct qstr *new_name)
1964 {
1965         struct nfs4_exception exception = { };
1966         int err;
1967         do {
1968                 err = nfs4_handle_exception(NFS_SERVER(old_dir),
1969                                 _nfs4_proc_rename(old_dir, old_name,
1970                                         new_dir, new_name),
1971                                 &exception);
1972         } while (exception.retry);
1973         return err;
1974 }
1975
1976 static int _nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
1977 {
1978         struct nfs_server *server = NFS_SERVER(inode);
1979         struct nfs4_link_arg arg = {
1980                 .fh     = NFS_FH(inode),
1981                 .dir_fh = NFS_FH(dir),
1982                 .name   = name,
1983                 .bitmask = server->attr_bitmask,
1984         };
1985         struct nfs_fattr fattr, dir_attr;
1986         struct nfs4_link_res res = {
1987                 .server = server,
1988                 .fattr = &fattr,
1989                 .dir_attr = &dir_attr,
1990         };
1991         struct rpc_message msg = {
1992                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LINK],
1993                 .rpc_argp = &arg,
1994                 .rpc_resp = &res,
1995         };
1996         int                     status;
1997
1998         nfs_fattr_init(res.fattr);
1999         nfs_fattr_init(res.dir_attr);
2000         status = rpc_call_sync(server->client, &msg, 0);
2001         if (!status) {
2002                 update_changeattr(dir, &res.cinfo);
2003                 nfs_post_op_update_inode(dir, res.dir_attr);
2004                 nfs_refresh_inode(inode, res.fattr);
2005         }
2006
2007         return status;
2008 }
2009
2010 static int nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
2011 {
2012         struct nfs4_exception exception = { };
2013         int err;
2014         do {
2015                 err = nfs4_handle_exception(NFS_SERVER(inode),
2016                                 _nfs4_proc_link(inode, dir, name),
2017                                 &exception);
2018         } while (exception.retry);
2019         return err;
2020 }
2021
2022 static int _nfs4_proc_symlink(struct inode *dir, struct qstr *name,
2023                 struct qstr *path, struct iattr *sattr, struct nfs_fh *fhandle,
2024                 struct nfs_fattr *fattr)
2025 {
2026         struct nfs_server *server = NFS_SERVER(dir);
2027         struct nfs_fattr dir_fattr;
2028         struct nfs4_create_arg arg = {
2029                 .dir_fh = NFS_FH(dir),
2030                 .server = server,
2031                 .name = name,
2032                 .attrs = sattr,
2033                 .ftype = NF4LNK,
2034                 .bitmask = server->attr_bitmask,
2035         };
2036         struct nfs4_create_res res = {
2037                 .server = server,
2038                 .fh = fhandle,
2039                 .fattr = fattr,
2040                 .dir_fattr = &dir_fattr,
2041         };
2042         struct rpc_message msg = {
2043                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SYMLINK],
2044                 .rpc_argp = &arg,
2045                 .rpc_resp = &res,
2046         };
2047         int                     status;
2048
2049         if (path->len > NFS4_MAXPATHLEN)
2050                 return -ENAMETOOLONG;
2051         arg.u.symlink = path;
2052         nfs_fattr_init(fattr);
2053         nfs_fattr_init(&dir_fattr);
2054         
2055         status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
2056         if (!status)
2057                 update_changeattr(dir, &res.dir_cinfo);
2058         nfs_post_op_update_inode(dir, res.dir_fattr);
2059         return status;
2060 }
2061
2062 static int nfs4_proc_symlink(struct inode *dir, struct qstr *name,
2063                 struct qstr *path, struct iattr *sattr, struct nfs_fh *fhandle,
2064                 struct nfs_fattr *fattr)
2065 {
2066         struct nfs4_exception exception = { };
2067         int err;
2068         do {
2069                 err = nfs4_handle_exception(NFS_SERVER(dir),
2070                                 _nfs4_proc_symlink(dir, name, path, sattr,
2071                                         fhandle, fattr),
2072                                 &exception);
2073         } while (exception.retry);
2074         return err;
2075 }
2076
2077 static int _nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
2078                 struct iattr *sattr)
2079 {
2080         struct nfs_server *server = NFS_SERVER(dir);
2081         struct nfs_fh fhandle;
2082         struct nfs_fattr fattr, dir_fattr;
2083         struct nfs4_create_arg arg = {
2084                 .dir_fh = NFS_FH(dir),
2085                 .server = server,
2086                 .name = &dentry->d_name,
2087                 .attrs = sattr,
2088                 .ftype = NF4DIR,
2089                 .bitmask = server->attr_bitmask,
2090         };
2091         struct nfs4_create_res res = {
2092                 .server = server,
2093                 .fh = &fhandle,
2094                 .fattr = &fattr,
2095                 .dir_fattr = &dir_fattr,
2096         };
2097         struct rpc_message msg = {
2098                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE],
2099                 .rpc_argp = &arg,
2100                 .rpc_resp = &res,
2101         };
2102         int                     status;
2103
2104         nfs_fattr_init(&fattr);
2105         nfs_fattr_init(&dir_fattr);
2106         
2107         status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
2108         if (!status) {
2109                 update_changeattr(dir, &res.dir_cinfo);
2110                 nfs_post_op_update_inode(dir, res.dir_fattr);
2111                 status = nfs_instantiate(dentry, &fhandle, &fattr);
2112         }
2113         return status;
2114 }
2115
2116 static int nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
2117                 struct iattr *sattr)
2118 {
2119         struct nfs4_exception exception = { };
2120         int err;
2121         do {
2122                 err = nfs4_handle_exception(NFS_SERVER(dir),
2123                                 _nfs4_proc_mkdir(dir, dentry, sattr),
2124                                 &exception);
2125         } while (exception.retry);
2126         return err;
2127 }
2128
2129 static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
2130                   u64 cookie, struct page *page, unsigned int count, int plus)
2131 {
2132         struct inode            *dir = dentry->d_inode;
2133         struct nfs4_readdir_arg args = {
2134                 .fh = NFS_FH(dir),
2135                 .pages = &page,
2136                 .pgbase = 0,
2137                 .count = count,
2138                 .bitmask = NFS_SERVER(dentry->d_inode)->attr_bitmask,
2139         };
2140         struct nfs4_readdir_res res;
2141         struct rpc_message msg = {
2142                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR],
2143                 .rpc_argp = &args,
2144                 .rpc_resp = &res,
2145                 .rpc_cred = cred,
2146         };
2147         int                     status;
2148
2149         dprintk("%s: dentry = %s/%s, cookie = %Lu\n", __FUNCTION__,
2150                         dentry->d_parent->d_name.name,
2151                         dentry->d_name.name,
2152                         (unsigned long long)cookie);
2153         lock_kernel();
2154         nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args);
2155         res.pgbase = args.pgbase;
2156         status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
2157         if (status == 0)
2158                 memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE);
2159         unlock_kernel();
2160         dprintk("%s: returns %d\n", __FUNCTION__, status);
2161         return status;
2162 }
2163
2164 static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
2165                   u64 cookie, struct page *page, unsigned int count, int plus)
2166 {
2167         struct nfs4_exception exception = { };
2168         int err;
2169         do {
2170                 err = nfs4_handle_exception(NFS_SERVER(dentry->d_inode),
2171                                 _nfs4_proc_readdir(dentry, cred, cookie,
2172                                         page, count, plus),
2173                                 &exception);
2174         } while (exception.retry);
2175         return err;
2176 }
2177
2178 static int _nfs4_proc_mknod(struct inode *dir, struct dentry *dentry,
2179                 struct iattr *sattr, dev_t rdev)
2180 {
2181         struct nfs_server *server = NFS_SERVER(dir);
2182         struct nfs_fh fh;
2183         struct nfs_fattr fattr, dir_fattr;
2184         struct nfs4_create_arg arg = {
2185                 .dir_fh = NFS_FH(dir),
2186                 .server = server,
2187                 .name = &dentry->d_name,
2188                 .attrs = sattr,
2189                 .bitmask = server->attr_bitmask,
2190         };
2191         struct nfs4_create_res res = {
2192                 .server = server,
2193                 .fh = &fh,
2194                 .fattr = &fattr,
2195                 .dir_fattr = &dir_fattr,
2196         };
2197         struct rpc_message msg = {
2198                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE],
2199                 .rpc_argp = &arg,
2200                 .rpc_resp = &res,
2201         };
2202         int                     status;
2203         int                     mode = sattr->ia_mode;
2204
2205         nfs_fattr_init(&fattr);
2206         nfs_fattr_init(&dir_fattr);
2207
2208         BUG_ON(!(sattr->ia_valid & ATTR_MODE));
2209         BUG_ON(!S_ISFIFO(mode) && !S_ISBLK(mode) && !S_ISCHR(mode) && !S_ISSOCK(mode));
2210         if (S_ISFIFO(mode))
2211                 arg.ftype = NF4FIFO;
2212         else if (S_ISBLK(mode)) {
2213                 arg.ftype = NF4BLK;
2214                 arg.u.device.specdata1 = MAJOR(rdev);
2215                 arg.u.device.specdata2 = MINOR(rdev);
2216         }
2217         else if (S_ISCHR(mode)) {
2218                 arg.ftype = NF4CHR;
2219                 arg.u.device.specdata1 = MAJOR(rdev);
2220                 arg.u.device.specdata2 = MINOR(rdev);
2221         }
2222         else
2223                 arg.ftype = NF4SOCK;
2224         
2225         status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
2226         if (status == 0) {
2227                 update_changeattr(dir, &res.dir_cinfo);
2228                 nfs_post_op_update_inode(dir, res.dir_fattr);
2229                 status = nfs_instantiate(dentry, &fh, &fattr);
2230         }
2231         return status;
2232 }
2233
2234 static int nfs4_proc_mknod(struct inode *dir, struct dentry *dentry,
2235                 struct iattr *sattr, dev_t rdev)
2236 {
2237         struct nfs4_exception exception = { };
2238         int err;
2239         do {
2240                 err = nfs4_handle_exception(NFS_SERVER(dir),
2241                                 _nfs4_proc_mknod(dir, dentry, sattr, rdev),
2242                                 &exception);
2243         } while (exception.retry);
2244         return err;
2245 }
2246
2247 static int _nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
2248                  struct nfs_fsstat *fsstat)
2249 {
2250         struct nfs4_statfs_arg args = {
2251                 .fh = fhandle,
2252                 .bitmask = server->attr_bitmask,
2253         };
2254         struct rpc_message msg = {
2255                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_STATFS],
2256                 .rpc_argp = &args,
2257                 .rpc_resp = fsstat,
2258         };
2259
2260         nfs_fattr_init(fsstat->fattr);
2261         return rpc_call_sync(server->client, &msg, 0);
2262 }
2263
2264 static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat)
2265 {
2266         struct nfs4_exception exception = { };
2267         int err;
2268         do {
2269                 err = nfs4_handle_exception(server,
2270                                 _nfs4_proc_statfs(server, fhandle, fsstat),
2271                                 &exception);
2272         } while (exception.retry);
2273         return err;
2274 }
2275
2276 static int _nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
2277                 struct nfs_fsinfo *fsinfo)
2278 {
2279         struct nfs4_fsinfo_arg args = {
2280                 .fh = fhandle,
2281                 .bitmask = server->attr_bitmask,
2282         };
2283         struct rpc_message msg = {
2284                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSINFO],
2285                 .rpc_argp = &args,
2286                 .rpc_resp = fsinfo,
2287         };
2288
2289         return rpc_call_sync(server->client, &msg, 0);
2290 }
2291
2292 static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
2293 {
2294         struct nfs4_exception exception = { };
2295         int err;
2296
2297         do {
2298                 err = nfs4_handle_exception(server,
2299                                 _nfs4_do_fsinfo(server, fhandle, fsinfo),
2300                                 &exception);
2301         } while (exception.retry);
2302         return err;
2303 }
2304
2305 static int nfs4_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
2306 {
2307         nfs_fattr_init(fsinfo->fattr);
2308         return nfs4_do_fsinfo(server, fhandle, fsinfo);
2309 }
2310
2311 static int _nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
2312                 struct nfs_pathconf *pathconf)
2313 {
2314         struct nfs4_pathconf_arg args = {
2315                 .fh = fhandle,
2316                 .bitmask = server->attr_bitmask,
2317         };
2318         struct rpc_message msg = {
2319                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_PATHCONF],
2320                 .rpc_argp = &args,
2321                 .rpc_resp = pathconf,
2322         };
2323
2324         /* None of the pathconf attributes are mandatory to implement */
2325         if ((args.bitmask[0] & nfs4_pathconf_bitmap[0]) == 0) {
2326                 memset(pathconf, 0, sizeof(*pathconf));
2327                 return 0;
2328         }
2329
2330         nfs_fattr_init(pathconf->fattr);
2331         return rpc_call_sync(server->client, &msg, 0);
2332 }
2333
2334 static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
2335                 struct nfs_pathconf *pathconf)
2336 {
2337         struct nfs4_exception exception = { };
2338         int err;
2339
2340         do {
2341                 err = nfs4_handle_exception(server,
2342                                 _nfs4_proc_pathconf(server, fhandle, pathconf),
2343                                 &exception);
2344         } while (exception.retry);
2345         return err;
2346 }
2347
2348 static void nfs4_read_done(struct rpc_task *task, void *calldata)
2349 {
2350         struct nfs_read_data *data = calldata;
2351         struct inode *inode = data->inode;
2352
2353         if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) {
2354                 rpc_restart_call(task);
2355                 return;
2356         }
2357         if (task->tk_status > 0)
2358                 renew_lease(NFS_SERVER(inode), data->timestamp);
2359         /* Call back common NFS readpage processing */
2360         nfs_readpage_result(task, calldata);
2361 }
2362
2363 static const struct rpc_call_ops nfs4_read_ops = {
2364         .rpc_call_done = nfs4_read_done,
2365         .rpc_release = nfs_readdata_release,
2366 };
2367
2368 static void
2369 nfs4_proc_read_setup(struct nfs_read_data *data)
2370 {
2371         struct rpc_task *task = &data->task;
2372         struct rpc_message msg = {
2373                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ],
2374                 .rpc_argp = &data->args,
2375                 .rpc_resp = &data->res,
2376                 .rpc_cred = data->cred,
2377         };
2378         struct inode *inode = data->inode;
2379         int flags;
2380
2381         data->timestamp   = jiffies;
2382
2383         /* N.B. Do we need to test? Never called for swapfile inode */
2384         flags = RPC_TASK_ASYNC | (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0);
2385
2386         /* Finalize the task. */
2387         rpc_init_task(task, NFS_CLIENT(inode), flags, &nfs4_read_ops, data);
2388         rpc_call_setup(task, &msg, 0);
2389 }
2390
2391 static void nfs4_write_done(struct rpc_task *task, void *calldata)
2392 {
2393         struct nfs_write_data *data = calldata;
2394         struct inode *inode = data->inode;
2395         
2396         if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) {
2397                 rpc_restart_call(task);
2398                 return;
2399         }
2400         if (task->tk_status >= 0) {
2401                 renew_lease(NFS_SERVER(inode), data->timestamp);
2402                 nfs_post_op_update_inode(inode, data->res.fattr);
2403         }
2404         /* Call back common NFS writeback processing */
2405         nfs_writeback_done(task, calldata);
2406 }
2407
2408 static const struct rpc_call_ops nfs4_write_ops = {
2409         .rpc_call_done = nfs4_write_done,
2410         .rpc_release = nfs_writedata_release,
2411 };
2412
2413 static void
2414 nfs4_proc_write_setup(struct nfs_write_data *data, int how)
2415 {
2416         struct rpc_task *task = &data->task;
2417         struct rpc_message msg = {
2418                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE],
2419                 .rpc_argp = &data->args,
2420                 .rpc_resp = &data->res,
2421                 .rpc_cred = data->cred,
2422         };
2423         struct inode *inode = data->inode;
2424         struct nfs_server *server = NFS_SERVER(inode);
2425         int stable;
2426         int flags;
2427         
2428         if (how & FLUSH_STABLE) {
2429                 if (!NFS_I(inode)->ncommit)
2430                         stable = NFS_FILE_SYNC;
2431                 else
2432                         stable = NFS_DATA_SYNC;
2433         } else
2434                 stable = NFS_UNSTABLE;
2435         data->args.stable = stable;
2436         data->args.bitmask = server->attr_bitmask;
2437         data->res.server = server;
2438
2439         data->timestamp   = jiffies;
2440
2441         /* Set the initial flags for the task.  */
2442         flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;
2443
2444         /* Finalize the task. */
2445         rpc_init_task(task, NFS_CLIENT(inode), flags, &nfs4_write_ops, data);
2446         rpc_call_setup(task, &msg, 0);
2447 }
2448
2449 static void nfs4_commit_done(struct rpc_task *task, void *calldata)
2450 {
2451         struct nfs_write_data *data = calldata;
2452         struct inode *inode = data->inode;
2453         
2454         if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) {
2455                 rpc_restart_call(task);
2456                 return;
2457         }
2458         if (task->tk_status >= 0)
2459                 nfs_post_op_update_inode(inode, data->res.fattr);
2460         /* Call back common NFS writeback processing */
2461         nfs_commit_done(task, calldata);
2462 }
2463
2464 static const struct rpc_call_ops nfs4_commit_ops = {
2465         .rpc_call_done = nfs4_commit_done,
2466         .rpc_release = nfs_commit_release,
2467 };
2468
2469 static void
2470 nfs4_proc_commit_setup(struct nfs_write_data *data, int how)
2471 {
2472         struct rpc_task *task = &data->task;
2473         struct rpc_message msg = {
2474                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT],
2475                 .rpc_argp = &data->args,
2476                 .rpc_resp = &data->res,
2477                 .rpc_cred = data->cred,
2478         };      
2479         struct inode *inode = data->inode;
2480         struct nfs_server *server = NFS_SERVER(inode);
2481         int flags;
2482         
2483         data->args.bitmask = server->attr_bitmask;
2484         data->res.server = server;
2485
2486         /* Set the initial flags for the task.  */
2487         flags = (how & FLUSH_SYNC) ? 0 : RPC_TASK_ASYNC;
2488
2489         /* Finalize the task. */
2490         rpc_init_task(task, NFS_CLIENT(inode), flags, &nfs4_commit_ops, data);
2491         rpc_call_setup(task, &msg, 0);  
2492 }
2493
2494 /*
2495  * nfs4_proc_async_renew(): This is not one of the nfs_rpc_ops; it is a special
2496  * standalone procedure for queueing an asynchronous RENEW.
2497  */
2498 static void nfs4_renew_done(struct rpc_task *task, void *data)
2499 {
2500         struct nfs4_client *clp = (struct nfs4_client *)task->tk_msg.rpc_argp;
2501         unsigned long timestamp = (unsigned long)data;
2502
2503         if (task->tk_status < 0) {
2504                 switch (task->tk_status) {
2505                         case -NFS4ERR_STALE_CLIENTID:
2506                         case -NFS4ERR_EXPIRED:
2507                         case -NFS4ERR_CB_PATH_DOWN:
2508                                 nfs4_schedule_state_recovery(clp);
2509                 }
2510                 return;
2511         }
2512         spin_lock(&clp->cl_lock);
2513         if (time_before(clp->cl_last_renewal,timestamp))
2514                 clp->cl_last_renewal = timestamp;
2515         spin_unlock(&clp->cl_lock);
2516 }
2517
2518 static const struct rpc_call_ops nfs4_renew_ops = {
2519         .rpc_call_done = nfs4_renew_done,
2520 };
2521
2522 int nfs4_proc_async_renew(struct nfs4_client *clp, struct rpc_cred *cred)
2523 {
2524         struct rpc_message msg = {
2525                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
2526                 .rpc_argp       = clp,
2527                 .rpc_cred       = cred,
2528         };
2529
2530         return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT,
2531                         &nfs4_renew_ops, (void *)jiffies);
2532 }
2533
2534 int nfs4_proc_renew(struct nfs4_client *clp, struct rpc_cred *cred)
2535 {
2536         struct rpc_message msg = {
2537                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
2538                 .rpc_argp       = clp,
2539                 .rpc_cred       = cred,
2540         };
2541         unsigned long now = jiffies;
2542         int status;
2543
2544         status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
2545         if (status < 0)
2546                 return status;
2547         spin_lock(&clp->cl_lock);
2548         if (time_before(clp->cl_last_renewal,now))
2549                 clp->cl_last_renewal = now;
2550         spin_unlock(&clp->cl_lock);
2551         return 0;
2552 }
2553
2554 static inline int nfs4_server_supports_acls(struct nfs_server *server)
2555 {
2556         return (server->caps & NFS_CAP_ACLS)
2557                 && (server->acl_bitmask & ACL4_SUPPORT_ALLOW_ACL)
2558                 && (server->acl_bitmask & ACL4_SUPPORT_DENY_ACL);
2559 }
2560
2561 /* Assuming that XATTR_SIZE_MAX is a multiple of PAGE_CACHE_SIZE, and that
2562  * it's OK to put sizeof(void) * (XATTR_SIZE_MAX/PAGE_CACHE_SIZE) bytes on
2563  * the stack.
2564  */
2565 #define NFS4ACL_MAXPAGES (XATTR_SIZE_MAX >> PAGE_CACHE_SHIFT)
2566
2567 static void buf_to_pages(const void *buf, size_t buflen,
2568                 struct page **pages, unsigned int *pgbase)
2569 {
2570         const void *p = buf;
2571
2572         *pgbase = offset_in_page(buf);
2573         p -= *pgbase;
2574         while (p < buf + buflen) {
2575                 *(pages++) = virt_to_page(p);
2576                 p += PAGE_CACHE_SIZE;
2577         }
2578 }
2579
2580 struct nfs4_cached_acl {
2581         int cached;
2582         size_t len;
2583         char data[0];
2584 };
2585
2586 static void nfs4_set_cached_acl(struct inode *inode, struct nfs4_cached_acl *acl)
2587 {
2588         struct nfs_inode *nfsi = NFS_I(inode);
2589
2590         spin_lock(&inode->i_lock);
2591         kfree(nfsi->nfs4_acl);
2592         nfsi->nfs4_acl = acl;
2593         spin_unlock(&inode->i_lock);
2594 }
2595
2596 static void nfs4_zap_acl_attr(struct inode *inode)
2597 {
2598         nfs4_set_cached_acl(inode, NULL);
2599 }
2600
2601 static inline ssize_t nfs4_read_cached_acl(struct inode *inode, char *buf, size_t buflen)
2602 {
2603         struct nfs_inode *nfsi = NFS_I(inode);
2604         struct nfs4_cached_acl *acl;
2605         int ret = -ENOENT;
2606
2607         spin_lock(&inode->i_lock);
2608         acl = nfsi->nfs4_acl;
2609         if (acl == NULL)
2610                 goto out;
2611         if (buf == NULL) /* user is just asking for length */
2612                 goto out_len;
2613         if (acl->cached == 0)
2614                 goto out;
2615         ret = -ERANGE; /* see getxattr(2) man page */
2616         if (acl->len > buflen)
2617                 goto out;
2618         memcpy(buf, acl->data, acl->len);
2619 out_len:
2620         ret = acl->len;
2621 out:
2622         spin_unlock(&inode->i_lock);
2623         return ret;
2624 }
2625
2626 static void nfs4_write_cached_acl(struct inode *inode, const char *buf, size_t acl_len)
2627 {
2628         struct nfs4_cached_acl *acl;
2629
2630         if (buf && acl_len <= PAGE_SIZE) {
2631                 acl = kmalloc(sizeof(*acl) + acl_len, GFP_KERNEL);
2632                 if (acl == NULL)
2633                         goto out;
2634                 acl->cached = 1;
2635                 memcpy(acl->data, buf, acl_len);
2636         } else {
2637                 acl = kmalloc(sizeof(*acl), GFP_KERNEL);
2638                 if (acl == NULL)
2639                         goto out;
2640                 acl->cached = 0;
2641         }
2642         acl->len = acl_len;
2643 out:
2644         nfs4_set_cached_acl(inode, acl);
2645 }
2646
2647 static inline ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
2648 {
2649         struct page *pages[NFS4ACL_MAXPAGES];
2650         struct nfs_getaclargs args = {
2651                 .fh = NFS_FH(inode),
2652                 .acl_pages = pages,
2653                 .acl_len = buflen,
2654         };
2655         size_t resp_len = buflen;
2656         void *resp_buf;
2657         struct rpc_message msg = {
2658                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETACL],
2659                 .rpc_argp = &args,
2660                 .rpc_resp = &resp_len,
2661         };
2662         struct page *localpage = NULL;
2663         int ret;
2664
2665         if (buflen < PAGE_SIZE) {
2666                 /* As long as we're doing a round trip to the server anyway,
2667                  * let's be prepared for a page of acl data. */
2668                 localpage = alloc_page(GFP_KERNEL);
2669                 resp_buf = page_address(localpage);
2670                 if (localpage == NULL)
2671                         return -ENOMEM;
2672                 args.acl_pages[0] = localpage;
2673                 args.acl_pgbase = 0;
2674                 resp_len = args.acl_len = PAGE_SIZE;
2675         } else {
2676                 resp_buf = buf;
2677                 buf_to_pages(buf, buflen, args.acl_pages, &args.acl_pgbase);
2678         }
2679         ret = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
2680         if (ret)
2681                 goto out_free;
2682         if (resp_len > args.acl_len)
2683                 nfs4_write_cached_acl(inode, NULL, resp_len);
2684         else
2685                 nfs4_write_cached_acl(inode, resp_buf, resp_len);
2686         if (buf) {
2687                 ret = -ERANGE;
2688                 if (resp_len > buflen)
2689                         goto out_free;
2690                 if (localpage)
2691                         memcpy(buf, resp_buf, resp_len);
2692         }
2693         ret = resp_len;
2694 out_free:
2695         if (localpage)
2696                 __free_page(localpage);
2697         return ret;
2698 }
2699
2700 static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen)
2701 {
2702         struct nfs_server *server = NFS_SERVER(inode);
2703         int ret;
2704
2705         if (!nfs4_server_supports_acls(server))
2706                 return -EOPNOTSUPP;
2707         ret = nfs_revalidate_inode(server, inode);
2708         if (ret < 0)
2709                 return ret;
2710         ret = nfs4_read_cached_acl(inode, buf, buflen);
2711         if (ret != -ENOENT)
2712                 return ret;
2713         return nfs4_get_acl_uncached(inode, buf, buflen);
2714 }
2715
2716 static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen)
2717 {
2718         struct nfs_server *server = NFS_SERVER(inode);
2719         struct page *pages[NFS4ACL_MAXPAGES];
2720         struct nfs_setaclargs arg = {
2721                 .fh             = NFS_FH(inode),
2722                 .acl_pages      = pages,
2723                 .acl_len        = buflen,
2724         };
2725         struct rpc_message msg = {
2726                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_SETACL],
2727                 .rpc_argp       = &arg,
2728                 .rpc_resp       = NULL,
2729         };
2730         int ret;
2731
2732         if (!nfs4_server_supports_acls(server))
2733                 return -EOPNOTSUPP;
2734         nfs_inode_return_delegation(inode);
2735         buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase);
2736         ret = rpc_call_sync(NFS_SERVER(inode)->client, &msg, 0);
2737         if (ret == 0)
2738                 nfs4_write_cached_acl(inode, buf, buflen);
2739         return ret;
2740 }
2741
2742 static int
2743 nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server)
2744 {
2745         struct nfs4_client *clp = server->nfs4_state;
2746
2747         if (!clp || task->tk_status >= 0)
2748                 return 0;
2749         switch(task->tk_status) {
2750                 case -NFS4ERR_STALE_CLIENTID:
2751                 case -NFS4ERR_STALE_STATEID:
2752                 case -NFS4ERR_EXPIRED:
2753                         rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL, NULL);
2754                         nfs4_schedule_state_recovery(clp);
2755                         if (test_bit(NFS4CLNT_STATE_RECOVER, &clp->cl_state) == 0)
2756                                 rpc_wake_up_task(task);
2757                         task->tk_status = 0;
2758                         return -EAGAIN;
2759                 case -NFS4ERR_DELAY:
2760                         nfs_inc_server_stats((struct nfs_server *) server,
2761                                                 NFSIOS_DELAY);
2762                 case -NFS4ERR_GRACE:
2763                         rpc_delay(task, NFS4_POLL_RETRY_MAX);
2764                         task->tk_status = 0;
2765                         return -EAGAIN;
2766                 case -NFS4ERR_OLD_STATEID:
2767                         task->tk_status = 0;
2768                         return -EAGAIN;
2769         }
2770         task->tk_status = nfs4_map_errors(task->tk_status);
2771         return 0;
2772 }
2773
2774 static int nfs4_wait_bit_interruptible(void *word)
2775 {
2776         if (signal_pending(current))
2777                 return -ERESTARTSYS;
2778         schedule();
2779         return 0;
2780 }
2781
2782 static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs4_client *clp)
2783 {
2784         sigset_t oldset;
2785         int res;
2786
2787         might_sleep();
2788
2789         rpc_clnt_sigmask(clnt, &oldset);
2790         res = wait_on_bit(&clp->cl_state, NFS4CLNT_STATE_RECOVER,
2791                         nfs4_wait_bit_interruptible,
2792                         TASK_INTERRUPTIBLE);
2793         rpc_clnt_sigunmask(clnt, &oldset);
2794         return res;
2795 }
2796
2797 static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
2798 {
2799         sigset_t oldset;
2800         int res = 0;
2801
2802         might_sleep();
2803
2804         if (*timeout <= 0)
2805                 *timeout = NFS4_POLL_RETRY_MIN;
2806         if (*timeout > NFS4_POLL_RETRY_MAX)
2807                 *timeout = NFS4_POLL_RETRY_MAX;
2808         rpc_clnt_sigmask(clnt, &oldset);
2809         if (clnt->cl_intr) {
2810                 schedule_timeout_interruptible(*timeout);
2811                 if (signalled())
2812                         res = -ERESTARTSYS;
2813         } else
2814                 schedule_timeout_uninterruptible(*timeout);
2815         rpc_clnt_sigunmask(clnt, &oldset);
2816         *timeout <<= 1;
2817         return res;
2818 }
2819
2820 /* This is the error handling routine for processes that are allowed
2821  * to sleep.
2822  */
2823 int nfs4_handle_exception(const struct nfs_server *server, int errorcode, struct nfs4_exception *exception)
2824 {
2825         struct nfs4_client *clp = server->nfs4_state;
2826         int ret = errorcode;
2827
2828         exception->retry = 0;
2829         switch(errorcode) {
2830                 case 0:
2831                         return 0;
2832                 case -NFS4ERR_STALE_CLIENTID:
2833                 case -NFS4ERR_STALE_STATEID:
2834                 case -NFS4ERR_EXPIRED:
2835                         nfs4_schedule_state_recovery(clp);
2836                         ret = nfs4_wait_clnt_recover(server->client, clp);
2837                         if (ret == 0)
2838                                 exception->retry = 1;
2839                         break;
2840                 case -NFS4ERR_GRACE:
2841                 case -NFS4ERR_DELAY:
2842                         ret = nfs4_delay(server->client, &exception->timeout);
2843                         if (ret != 0)
2844                                 break;
2845                 case -NFS4ERR_OLD_STATEID:
2846                         exception->retry = 1;
2847         }
2848         /* We failed to handle the error */
2849         return nfs4_map_errors(ret);
2850 }
2851
2852 int nfs4_proc_setclientid(struct nfs4_client *clp, u32 program, unsigned short port, struct rpc_cred *cred)
2853 {
2854         nfs4_verifier sc_verifier;
2855         struct nfs4_setclientid setclientid = {
2856                 .sc_verifier = &sc_verifier,
2857                 .sc_prog = program,
2858         };
2859         struct rpc_message msg = {
2860                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID],
2861                 .rpc_argp = &setclientid,
2862                 .rpc_resp = clp,
2863                 .rpc_cred = cred,
2864         };
2865         u32 *p;
2866         int loop = 0;
2867         int status;
2868
2869         p = (u32*)sc_verifier.data;
2870         *p++ = htonl((u32)clp->cl_boot_time.tv_sec);
2871         *p = htonl((u32)clp->cl_boot_time.tv_nsec);
2872
2873         for(;;) {
2874                 setclientid.sc_name_len = scnprintf(setclientid.sc_name,
2875                                 sizeof(setclientid.sc_name), "%s/%u.%u.%u.%u %s %u",
2876                                 clp->cl_ipaddr, NIPQUAD(clp->cl_addr.s_addr),
2877                                 cred->cr_ops->cr_name,
2878                                 clp->cl_id_uniquifier);
2879                 setclientid.sc_netid_len = scnprintf(setclientid.sc_netid,
2880                                 sizeof(setclientid.sc_netid), "tcp");
2881                 setclientid.sc_uaddr_len = scnprintf(setclientid.sc_uaddr,
2882                                 sizeof(setclientid.sc_uaddr), "%s.%d.%d",
2883                                 clp->cl_ipaddr, port >> 8, port & 255);
2884
2885                 status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
2886                 if (status != -NFS4ERR_CLID_INUSE)
2887                         break;
2888                 if (signalled())
2889                         break;
2890                 if (loop++ & 1)
2891                         ssleep(clp->cl_lease_time + 1);
2892                 else
2893                         if (++clp->cl_id_uniquifier == 0)
2894                                 break;
2895         }
2896         return status;
2897 }
2898
2899 int
2900 nfs4_proc_setclientid_confirm(struct nfs4_client *clp, struct rpc_cred *cred)
2901 {
2902         struct nfs_fsinfo fsinfo;
2903         struct rpc_message msg = {
2904                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID_CONFIRM],
2905                 .rpc_argp = clp,
2906                 .rpc_resp = &fsinfo,
2907                 .rpc_cred = cred,
2908         };
2909         unsigned long now;
2910         int status;
2911
2912         now = jiffies;
2913         status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
2914         if (status == 0) {
2915                 spin_lock(&clp->cl_lock);
2916                 clp->cl_lease_time = fsinfo.lease_time * HZ;
2917                 clp->cl_last_renewal = now;
2918                 clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
2919                 spin_unlock(&clp->cl_lock);
2920         }
2921         return status;
2922 }
2923
2924 struct nfs4_delegreturndata {
2925         struct nfs4_delegreturnargs args;
2926         struct nfs4_delegreturnres res;
2927         struct nfs_fh fh;
2928         nfs4_stateid stateid;
2929         struct rpc_cred *cred;
2930         unsigned long timestamp;
2931         struct nfs_fattr fattr;
2932         int rpc_status;
2933 };
2934
2935 static void nfs4_delegreturn_prepare(struct rpc_task *task, void *calldata)
2936 {
2937         struct nfs4_delegreturndata *data = calldata;
2938         struct rpc_message msg = {
2939                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN],
2940                 .rpc_argp = &data->args,
2941                 .rpc_resp = &data->res,
2942                 .rpc_cred = data->cred,
2943         };
2944         nfs_fattr_init(data->res.fattr);
2945         rpc_call_setup(task, &msg, 0);
2946 }
2947
2948 static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
2949 {
2950         struct nfs4_delegreturndata *data = calldata;
2951         data->rpc_status = task->tk_status;
2952         if (data->rpc_status == 0)
2953                 renew_lease(data->res.server, data->timestamp);
2954 }
2955
2956 static void nfs4_delegreturn_release(void *calldata)
2957 {
2958         struct nfs4_delegreturndata *data = calldata;
2959
2960         put_rpccred(data->cred);
2961         kfree(calldata);
2962 }
2963
2964 static const struct rpc_call_ops nfs4_delegreturn_ops = {
2965         .rpc_call_prepare = nfs4_delegreturn_prepare,
2966         .rpc_call_done = nfs4_delegreturn_done,
2967         .rpc_release = nfs4_delegreturn_release,
2968 };
2969
2970 static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid)
2971 {
2972         struct nfs4_delegreturndata *data;
2973         struct nfs_server *server = NFS_SERVER(inode);
2974         struct rpc_task *task;
2975         int status;
2976
2977         data = kmalloc(sizeof(*data), GFP_KERNEL);
2978         if (data == NULL)
2979                 return -ENOMEM;
2980         data->args.fhandle = &data->fh;
2981         data->args.stateid = &data->stateid;
2982         data->args.bitmask = server->attr_bitmask;
2983         nfs_copy_fh(&data->fh, NFS_FH(inode));
2984         memcpy(&data->stateid, stateid, sizeof(data->stateid));
2985         data->res.fattr = &data->fattr;
2986         data->res.server = server;
2987         data->cred = get_rpccred(cred);
2988         data->timestamp = jiffies;
2989         data->rpc_status = 0;
2990
2991         task = rpc_run_task(NFS_CLIENT(inode), RPC_TASK_ASYNC, &nfs4_delegreturn_ops, data);
2992         if (IS_ERR(task)) {
2993                 nfs4_delegreturn_release(data);
2994                 return PTR_ERR(task);
2995         }
2996         status = nfs4_wait_for_completion_rpc_task(task);
2997         if (status == 0) {
2998                 status = data->rpc_status;
2999                 if (status == 0)
3000                         nfs_post_op_update_inode(inode, &data->fattr);
3001         }
3002         rpc_release_task(task);
3003         return status;
3004 }
3005
3006 int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid)
3007 {
3008         struct nfs_server *server = NFS_SERVER(inode);
3009         struct nfs4_exception exception = { };
3010         int err;
3011         do {
3012                 err = _nfs4_proc_delegreturn(inode, cred, stateid);
3013                 switch (err) {
3014                         case -NFS4ERR_STALE_STATEID:
3015                         case -NFS4ERR_EXPIRED:
3016                                 nfs4_schedule_state_recovery(server->nfs4_state);
3017                         case 0:
3018                                 return 0;
3019                 }
3020                 err = nfs4_handle_exception(server, err, &exception);
3021         } while (exception.retry);
3022         return err;
3023 }
3024
3025 #define NFS4_LOCK_MINTIMEOUT (1 * HZ)
3026 #define NFS4_LOCK_MAXTIMEOUT (30 * HZ)
3027
3028 /* 
3029  * sleep, with exponential backoff, and retry the LOCK operation. 
3030  */
3031 static unsigned long
3032 nfs4_set_lock_task_retry(unsigned long timeout)
3033 {
3034         schedule_timeout_interruptible(timeout);
3035         timeout <<= 1;
3036         if (timeout > NFS4_LOCK_MAXTIMEOUT)
3037                 return NFS4_LOCK_MAXTIMEOUT;
3038         return timeout;
3039 }
3040
3041 static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
3042 {
3043         struct inode *inode = state->inode;
3044         struct nfs_server *server = NFS_SERVER(inode);
3045         struct nfs4_client *clp = server->nfs4_state;
3046         struct nfs_lockt_args arg = {
3047                 .fh = NFS_FH(inode),
3048                 .fl = request,
3049         };
3050         struct nfs_lockt_res res = {
3051                 .denied = request,
3052         };
3053         struct rpc_message msg = {
3054                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_LOCKT],
3055                 .rpc_argp       = &arg,
3056                 .rpc_resp       = &res,
3057                 .rpc_cred       = state->owner->so_cred,
3058         };
3059         struct nfs4_lock_state *lsp;
3060         int status;
3061
3062         down_read(&clp->cl_sem);
3063         arg.lock_owner.clientid = clp->cl_clientid;
3064         status = nfs4_set_lock_state(state, request);
3065         if (status != 0)
3066                 goto out;
3067         lsp = request->fl_u.nfs4_fl.owner;
3068         arg.lock_owner.id = lsp->ls_id; 
3069         status = rpc_call_sync(server->client, &msg, 0);
3070         switch (status) {
3071                 case 0:
3072                         request->fl_type = F_UNLCK;
3073                         break;
3074                 case -NFS4ERR_DENIED:
3075                         status = 0;
3076         }
3077 out:
3078         up_read(&clp->cl_sem);
3079         return status;
3080 }
3081
3082 static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
3083 {
3084         struct nfs4_exception exception = { };
3085         int err;
3086
3087         do {
3088                 err = nfs4_handle_exception(NFS_SERVER(state->inode),
3089                                 _nfs4_proc_getlk(state, cmd, request),
3090                                 &exception);
3091         } while (exception.retry);
3092         return err;
3093 }
3094
3095 static int do_vfs_lock(struct file *file, struct file_lock *fl)
3096 {
3097         int res = 0;
3098         switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) {
3099                 case FL_POSIX:
3100                         res = posix_lock_file_wait(file, fl);
3101                         break;
3102                 case FL_FLOCK:
3103                         res = flock_lock_file_wait(file, fl);
3104                         break;
3105                 default:
3106                         BUG();
3107         }
3108         if (res < 0)
3109                 printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n",
3110                                 __FUNCTION__);
3111         return res;
3112 }
3113
3114 struct nfs4_unlockdata {
3115         struct nfs_locku_args arg;
3116         struct nfs_locku_res res;
3117         struct nfs4_lock_state *lsp;
3118         struct nfs_open_context *ctx;
3119         struct file_lock fl;
3120         const struct nfs_server *server;
3121         unsigned long timestamp;
3122 };
3123
3124 static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl,
3125                 struct nfs_open_context *ctx,
3126                 struct nfs4_lock_state *lsp,
3127                 struct nfs_seqid *seqid)
3128 {
3129         struct nfs4_unlockdata *p;
3130         struct inode *inode = lsp->ls_state->inode;
3131
3132         p = kmalloc(sizeof(*p), GFP_KERNEL);
3133         if (p == NULL)
3134                 return NULL;
3135         p->arg.fh = NFS_FH(inode);
3136         p->arg.fl = &p->fl;
3137         p->arg.seqid = seqid;
3138         p->arg.stateid = &lsp->ls_stateid;
3139         p->lsp = lsp;
3140         atomic_inc(&lsp->ls_count);
3141         /* Ensure we don't close file until we're done freeing locks! */
3142         p->ctx = get_nfs_open_context(ctx);
3143         memcpy(&p->fl, fl, sizeof(p->fl));
3144         p->server = NFS_SERVER(inode);
3145         return p;
3146 }
3147
3148 static void nfs4_locku_release_calldata(void *data)
3149 {
3150         struct nfs4_unlockdata *calldata = data;
3151         nfs_free_seqid(calldata->arg.seqid);
3152         nfs4_put_lock_state(calldata->lsp);
3153         put_nfs_open_context(calldata->ctx);
3154         kfree(calldata);
3155 }
3156
3157 static void nfs4_locku_done(struct rpc_task *task, void *data)
3158 {
3159         struct nfs4_unlockdata *calldata = data;
3160
3161         if (RPC_ASSASSINATED(task))
3162                 return;
3163         nfs_increment_lock_seqid(task->tk_status, calldata->arg.seqid);
3164         switch (task->tk_status) {
3165                 case 0:
3166                         memcpy(calldata->lsp->ls_stateid.data,
3167                                         calldata->res.stateid.data,
3168                                         sizeof(calldata->lsp->ls_stateid.data));
3169                         renew_lease(calldata->server, calldata->timestamp);
3170                         break;
3171                 case -NFS4ERR_STALE_STATEID:
3172                 case -NFS4ERR_EXPIRED:
3173                         nfs4_schedule_state_recovery(calldata->server->nfs4_state);
3174                         break;
3175                 default:
3176                         if (nfs4_async_handle_error(task, calldata->server) == -EAGAIN) {
3177                                 rpc_restart_call(task);
3178                         }
3179         }
3180 }
3181
3182 static void nfs4_locku_prepare(struct rpc_task *task, void *data)
3183 {
3184         struct nfs4_unlockdata *calldata = data;
3185         struct rpc_message msg = {
3186                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_LOCKU],
3187                 .rpc_argp       = &calldata->arg,
3188                 .rpc_resp       = &calldata->res,
3189                 .rpc_cred       = calldata->lsp->ls_state->owner->so_cred,
3190         };
3191
3192         if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
3193                 return;
3194         if ((calldata->lsp->ls_flags & NFS_LOCK_INITIALIZED) == 0) {
3195                 /* Note: exit _without_ running nfs4_locku_done */
3196                 task->tk_action = NULL;
3197                 return;
3198         }
3199         calldata->timestamp = jiffies;
3200         rpc_call_setup(task, &msg, 0);
3201 }
3202
3203 static const struct rpc_call_ops nfs4_locku_ops = {
3204         .rpc_call_prepare = nfs4_locku_prepare,
3205         .rpc_call_done = nfs4_locku_done,
3206         .rpc_release = nfs4_locku_release_calldata,
3207 };
3208
3209 static struct rpc_task *nfs4_do_unlck(struct file_lock *fl,
3210                 struct nfs_open_context *ctx,
3211                 struct nfs4_lock_state *lsp,
3212                 struct nfs_seqid *seqid)
3213 {
3214         struct nfs4_unlockdata *data;
3215         struct rpc_task *task;
3216
3217         data = nfs4_alloc_unlockdata(fl, ctx, lsp, seqid);
3218         if (data == NULL) {
3219                 nfs_free_seqid(seqid);
3220                 return ERR_PTR(-ENOMEM);
3221         }
3222
3223         /* Unlock _before_ we do the RPC call */
3224         do_vfs_lock(fl->fl_file, fl);
3225         task = rpc_run_task(NFS_CLIENT(lsp->ls_state->inode), RPC_TASK_ASYNC, &nfs4_locku_ops, data);
3226         if (IS_ERR(task))
3227                 nfs4_locku_release_calldata(data);
3228         return task;
3229 }
3230
3231 static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request)
3232 {
3233         struct nfs_seqid *seqid;
3234         struct nfs4_lock_state *lsp;
3235         struct rpc_task *task;
3236         int status = 0;
3237
3238         /* Is this a delegated lock? */
3239         if (test_bit(NFS_DELEGATED_STATE, &state->flags))
3240                 goto out_unlock;
3241         /* Is this open_owner holding any locks on the server? */
3242         if (test_bit(LK_STATE_IN_USE, &state->flags) == 0)
3243                 goto out_unlock;
3244
3245         status = nfs4_set_lock_state(state, request);
3246         if (status != 0)
3247                 goto out_unlock;
3248         lsp = request->fl_u.nfs4_fl.owner;
3249         status = -ENOMEM;
3250         seqid = nfs_alloc_seqid(&lsp->ls_seqid);
3251         if (seqid == NULL)
3252                 goto out_unlock;
3253         task = nfs4_do_unlck(request, request->fl_file->private_data, lsp, seqid);
3254         status = PTR_ERR(task);
3255         if (IS_ERR(task))
3256                 goto out_unlock;
3257         status = nfs4_wait_for_completion_rpc_task(task);
3258         rpc_release_task(task);
3259         return status;
3260 out_unlock:
3261         do_vfs_lock(request->fl_file, request);
3262         return status;
3263 }
3264
3265 struct nfs4_lockdata {
3266         struct nfs_lock_args arg;
3267         struct nfs_lock_res res;
3268         struct nfs4_lock_state *lsp;
3269         struct nfs_open_context *ctx;
3270         struct file_lock fl;
3271         unsigned long timestamp;
3272         int rpc_status;
3273         int cancelled;
3274 };
3275
3276 static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl,
3277                 struct nfs_open_context *ctx, struct nfs4_lock_state *lsp)
3278 {
3279         struct nfs4_lockdata *p;
3280         struct inode *inode = lsp->ls_state->inode;
3281         struct nfs_server *server = NFS_SERVER(inode);
3282
3283         p = kzalloc(sizeof(*p), GFP_KERNEL);
3284         if (p == NULL)
3285                 return NULL;
3286
3287         p->arg.fh = NFS_FH(inode);
3288         p->arg.fl = &p->fl;
3289         p->arg.lock_seqid = nfs_alloc_seqid(&lsp->ls_seqid);
3290         if (p->arg.lock_seqid == NULL)
3291                 goto out_free;
3292         p->arg.lock_stateid = &lsp->ls_stateid;
3293         p->arg.lock_owner.clientid = server->nfs4_state->cl_clientid;
3294         p->arg.lock_owner.id = lsp->ls_id;
3295         p->lsp = lsp;
3296         atomic_inc(&lsp->ls_count);
3297         p->ctx = get_nfs_open_context(ctx);
3298         memcpy(&p->fl, fl, sizeof(p->fl));
3299         return p;
3300 out_free:
3301         kfree(p);
3302         return NULL;
3303 }
3304
3305 static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
3306 {
3307         struct nfs4_lockdata *data = calldata;
3308         struct nfs4_state *state = data->lsp->ls_state;
3309         struct nfs4_state_owner *sp = state->owner;
3310         struct rpc_message msg = {
3311                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK],
3312                 .rpc_argp = &data->arg,
3313                 .rpc_resp = &data->res,
3314                 .rpc_cred = sp->so_cred,
3315         };
3316
3317         if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0)
3318                 return;
3319         dprintk("%s: begin!\n", __FUNCTION__);
3320         /* Do we need to do an open_to_lock_owner? */
3321         if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)) {
3322                 data->arg.open_seqid = nfs_alloc_seqid(&sp->so_seqid);
3323                 if (data->arg.open_seqid == NULL) {
3324                         data->rpc_status = -ENOMEM;
3325                         task->tk_action = NULL;
3326                         goto out;
3327                 }
3328                 data->arg.open_stateid = &state->stateid;
3329                 data->arg.new_lock_owner = 1;
3330         }
3331         data->timestamp = jiffies;
3332         rpc_call_setup(task, &msg, 0);
3333 out:
3334         dprintk("%s: done!, ret = %d\n", __FUNCTION__, data->rpc_status);
3335 }
3336
3337 static void nfs4_lock_done(struct rpc_task *task, void *calldata)
3338 {
3339         struct nfs4_lockdata *data = calldata;
3340
3341         dprintk("%s: begin!\n", __FUNCTION__);
3342
3343         data->rpc_status = task->tk_status;
3344         if (RPC_ASSASSINATED(task))
3345                 goto out;
3346         if (data->arg.new_lock_owner != 0) {
3347                 nfs_increment_open_seqid(data->rpc_status, data->arg.open_seqid);
3348                 if (data->rpc_status == 0)
3349                         nfs_confirm_seqid(&data->lsp->ls_seqid, 0);
3350                 else
3351                         goto out;
3352         }
3353         if (data->rpc_status == 0) {
3354                 memcpy(data->lsp->ls_stateid.data, data->res.stateid.data,
3355                                         sizeof(data->lsp->ls_stateid.data));
3356                 data->lsp->ls_flags |= NFS_LOCK_INITIALIZED;
3357                 renew_lease(NFS_SERVER(data->ctx->dentry->d_inode), data->timestamp);
3358         }
3359         nfs_increment_lock_seqid(data->rpc_status, data->arg.lock_seqid);
3360 out:
3361         dprintk("%s: done, ret = %d!\n", __FUNCTION__, data->rpc_status);
3362 }
3363
3364 static void nfs4_lock_release(void *calldata)
3365 {
3366         struct nfs4_lockdata *data = calldata;
3367
3368         dprintk("%s: begin!\n", __FUNCTION__);
3369         if (data->arg.open_seqid != NULL)
3370                 nfs_free_seqid(data->arg.open_seqid);
3371         if (data->cancelled != 0) {
3372                 struct rpc_task *task;
3373                 task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp,
3374                                 data->arg.lock_seqid);
3375                 if (!IS_ERR(task))
3376                         rpc_release_task(task);
3377                 dprintk("%s: cancelling lock!\n", __FUNCTION__);
3378         } else
3379                 nfs_free_seqid(data->arg.lock_seqid);
3380         nfs4_put_lock_state(data->lsp);
3381         put_nfs_open_context(data->ctx);
3382         kfree(data);
3383         dprintk("%s: done!\n", __FUNCTION__);
3384 }
3385
3386 static const struct rpc_call_ops nfs4_lock_ops = {
3387         .rpc_call_prepare = nfs4_lock_prepare,
3388         .rpc_call_done = nfs4_lock_done,
3389         .rpc_release = nfs4_lock_release,
3390 };
3391
3392 static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int reclaim)
3393 {
3394         struct nfs4_lockdata *data;
3395         struct rpc_task *task;
3396         int ret;
3397
3398         dprintk("%s: begin!\n", __FUNCTION__);
3399         data = nfs4_alloc_lockdata(fl, fl->fl_file->private_data,
3400                         fl->fl_u.nfs4_fl.owner);
3401         if (data == NULL)
3402                 return -ENOMEM;
3403         if (IS_SETLKW(cmd))
3404                 data->arg.block = 1;
3405         if (reclaim != 0)
3406                 data->arg.reclaim = 1;
3407         task = rpc_run_task(NFS_CLIENT(state->inode), RPC_TASK_ASYNC,
3408                         &nfs4_lock_ops, data);
3409         if (IS_ERR(task)) {
3410                 nfs4_lock_release(data);
3411                 return PTR_ERR(task);
3412         }
3413         ret = nfs4_wait_for_completion_rpc_task(task);
3414         if (ret == 0) {
3415                 ret = data->rpc_status;
3416                 if (ret == -NFS4ERR_DENIED)
3417                         ret = -EAGAIN;
3418         } else
3419                 data->cancelled = 1;
3420         rpc_release_task(task);
3421         dprintk("%s: done, ret = %d!\n", __FUNCTION__, ret);
3422         return ret;
3423 }
3424
3425 static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request)
3426 {
3427         struct nfs_server *server = NFS_SERVER(state->inode);
3428         struct nfs4_exception exception = { };
3429         int err;
3430
3431         /* Cache the lock if possible... */
3432         if (test_bit(NFS_DELEGATED_STATE, &state->flags))
3433                 return 0;
3434         do {
3435                 err = _nfs4_do_setlk(state, F_SETLK, request, 1);
3436                 if (err != -NFS4ERR_DELAY)
3437                         break;
3438                 nfs4_handle_exception(server, err, &exception);
3439         } while (exception.retry);
3440         return err;
3441 }
3442
3443 static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request)
3444 {
3445         struct nfs_server *server = NFS_SERVER(state->inode);
3446         struct nfs4_exception exception = { };
3447         int err;
3448
3449         err = nfs4_set_lock_state(state, request);
3450         if (err != 0)
3451                 return err;
3452         do {
3453                 err = _nfs4_do_setlk(state, F_SETLK, request, 0);
3454                 if (err != -NFS4ERR_DELAY)
3455                         break;
3456                 nfs4_handle_exception(server, err, &exception);
3457         } while (exception.retry);
3458         return err;
3459 }
3460
3461 static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
3462 {
3463         struct nfs4_client *clp = state->owner->so_client;
3464         int status;
3465
3466         /* Is this a delegated open? */
3467         if (NFS_I(state->inode)->delegation_state != 0) {
3468                 /* Yes: cache locks! */
3469                 status = do_vfs_lock(request->fl_file, request);
3470                 /* ...but avoid races with delegation recall... */
3471                 if (status < 0 || test_bit(NFS_DELEGATED_STATE, &state->flags))
3472                         return status;
3473         }
3474         down_read(&clp->cl_sem);
3475         status = nfs4_set_lock_state(state, request);
3476         if (status != 0)
3477                 goto out;
3478         status = _nfs4_do_setlk(state, cmd, request, 0);
3479         if (status != 0)
3480                 goto out;
3481         /* Note: we always want to sleep here! */
3482         request->fl_flags |= FL_SLEEP;
3483         if (do_vfs_lock(request->fl_file, request) < 0)
3484                 printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", __FUNCTION__);
3485 out:
3486         up_read(&clp->cl_sem);
3487         return status;
3488 }
3489
3490 static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
3491 {
3492         struct nfs4_exception exception = { };
3493         int err;
3494
3495         do {
3496                 err = nfs4_handle_exception(NFS_SERVER(state->inode),
3497                                 _nfs4_proc_setlk(state, cmd, request),
3498                                 &exception);
3499         } while (exception.retry);
3500         return err;
3501 }
3502
3503 static int
3504 nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request)
3505 {
3506         struct nfs_open_context *ctx;
3507         struct nfs4_state *state;
3508         unsigned long timeout = NFS4_LOCK_MINTIMEOUT;
3509         int status;
3510
3511         /* verify open state */
3512         ctx = (struct nfs_open_context *)filp->private_data;
3513         state = ctx->state;
3514
3515         if (request->fl_start < 0 || request->fl_end < 0)
3516                 return -EINVAL;
3517
3518         if (IS_GETLK(cmd))
3519                 return nfs4_proc_getlk(state, F_GETLK, request);
3520
3521         if (!(IS_SETLK(cmd) || IS_SETLKW(cmd)))
3522                 return -EINVAL;
3523
3524         if (request->fl_type == F_UNLCK)
3525                 return nfs4_proc_unlck(state, cmd, request);
3526
3527         do {
3528                 status = nfs4_proc_setlk(state, cmd, request);
3529                 if ((status != -EAGAIN) || IS_SETLK(cmd))
3530                         break;
3531                 timeout = nfs4_set_lock_task_retry(timeout);
3532                 status = -ERESTARTSYS;
3533                 if (signalled())
3534                         break;
3535         } while(status < 0);
3536         return status;
3537 }
3538
3539 int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl)
3540 {
3541         struct nfs_server *server = NFS_SERVER(state->inode);
3542         struct nfs4_exception exception = { };
3543         int err;
3544
3545         err = nfs4_set_lock_state(state, fl);
3546         if (err != 0)
3547                 goto out;
3548         do {
3549                 err = _nfs4_do_setlk(state, F_SETLK, fl, 0);
3550                 if (err != -NFS4ERR_DELAY)
3551                         break;
3552                 err = nfs4_handle_exception(server, err, &exception);
3553         } while (exception.retry);
3554 out:
3555         return err;
3556 }
3557
3558 #define XATTR_NAME_NFSV4_ACL "system.nfs4_acl"
3559
3560 int nfs4_setxattr(struct dentry *dentry, const char *key, const void *buf,
3561                 size_t buflen, int flags)
3562 {
3563         struct inode *inode = dentry->d_inode;
3564
3565         if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
3566                 return -EOPNOTSUPP;
3567
3568         if (!S_ISREG(inode->i_mode) &&
3569             (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX))
3570                 return -EPERM;
3571
3572         return nfs4_proc_set_acl(inode, buf, buflen);
3573 }
3574
3575 /* The getxattr man page suggests returning -ENODATA for unknown attributes,
3576  * and that's what we'll do for e.g. user attributes that haven't been set.
3577  * But we'll follow ext2/ext3's lead by returning -EOPNOTSUPP for unsupported
3578  * attributes in kernel-managed attribute namespaces. */
3579 ssize_t nfs4_getxattr(struct dentry *dentry, const char *key, void *buf,
3580                 size_t buflen)
3581 {
3582         struct inode *inode = dentry->d_inode;
3583
3584         if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
3585                 return -EOPNOTSUPP;
3586
3587         return nfs4_proc_get_acl(inode, buf, buflen);
3588 }
3589
3590 ssize_t nfs4_listxattr(struct dentry *dentry, char *buf, size_t buflen)
3591 {
3592         size_t len = strlen(XATTR_NAME_NFSV4_ACL) + 1;
3593
3594         if (buf && buflen < len)
3595                 return -ERANGE;
3596         if (buf)
3597                 memcpy(buf, XATTR_NAME_NFSV4_ACL, len);
3598         return len;
3599 }
3600
3601 struct nfs4_state_recovery_ops nfs4_reboot_recovery_ops = {
3602         .recover_open   = nfs4_open_reclaim,
3603         .recover_lock   = nfs4_lock_reclaim,
3604 };
3605
3606 struct nfs4_state_recovery_ops nfs4_network_partition_recovery_ops = {
3607         .recover_open   = nfs4_open_expired,
3608         .recover_lock   = nfs4_lock_expired,
3609 };
3610
3611 static struct inode_operations nfs4_file_inode_operations = {
3612         .permission     = nfs_permission,
3613         .getattr        = nfs_getattr,
3614         .setattr        = nfs_setattr,
3615         .getxattr       = nfs4_getxattr,
3616         .setxattr       = nfs4_setxattr,
3617         .listxattr      = nfs4_listxattr,
3618 };
3619
3620 struct nfs_rpc_ops      nfs_v4_clientops = {
3621         .version        = 4,                    /* protocol version */
3622         .dentry_ops     = &nfs4_dentry_operations,
3623         .dir_inode_ops  = &nfs4_dir_inode_operations,
3624         .file_inode_ops = &nfs4_file_inode_operations,
3625         .getroot        = nfs4_proc_get_root,
3626         .getattr        = nfs4_proc_getattr,
3627         .setattr        = nfs4_proc_setattr,
3628         .lookup         = nfs4_proc_lookup,
3629         .access         = nfs4_proc_access,
3630         .readlink       = nfs4_proc_readlink,
3631         .read           = nfs4_proc_read,
3632         .write          = nfs4_proc_write,
3633         .commit         = nfs4_proc_commit,
3634         .create         = nfs4_proc_create,
3635         .remove         = nfs4_proc_remove,
3636         .unlink_setup   = nfs4_proc_unlink_setup,
3637         .unlink_done    = nfs4_proc_unlink_done,
3638         .rename         = nfs4_proc_rename,
3639         .link           = nfs4_proc_link,
3640         .symlink        = nfs4_proc_symlink,
3641         .mkdir          = nfs4_proc_mkdir,
3642         .rmdir          = nfs4_proc_remove,
3643         .readdir        = nfs4_proc_readdir,
3644         .mknod          = nfs4_proc_mknod,
3645         .statfs         = nfs4_proc_statfs,
3646         .fsinfo         = nfs4_proc_fsinfo,
3647         .pathconf       = nfs4_proc_pathconf,
3648         .decode_dirent  = nfs4_decode_dirent,
3649         .read_setup     = nfs4_proc_read_setup,
3650         .write_setup    = nfs4_proc_write_setup,
3651         .commit_setup   = nfs4_proc_commit_setup,
3652         .file_open      = nfs_open,
3653         .file_release   = nfs_release,
3654         .lock           = nfs4_proc_lock,
3655         .clear_acl_cache = nfs4_zap_acl_attr,
3656 };
3657
3658 /*
3659  * Local variables:
3660  *  c-basic-offset: 8
3661  * End:
3662  */