NFS: Make nfs_fhget() return appropriate error values
[pandora-kernel.git] / 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 (IS_ERR(inode))
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 inode *inode, struct nfs_fattr *fattr,
1022                 struct iattr *sattr, struct nfs4_state *state)
1023 {
1024         struct nfs_server *server = NFS_SERVER(inode);
1025         struct nfs_setattrargs  arg = {
1026                 .fh             = NFS_FH(inode),
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 (nfs4_copy_delegation_stateid(&arg.stateid, inode)) {
1046                 /* Use that stateid */
1047         } else if (state != NULL) {
1048                 msg.rpc_cred = state->owner->so_cred;
1049                 nfs4_copy_stateid(&arg.stateid, state, current->files);
1050         } else
1051                 memcpy(&arg.stateid, &zero_stateid, sizeof(arg.stateid));
1052
1053         status = rpc_call_sync(server->client, &msg, 0);
1054         if (status == 0 && state != NULL)
1055                 renew_lease(server, timestamp);
1056         return status;
1057 }
1058
1059 static int nfs4_do_setattr(struct inode *inode, struct nfs_fattr *fattr,
1060                 struct iattr *sattr, struct nfs4_state *state)
1061 {
1062         struct nfs_server *server = NFS_SERVER(inode);
1063         struct nfs4_exception exception = { };
1064         int err;
1065         do {
1066                 err = nfs4_handle_exception(server,
1067                                 _nfs4_do_setattr(inode, fattr, sattr, state),
1068                                 &exception);
1069         } while (exception.retry);
1070         return err;
1071 }
1072
1073 struct nfs4_closedata {
1074         struct inode *inode;
1075         struct nfs4_state *state;
1076         struct nfs_closeargs arg;
1077         struct nfs_closeres res;
1078         struct nfs_fattr fattr;
1079         unsigned long timestamp;
1080 };
1081
1082 static void nfs4_free_closedata(void *data)
1083 {
1084         struct nfs4_closedata *calldata = data;
1085         struct nfs4_state_owner *sp = calldata->state->owner;
1086
1087         nfs4_put_open_state(calldata->state);
1088         nfs_free_seqid(calldata->arg.seqid);
1089         nfs4_put_state_owner(sp);
1090         kfree(calldata);
1091 }
1092
1093 static void nfs4_close_done(struct rpc_task *task, void *data)
1094 {
1095         struct nfs4_closedata *calldata = data;
1096         struct nfs4_state *state = calldata->state;
1097         struct nfs_server *server = NFS_SERVER(calldata->inode);
1098
1099         if (RPC_ASSASSINATED(task))
1100                 return;
1101         /* hmm. we are done with the inode, and in the process of freeing
1102          * the state_owner. we keep this around to process errors
1103          */
1104         nfs_increment_open_seqid(task->tk_status, calldata->arg.seqid);
1105         switch (task->tk_status) {
1106                 case 0:
1107                         memcpy(&state->stateid, &calldata->res.stateid,
1108                                         sizeof(state->stateid));
1109                         renew_lease(server, calldata->timestamp);
1110                         break;
1111                 case -NFS4ERR_STALE_STATEID:
1112                 case -NFS4ERR_EXPIRED:
1113                         nfs4_schedule_state_recovery(server->nfs4_state);
1114                         break;
1115                 default:
1116                         if (nfs4_async_handle_error(task, server) == -EAGAIN) {
1117                                 rpc_restart_call(task);
1118                                 return;
1119                         }
1120         }
1121         nfs_refresh_inode(calldata->inode, calldata->res.fattr);
1122 }
1123
1124 static void nfs4_close_prepare(struct rpc_task *task, void *data)
1125 {
1126         struct nfs4_closedata *calldata = data;
1127         struct nfs4_state *state = calldata->state;
1128         struct rpc_message msg = {
1129                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE],
1130                 .rpc_argp = &calldata->arg,
1131                 .rpc_resp = &calldata->res,
1132                 .rpc_cred = state->owner->so_cred,
1133         };
1134         int mode = 0, old_mode;
1135
1136         if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
1137                 return;
1138         /* Recalculate the new open mode in case someone reopened the file
1139          * while we were waiting in line to be scheduled.
1140          */
1141         spin_lock(&state->owner->so_lock);
1142         spin_lock(&calldata->inode->i_lock);
1143         mode = old_mode = state->state;
1144         if (state->n_rdwr == 0) {
1145                 if (state->n_rdonly == 0)
1146                         mode &= ~FMODE_READ;
1147                 if (state->n_wronly == 0)
1148                         mode &= ~FMODE_WRITE;
1149         }
1150         nfs4_state_set_mode_locked(state, mode);
1151         spin_unlock(&calldata->inode->i_lock);
1152         spin_unlock(&state->owner->so_lock);
1153         if (mode == old_mode || test_bit(NFS_DELEGATED_STATE, &state->flags)) {
1154                 /* Note: exit _without_ calling nfs4_close_done */
1155                 task->tk_action = NULL;
1156                 return;
1157         }
1158         nfs_fattr_init(calldata->res.fattr);
1159         if (mode != 0)
1160                 msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE];
1161         calldata->arg.open_flags = mode;
1162         calldata->timestamp = jiffies;
1163         rpc_call_setup(task, &msg, 0);
1164 }
1165
1166 static const struct rpc_call_ops nfs4_close_ops = {
1167         .rpc_call_prepare = nfs4_close_prepare,
1168         .rpc_call_done = nfs4_close_done,
1169         .rpc_release = nfs4_free_closedata,
1170 };
1171
1172 /* 
1173  * It is possible for data to be read/written from a mem-mapped file 
1174  * after the sys_close call (which hits the vfs layer as a flush).
1175  * This means that we can't safely call nfsv4 close on a file until 
1176  * the inode is cleared. This in turn means that we are not good
1177  * NFSv4 citizens - we do not indicate to the server to update the file's 
1178  * share state even when we are done with one of the three share 
1179  * stateid's in the inode.
1180  *
1181  * NOTE: Caller must be holding the sp->so_owner semaphore!
1182  */
1183 int nfs4_do_close(struct inode *inode, struct nfs4_state *state) 
1184 {
1185         struct nfs_server *server = NFS_SERVER(inode);
1186         struct nfs4_closedata *calldata;
1187         int status = -ENOMEM;
1188
1189         calldata = kmalloc(sizeof(*calldata), GFP_KERNEL);
1190         if (calldata == NULL)
1191                 goto out;
1192         calldata->inode = inode;
1193         calldata->state = state;
1194         calldata->arg.fh = NFS_FH(inode);
1195         calldata->arg.stateid = &state->stateid;
1196         /* Serialization for the sequence id */
1197         calldata->arg.seqid = nfs_alloc_seqid(&state->owner->so_seqid);
1198         if (calldata->arg.seqid == NULL)
1199                 goto out_free_calldata;
1200         calldata->arg.bitmask = server->attr_bitmask;
1201         calldata->res.fattr = &calldata->fattr;
1202         calldata->res.server = server;
1203
1204         status = nfs4_call_async(server->client, &nfs4_close_ops, calldata);
1205         if (status == 0)
1206                 goto out;
1207
1208         nfs_free_seqid(calldata->arg.seqid);
1209 out_free_calldata:
1210         kfree(calldata);
1211 out:
1212         return status;
1213 }
1214
1215 static void nfs4_intent_set_file(struct nameidata *nd, struct dentry *dentry, struct nfs4_state *state)
1216 {
1217         struct file *filp;
1218
1219         filp = lookup_instantiate_filp(nd, dentry, NULL);
1220         if (!IS_ERR(filp)) {
1221                 struct nfs_open_context *ctx;
1222                 ctx = (struct nfs_open_context *)filp->private_data;
1223                 ctx->state = state;
1224         } else
1225                 nfs4_close_state(state, nd->intent.open.flags);
1226 }
1227
1228 struct dentry *
1229 nfs4_atomic_open(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
1230 {
1231         struct iattr attr;
1232         struct rpc_cred *cred;
1233         struct nfs4_state *state;
1234         struct dentry *res;
1235
1236         if (nd->flags & LOOKUP_CREATE) {
1237                 attr.ia_mode = nd->intent.open.create_mode;
1238                 attr.ia_valid = ATTR_MODE;
1239                 if (!IS_POSIXACL(dir))
1240                         attr.ia_mode &= ~current->fs->umask;
1241         } else {
1242                 attr.ia_valid = 0;
1243                 BUG_ON(nd->intent.open.flags & O_CREAT);
1244         }
1245
1246         cred = rpcauth_lookupcred(NFS_SERVER(dir)->client->cl_auth, 0);
1247         if (IS_ERR(cred))
1248                 return (struct dentry *)cred;
1249         state = nfs4_do_open(dir, dentry, nd->intent.open.flags, &attr, cred);
1250         put_rpccred(cred);
1251         if (IS_ERR(state)) {
1252                 if (PTR_ERR(state) == -ENOENT)
1253                         d_add(dentry, NULL);
1254                 return (struct dentry *)state;
1255         }
1256         res = d_add_unique(dentry, igrab(state->inode));
1257         if (res != NULL)
1258                 dentry = res;
1259         nfs4_intent_set_file(nd, dentry, state);
1260         return res;
1261 }
1262
1263 int
1264 nfs4_open_revalidate(struct inode *dir, struct dentry *dentry, int openflags, struct nameidata *nd)
1265 {
1266         struct rpc_cred *cred;
1267         struct nfs4_state *state;
1268
1269         cred = rpcauth_lookupcred(NFS_SERVER(dir)->client->cl_auth, 0);
1270         if (IS_ERR(cred))
1271                 return PTR_ERR(cred);
1272         state = nfs4_open_delegated(dentry->d_inode, openflags, cred);
1273         if (IS_ERR(state))
1274                 state = nfs4_do_open(dir, dentry, openflags, NULL, cred);
1275         put_rpccred(cred);
1276         if (IS_ERR(state)) {
1277                 switch (PTR_ERR(state)) {
1278                         case -EPERM:
1279                         case -EACCES:
1280                         case -EDQUOT:
1281                         case -ENOSPC:
1282                         case -EROFS:
1283                                 lookup_instantiate_filp(nd, (struct dentry *)state, NULL);
1284                                 return 1;
1285                         case -ENOENT:
1286                                 if (dentry->d_inode == NULL)
1287                                         return 1;
1288                 }
1289                 goto out_drop;
1290         }
1291         if (state->inode == dentry->d_inode) {
1292                 nfs4_intent_set_file(nd, dentry, state);
1293                 return 1;
1294         }
1295         nfs4_close_state(state, openflags);
1296 out_drop:
1297         d_drop(dentry);
1298         return 0;
1299 }
1300
1301
1302 static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
1303 {
1304         struct nfs4_server_caps_res res = {};
1305         struct rpc_message msg = {
1306                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SERVER_CAPS],
1307                 .rpc_argp = fhandle,
1308                 .rpc_resp = &res,
1309         };
1310         int status;
1311
1312         status = rpc_call_sync(server->client, &msg, 0);
1313         if (status == 0) {
1314                 memcpy(server->attr_bitmask, res.attr_bitmask, sizeof(server->attr_bitmask));
1315                 if (res.attr_bitmask[0] & FATTR4_WORD0_ACL)
1316                         server->caps |= NFS_CAP_ACLS;
1317                 if (res.has_links != 0)
1318                         server->caps |= NFS_CAP_HARDLINKS;
1319                 if (res.has_symlinks != 0)
1320                         server->caps |= NFS_CAP_SYMLINKS;
1321                 server->acl_bitmask = res.acl_bitmask;
1322         }
1323         return status;
1324 }
1325
1326 static int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
1327 {
1328         struct nfs4_exception exception = { };
1329         int err;
1330         do {
1331                 err = nfs4_handle_exception(server,
1332                                 _nfs4_server_capabilities(server, fhandle),
1333                                 &exception);
1334         } while (exception.retry);
1335         return err;
1336 }
1337
1338 static int _nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
1339                 struct nfs_fsinfo *info)
1340 {
1341         struct nfs4_lookup_root_arg args = {
1342                 .bitmask = nfs4_fattr_bitmap,
1343         };
1344         struct nfs4_lookup_res res = {
1345                 .server = server,
1346                 .fattr = info->fattr,
1347                 .fh = fhandle,
1348         };
1349         struct rpc_message msg = {
1350                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP_ROOT],
1351                 .rpc_argp = &args,
1352                 .rpc_resp = &res,
1353         };
1354         nfs_fattr_init(info->fattr);
1355         return rpc_call_sync(server->client, &msg, 0);
1356 }
1357
1358 static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
1359                 struct nfs_fsinfo *info)
1360 {
1361         struct nfs4_exception exception = { };
1362         int err;
1363         do {
1364                 err = nfs4_handle_exception(server,
1365                                 _nfs4_lookup_root(server, fhandle, info),
1366                                 &exception);
1367         } while (exception.retry);
1368         return err;
1369 }
1370
1371 static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
1372                 struct nfs_fsinfo *info)
1373 {
1374         struct nfs_fattr *      fattr = info->fattr;
1375         unsigned char *         p;
1376         struct qstr             q;
1377         struct nfs4_lookup_arg args = {
1378                 .dir_fh = fhandle,
1379                 .name = &q,
1380                 .bitmask = nfs4_fattr_bitmap,
1381         };
1382         struct nfs4_lookup_res res = {
1383                 .server = server,
1384                 .fattr = fattr,
1385                 .fh = fhandle,
1386         };
1387         struct rpc_message msg = {
1388                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP],
1389                 .rpc_argp = &args,
1390                 .rpc_resp = &res,
1391         };
1392         int status;
1393
1394         /*
1395          * Now we do a separate LOOKUP for each component of the mount path.
1396          * The LOOKUPs are done separately so that we can conveniently
1397          * catch an ERR_WRONGSEC if it occurs along the way...
1398          */
1399         status = nfs4_lookup_root(server, fhandle, info);
1400         if (status)
1401                 goto out;
1402
1403         p = server->mnt_path;
1404         for (;;) {
1405                 struct nfs4_exception exception = { };
1406
1407                 while (*p == '/')
1408                         p++;
1409                 if (!*p)
1410                         break;
1411                 q.name = p;
1412                 while (*p && (*p != '/'))
1413                         p++;
1414                 q.len = p - q.name;
1415
1416                 do {
1417                         nfs_fattr_init(fattr);
1418                         status = nfs4_handle_exception(server,
1419                                         rpc_call_sync(server->client, &msg, 0),
1420                                         &exception);
1421                 } while (exception.retry);
1422                 if (status == 0)
1423                         continue;
1424                 if (status == -ENOENT) {
1425                         printk(KERN_NOTICE "NFS: mount path %s does not exist!\n", server->mnt_path);
1426                         printk(KERN_NOTICE "NFS: suggestion: try mounting '/' instead.\n");
1427                 }
1428                 break;
1429         }
1430         if (status == 0)
1431                 status = nfs4_server_capabilities(server, fhandle);
1432         if (status == 0)
1433                 status = nfs4_do_fsinfo(server, fhandle, info);
1434 out:
1435         return nfs4_map_errors(status);
1436 }
1437
1438 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
1439 {
1440         struct nfs4_getattr_arg args = {
1441                 .fh = fhandle,
1442                 .bitmask = server->attr_bitmask,
1443         };
1444         struct nfs4_getattr_res res = {
1445                 .fattr = fattr,
1446                 .server = server,
1447         };
1448         struct rpc_message msg = {
1449                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETATTR],
1450                 .rpc_argp = &args,
1451                 .rpc_resp = &res,
1452         };
1453         
1454         nfs_fattr_init(fattr);
1455         return rpc_call_sync(server->client, &msg, 0);
1456 }
1457
1458 static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
1459 {
1460         struct nfs4_exception exception = { };
1461         int err;
1462         do {
1463                 err = nfs4_handle_exception(server,
1464                                 _nfs4_proc_getattr(server, fhandle, fattr),
1465                                 &exception);
1466         } while (exception.retry);
1467         return err;
1468 }
1469
1470 /* 
1471  * The file is not closed if it is opened due to the a request to change
1472  * the size of the file. The open call will not be needed once the
1473  * VFS layer lookup-intents are implemented.
1474  *
1475  * Close is called when the inode is destroyed.
1476  * If we haven't opened the file for O_WRONLY, we
1477  * need to in the size_change case to obtain a stateid.
1478  *
1479  * Got race?
1480  * Because OPEN is always done by name in nfsv4, it is
1481  * possible that we opened a different file by the same
1482  * name.  We can recognize this race condition, but we
1483  * can't do anything about it besides returning an error.
1484  *
1485  * This will be fixed with VFS changes (lookup-intent).
1486  */
1487 static int
1488 nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
1489                   struct iattr *sattr)
1490 {
1491         struct rpc_cred *cred;
1492         struct inode *inode = dentry->d_inode;
1493         struct nfs_open_context *ctx;
1494         struct nfs4_state *state = NULL;
1495         int status;
1496
1497         nfs_fattr_init(fattr);
1498         
1499         cred = rpcauth_lookupcred(NFS_SERVER(inode)->client->cl_auth, 0);
1500         if (IS_ERR(cred))
1501                 return PTR_ERR(cred);
1502
1503         /* Search for an existing open(O_WRITE) file */
1504         ctx = nfs_find_open_context(inode, cred, FMODE_WRITE);
1505         if (ctx != NULL)
1506                 state = ctx->state;
1507
1508         status = nfs4_do_setattr(inode, fattr, 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(state->inode, &fattr, sattr, state);
1828                 if (status == 0)
1829                         nfs_setattr_update_inode(state->inode, sattr);
1830         }
1831         if (status == 0 && nd != NULL && (nd->flags & LOOKUP_OPEN))
1832                 nfs4_intent_set_file(nd, dentry, state);
1833         else
1834                 nfs4_close_state(state, flags);
1835 out:
1836         return status;
1837 }
1838
1839 static int _nfs4_proc_remove(struct inode *dir, struct qstr *name)
1840 {
1841         struct nfs_server *server = NFS_SERVER(dir);
1842         struct nfs4_remove_arg args = {
1843                 .fh = NFS_FH(dir),
1844                 .name = name,
1845                 .bitmask = server->attr_bitmask,
1846         };
1847         struct nfs_fattr dir_attr;
1848         struct nfs4_remove_res  res = {
1849                 .server = server,
1850                 .dir_attr = &dir_attr,
1851         };
1852         struct rpc_message msg = {
1853                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_REMOVE],
1854                 .rpc_argp       = &args,
1855                 .rpc_resp       = &res,
1856         };
1857         int                     status;
1858
1859         nfs_fattr_init(res.dir_attr);
1860         status = rpc_call_sync(server->client, &msg, 0);
1861         if (status == 0) {
1862                 update_changeattr(dir, &res.cinfo);
1863                 nfs_post_op_update_inode(dir, res.dir_attr);
1864         }
1865         return status;
1866 }
1867
1868 static int nfs4_proc_remove(struct inode *dir, struct qstr *name)
1869 {
1870         struct nfs4_exception exception = { };
1871         int err;
1872         do {
1873                 err = nfs4_handle_exception(NFS_SERVER(dir),
1874                                 _nfs4_proc_remove(dir, name),
1875                                 &exception);
1876         } while (exception.retry);
1877         return err;
1878 }
1879
1880 struct unlink_desc {
1881         struct nfs4_remove_arg  args;
1882         struct nfs4_remove_res  res;
1883         struct nfs_fattr dir_attr;
1884 };
1885
1886 static int nfs4_proc_unlink_setup(struct rpc_message *msg, struct dentry *dir,
1887                 struct qstr *name)
1888 {
1889         struct nfs_server *server = NFS_SERVER(dir->d_inode);
1890         struct unlink_desc *up;
1891
1892         up = (struct unlink_desc *) kmalloc(sizeof(*up), GFP_KERNEL);
1893         if (!up)
1894                 return -ENOMEM;
1895         
1896         up->args.fh = NFS_FH(dir->d_inode);
1897         up->args.name = name;
1898         up->args.bitmask = server->attr_bitmask;
1899         up->res.server = server;
1900         up->res.dir_attr = &up->dir_attr;
1901         
1902         msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE];
1903         msg->rpc_argp = &up->args;
1904         msg->rpc_resp = &up->res;
1905         return 0;
1906 }
1907
1908 static int nfs4_proc_unlink_done(struct dentry *dir, struct rpc_task *task)
1909 {
1910         struct rpc_message *msg = &task->tk_msg;
1911         struct unlink_desc *up;
1912         
1913         if (msg->rpc_resp != NULL) {
1914                 up = container_of(msg->rpc_resp, struct unlink_desc, res);
1915                 update_changeattr(dir->d_inode, &up->res.cinfo);
1916                 nfs_post_op_update_inode(dir->d_inode, up->res.dir_attr);
1917                 kfree(up);
1918                 msg->rpc_resp = NULL;
1919                 msg->rpc_argp = NULL;
1920         }
1921         return 0;
1922 }
1923
1924 static int _nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name,
1925                 struct inode *new_dir, struct qstr *new_name)
1926 {
1927         struct nfs_server *server = NFS_SERVER(old_dir);
1928         struct nfs4_rename_arg arg = {
1929                 .old_dir = NFS_FH(old_dir),
1930                 .new_dir = NFS_FH(new_dir),
1931                 .old_name = old_name,
1932                 .new_name = new_name,
1933                 .bitmask = server->attr_bitmask,
1934         };
1935         struct nfs_fattr old_fattr, new_fattr;
1936         struct nfs4_rename_res res = {
1937                 .server = server,
1938                 .old_fattr = &old_fattr,
1939                 .new_fattr = &new_fattr,
1940         };
1941         struct rpc_message msg = {
1942                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENAME],
1943                 .rpc_argp = &arg,
1944                 .rpc_resp = &res,
1945         };
1946         int                     status;
1947         
1948         nfs_fattr_init(res.old_fattr);
1949         nfs_fattr_init(res.new_fattr);
1950         status = rpc_call_sync(server->client, &msg, 0);
1951
1952         if (!status) {
1953                 update_changeattr(old_dir, &res.old_cinfo);
1954                 nfs_post_op_update_inode(old_dir, res.old_fattr);
1955                 update_changeattr(new_dir, &res.new_cinfo);
1956                 nfs_post_op_update_inode(new_dir, res.new_fattr);
1957         }
1958         return status;
1959 }
1960
1961 static int nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name,
1962                 struct inode *new_dir, struct qstr *new_name)
1963 {
1964         struct nfs4_exception exception = { };
1965         int err;
1966         do {
1967                 err = nfs4_handle_exception(NFS_SERVER(old_dir),
1968                                 _nfs4_proc_rename(old_dir, old_name,
1969                                         new_dir, new_name),
1970                                 &exception);
1971         } while (exception.retry);
1972         return err;
1973 }
1974
1975 static int _nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
1976 {
1977         struct nfs_server *server = NFS_SERVER(inode);
1978         struct nfs4_link_arg arg = {
1979                 .fh     = NFS_FH(inode),
1980                 .dir_fh = NFS_FH(dir),
1981                 .name   = name,
1982                 .bitmask = server->attr_bitmask,
1983         };
1984         struct nfs_fattr fattr, dir_attr;
1985         struct nfs4_link_res res = {
1986                 .server = server,
1987                 .fattr = &fattr,
1988                 .dir_attr = &dir_attr,
1989         };
1990         struct rpc_message msg = {
1991                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LINK],
1992                 .rpc_argp = &arg,
1993                 .rpc_resp = &res,
1994         };
1995         int                     status;
1996
1997         nfs_fattr_init(res.fattr);
1998         nfs_fattr_init(res.dir_attr);
1999         status = rpc_call_sync(server->client, &msg, 0);
2000         if (!status) {
2001                 update_changeattr(dir, &res.cinfo);
2002                 nfs_post_op_update_inode(dir, res.dir_attr);
2003                 nfs_refresh_inode(inode, res.fattr);
2004         }
2005
2006         return status;
2007 }
2008
2009 static int nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
2010 {
2011         struct nfs4_exception exception = { };
2012         int err;
2013         do {
2014                 err = nfs4_handle_exception(NFS_SERVER(inode),
2015                                 _nfs4_proc_link(inode, dir, name),
2016                                 &exception);
2017         } while (exception.retry);
2018         return err;
2019 }
2020
2021 static int _nfs4_proc_symlink(struct inode *dir, struct qstr *name,
2022                 struct qstr *path, struct iattr *sattr, struct nfs_fh *fhandle,
2023                 struct nfs_fattr *fattr)
2024 {
2025         struct nfs_server *server = NFS_SERVER(dir);
2026         struct nfs_fattr dir_fattr;
2027         struct nfs4_create_arg arg = {
2028                 .dir_fh = NFS_FH(dir),
2029                 .server = server,
2030                 .name = name,
2031                 .attrs = sattr,
2032                 .ftype = NF4LNK,
2033                 .bitmask = server->attr_bitmask,
2034         };
2035         struct nfs4_create_res res = {
2036                 .server = server,
2037                 .fh = fhandle,
2038                 .fattr = fattr,
2039                 .dir_fattr = &dir_fattr,
2040         };
2041         struct rpc_message msg = {
2042                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SYMLINK],
2043                 .rpc_argp = &arg,
2044                 .rpc_resp = &res,
2045         };
2046         int                     status;
2047
2048         if (path->len > NFS4_MAXPATHLEN)
2049                 return -ENAMETOOLONG;
2050         arg.u.symlink = path;
2051         nfs_fattr_init(fattr);
2052         nfs_fattr_init(&dir_fattr);
2053         
2054         status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
2055         if (!status)
2056                 update_changeattr(dir, &res.dir_cinfo);
2057         nfs_post_op_update_inode(dir, res.dir_fattr);
2058         return status;
2059 }
2060
2061 static int nfs4_proc_symlink(struct inode *dir, struct qstr *name,
2062                 struct qstr *path, struct iattr *sattr, struct nfs_fh *fhandle,
2063                 struct nfs_fattr *fattr)
2064 {
2065         struct nfs4_exception exception = { };
2066         int err;
2067         do {
2068                 err = nfs4_handle_exception(NFS_SERVER(dir),
2069                                 _nfs4_proc_symlink(dir, name, path, sattr,
2070                                         fhandle, fattr),
2071                                 &exception);
2072         } while (exception.retry);
2073         return err;
2074 }
2075
2076 static int _nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
2077                 struct iattr *sattr)
2078 {
2079         struct nfs_server *server = NFS_SERVER(dir);
2080         struct nfs_fh fhandle;
2081         struct nfs_fattr fattr, dir_fattr;
2082         struct nfs4_create_arg arg = {
2083                 .dir_fh = NFS_FH(dir),
2084                 .server = server,
2085                 .name = &dentry->d_name,
2086                 .attrs = sattr,
2087                 .ftype = NF4DIR,
2088                 .bitmask = server->attr_bitmask,
2089         };
2090         struct nfs4_create_res res = {
2091                 .server = server,
2092                 .fh = &fhandle,
2093                 .fattr = &fattr,
2094                 .dir_fattr = &dir_fattr,
2095         };
2096         struct rpc_message msg = {
2097                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE],
2098                 .rpc_argp = &arg,
2099                 .rpc_resp = &res,
2100         };
2101         int                     status;
2102
2103         nfs_fattr_init(&fattr);
2104         nfs_fattr_init(&dir_fattr);
2105         
2106         status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
2107         if (!status) {
2108                 update_changeattr(dir, &res.dir_cinfo);
2109                 nfs_post_op_update_inode(dir, res.dir_fattr);
2110                 status = nfs_instantiate(dentry, &fhandle, &fattr);
2111         }
2112         return status;
2113 }
2114
2115 static int nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
2116                 struct iattr *sattr)
2117 {
2118         struct nfs4_exception exception = { };
2119         int err;
2120         do {
2121                 err = nfs4_handle_exception(NFS_SERVER(dir),
2122                                 _nfs4_proc_mkdir(dir, dentry, sattr),
2123                                 &exception);
2124         } while (exception.retry);
2125         return err;
2126 }
2127
2128 static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
2129                   u64 cookie, struct page *page, unsigned int count, int plus)
2130 {
2131         struct inode            *dir = dentry->d_inode;
2132         struct nfs4_readdir_arg args = {
2133                 .fh = NFS_FH(dir),
2134                 .pages = &page,
2135                 .pgbase = 0,
2136                 .count = count,
2137                 .bitmask = NFS_SERVER(dentry->d_inode)->attr_bitmask,
2138         };
2139         struct nfs4_readdir_res res;
2140         struct rpc_message msg = {
2141                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR],
2142                 .rpc_argp = &args,
2143                 .rpc_resp = &res,
2144                 .rpc_cred = cred,
2145         };
2146         int                     status;
2147
2148         dprintk("%s: dentry = %s/%s, cookie = %Lu\n", __FUNCTION__,
2149                         dentry->d_parent->d_name.name,
2150                         dentry->d_name.name,
2151                         (unsigned long long)cookie);
2152         lock_kernel();
2153         nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args);
2154         res.pgbase = args.pgbase;
2155         status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
2156         if (status == 0)
2157                 memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE);
2158         unlock_kernel();
2159         dprintk("%s: returns %d\n", __FUNCTION__, status);
2160         return status;
2161 }
2162
2163 static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
2164                   u64 cookie, struct page *page, unsigned int count, int plus)
2165 {
2166         struct nfs4_exception exception = { };
2167         int err;
2168         do {
2169                 err = nfs4_handle_exception(NFS_SERVER(dentry->d_inode),
2170                                 _nfs4_proc_readdir(dentry, cred, cookie,
2171                                         page, count, plus),
2172                                 &exception);
2173         } while (exception.retry);
2174         return err;
2175 }
2176
2177 static int _nfs4_proc_mknod(struct inode *dir, struct dentry *dentry,
2178                 struct iattr *sattr, dev_t rdev)
2179 {
2180         struct nfs_server *server = NFS_SERVER(dir);
2181         struct nfs_fh fh;
2182         struct nfs_fattr fattr, dir_fattr;
2183         struct nfs4_create_arg arg = {
2184                 .dir_fh = NFS_FH(dir),
2185                 .server = server,
2186                 .name = &dentry->d_name,
2187                 .attrs = sattr,
2188                 .bitmask = server->attr_bitmask,
2189         };
2190         struct nfs4_create_res res = {
2191                 .server = server,
2192                 .fh = &fh,
2193                 .fattr = &fattr,
2194                 .dir_fattr = &dir_fattr,
2195         };
2196         struct rpc_message msg = {
2197                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE],
2198                 .rpc_argp = &arg,
2199                 .rpc_resp = &res,
2200         };
2201         int                     status;
2202         int                     mode = sattr->ia_mode;
2203
2204         nfs_fattr_init(&fattr);
2205         nfs_fattr_init(&dir_fattr);
2206
2207         BUG_ON(!(sattr->ia_valid & ATTR_MODE));
2208         BUG_ON(!S_ISFIFO(mode) && !S_ISBLK(mode) && !S_ISCHR(mode) && !S_ISSOCK(mode));
2209         if (S_ISFIFO(mode))
2210                 arg.ftype = NF4FIFO;
2211         else if (S_ISBLK(mode)) {
2212                 arg.ftype = NF4BLK;
2213                 arg.u.device.specdata1 = MAJOR(rdev);
2214                 arg.u.device.specdata2 = MINOR(rdev);
2215         }
2216         else if (S_ISCHR(mode)) {
2217                 arg.ftype = NF4CHR;
2218                 arg.u.device.specdata1 = MAJOR(rdev);
2219                 arg.u.device.specdata2 = MINOR(rdev);
2220         }
2221         else
2222                 arg.ftype = NF4SOCK;
2223         
2224         status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0);
2225         if (status == 0) {
2226                 update_changeattr(dir, &res.dir_cinfo);
2227                 nfs_post_op_update_inode(dir, res.dir_fattr);
2228                 status = nfs_instantiate(dentry, &fh, &fattr);
2229         }
2230         return status;
2231 }
2232
2233 static int nfs4_proc_mknod(struct inode *dir, struct dentry *dentry,
2234                 struct iattr *sattr, dev_t rdev)
2235 {
2236         struct nfs4_exception exception = { };
2237         int err;
2238         do {
2239                 err = nfs4_handle_exception(NFS_SERVER(dir),
2240                                 _nfs4_proc_mknod(dir, dentry, sattr, rdev),
2241                                 &exception);
2242         } while (exception.retry);
2243         return err;
2244 }
2245
2246 static int _nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
2247                  struct nfs_fsstat *fsstat)
2248 {
2249         struct nfs4_statfs_arg args = {
2250                 .fh = fhandle,
2251                 .bitmask = server->attr_bitmask,
2252         };
2253         struct rpc_message msg = {
2254                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_STATFS],
2255                 .rpc_argp = &args,
2256                 .rpc_resp = fsstat,
2257         };
2258
2259         nfs_fattr_init(fsstat->fattr);
2260         return rpc_call_sync(server->client, &msg, 0);
2261 }
2262
2263 static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat)
2264 {
2265         struct nfs4_exception exception = { };
2266         int err;
2267         do {
2268                 err = nfs4_handle_exception(server,
2269                                 _nfs4_proc_statfs(server, fhandle, fsstat),
2270                                 &exception);
2271         } while (exception.retry);
2272         return err;
2273 }
2274
2275 static int _nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
2276                 struct nfs_fsinfo *fsinfo)
2277 {
2278         struct nfs4_fsinfo_arg args = {
2279                 .fh = fhandle,
2280                 .bitmask = server->attr_bitmask,
2281         };
2282         struct rpc_message msg = {
2283                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSINFO],
2284                 .rpc_argp = &args,
2285                 .rpc_resp = fsinfo,
2286         };
2287
2288         return rpc_call_sync(server->client, &msg, 0);
2289 }
2290
2291 static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
2292 {
2293         struct nfs4_exception exception = { };
2294         int err;
2295
2296         do {
2297                 err = nfs4_handle_exception(server,
2298                                 _nfs4_do_fsinfo(server, fhandle, fsinfo),
2299                                 &exception);
2300         } while (exception.retry);
2301         return err;
2302 }
2303
2304 static int nfs4_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
2305 {
2306         nfs_fattr_init(fsinfo->fattr);
2307         return nfs4_do_fsinfo(server, fhandle, fsinfo);
2308 }
2309
2310 static int _nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
2311                 struct nfs_pathconf *pathconf)
2312 {
2313         struct nfs4_pathconf_arg args = {
2314                 .fh = fhandle,
2315                 .bitmask = server->attr_bitmask,
2316         };
2317         struct rpc_message msg = {
2318                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_PATHCONF],
2319                 .rpc_argp = &args,
2320                 .rpc_resp = pathconf,
2321         };
2322
2323         /* None of the pathconf attributes are mandatory to implement */
2324         if ((args.bitmask[0] & nfs4_pathconf_bitmap[0]) == 0) {
2325                 memset(pathconf, 0, sizeof(*pathconf));
2326                 return 0;
2327         }
2328
2329         nfs_fattr_init(pathconf->fattr);
2330         return rpc_call_sync(server->client, &msg, 0);
2331 }
2332
2333 static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
2334                 struct nfs_pathconf *pathconf)
2335 {
2336         struct nfs4_exception exception = { };
2337         int err;
2338
2339         do {
2340                 err = nfs4_handle_exception(server,
2341                                 _nfs4_proc_pathconf(server, fhandle, pathconf),
2342                                 &exception);
2343         } while (exception.retry);
2344         return err;
2345 }
2346
2347 static int nfs4_read_done(struct rpc_task *task, struct nfs_read_data *data)
2348 {
2349         struct nfs_server *server = NFS_SERVER(data->inode);
2350
2351         if (nfs4_async_handle_error(task, server) == -EAGAIN) {
2352                 rpc_restart_call(task);
2353                 return -EAGAIN;
2354         }
2355         if (task->tk_status > 0)
2356                 renew_lease(server, data->timestamp);
2357         return 0;
2358 }
2359
2360 static void nfs4_proc_read_setup(struct nfs_read_data *data)
2361 {
2362         struct rpc_message msg = {
2363                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ],
2364                 .rpc_argp = &data->args,
2365                 .rpc_resp = &data->res,
2366                 .rpc_cred = data->cred,
2367         };
2368
2369         data->timestamp   = jiffies;
2370
2371         rpc_call_setup(&data->task, &msg, 0);
2372 }
2373
2374 static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data)
2375 {
2376         struct inode *inode = data->inode;
2377         
2378         if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) {
2379                 rpc_restart_call(task);
2380                 return -EAGAIN;
2381         }
2382         if (task->tk_status >= 0) {
2383                 renew_lease(NFS_SERVER(inode), data->timestamp);
2384                 nfs_post_op_update_inode(inode, data->res.fattr);
2385         }
2386         return 0;
2387 }
2388
2389 static void nfs4_proc_write_setup(struct nfs_write_data *data, int how)
2390 {
2391         struct rpc_message msg = {
2392                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE],
2393                 .rpc_argp = &data->args,
2394                 .rpc_resp = &data->res,
2395                 .rpc_cred = data->cred,
2396         };
2397         struct inode *inode = data->inode;
2398         struct nfs_server *server = NFS_SERVER(inode);
2399         int stable;
2400         
2401         if (how & FLUSH_STABLE) {
2402                 if (!NFS_I(inode)->ncommit)
2403                         stable = NFS_FILE_SYNC;
2404                 else
2405                         stable = NFS_DATA_SYNC;
2406         } else
2407                 stable = NFS_UNSTABLE;
2408         data->args.stable = stable;
2409         data->args.bitmask = server->attr_bitmask;
2410         data->res.server = server;
2411
2412         data->timestamp   = jiffies;
2413
2414         /* Finalize the task. */
2415         rpc_call_setup(&data->task, &msg, 0);
2416 }
2417
2418 static int nfs4_commit_done(struct rpc_task *task, struct nfs_write_data *data)
2419 {
2420         struct inode *inode = data->inode;
2421         
2422         if (nfs4_async_handle_error(task, NFS_SERVER(inode)) == -EAGAIN) {
2423                 rpc_restart_call(task);
2424                 return -EAGAIN;
2425         }
2426         if (task->tk_status >= 0)
2427                 nfs_post_op_update_inode(inode, data->res.fattr);
2428         return 0;
2429 }
2430
2431 static void nfs4_proc_commit_setup(struct nfs_write_data *data, int how)
2432 {
2433         struct rpc_message msg = {
2434                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT],
2435                 .rpc_argp = &data->args,
2436                 .rpc_resp = &data->res,
2437                 .rpc_cred = data->cred,
2438         };      
2439         struct nfs_server *server = NFS_SERVER(data->inode);
2440         
2441         data->args.bitmask = server->attr_bitmask;
2442         data->res.server = server;
2443
2444         rpc_call_setup(&data->task, &msg, 0);
2445 }
2446
2447 /*
2448  * nfs4_proc_async_renew(): This is not one of the nfs_rpc_ops; it is a special
2449  * standalone procedure for queueing an asynchronous RENEW.
2450  */
2451 static void nfs4_renew_done(struct rpc_task *task, void *data)
2452 {
2453         struct nfs4_client *clp = (struct nfs4_client *)task->tk_msg.rpc_argp;
2454         unsigned long timestamp = (unsigned long)data;
2455
2456         if (task->tk_status < 0) {
2457                 switch (task->tk_status) {
2458                         case -NFS4ERR_STALE_CLIENTID:
2459                         case -NFS4ERR_EXPIRED:
2460                         case -NFS4ERR_CB_PATH_DOWN:
2461                                 nfs4_schedule_state_recovery(clp);
2462                 }
2463                 return;
2464         }
2465         spin_lock(&clp->cl_lock);
2466         if (time_before(clp->cl_last_renewal,timestamp))
2467                 clp->cl_last_renewal = timestamp;
2468         spin_unlock(&clp->cl_lock);
2469 }
2470
2471 static const struct rpc_call_ops nfs4_renew_ops = {
2472         .rpc_call_done = nfs4_renew_done,
2473 };
2474
2475 int nfs4_proc_async_renew(struct nfs4_client *clp, struct rpc_cred *cred)
2476 {
2477         struct rpc_message msg = {
2478                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
2479                 .rpc_argp       = clp,
2480                 .rpc_cred       = cred,
2481         };
2482
2483         return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT,
2484                         &nfs4_renew_ops, (void *)jiffies);
2485 }
2486
2487 int nfs4_proc_renew(struct nfs4_client *clp, struct rpc_cred *cred)
2488 {
2489         struct rpc_message msg = {
2490                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
2491                 .rpc_argp       = clp,
2492                 .rpc_cred       = cred,
2493         };
2494         unsigned long now = jiffies;
2495         int status;
2496
2497         status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
2498         if (status < 0)
2499                 return status;
2500         spin_lock(&clp->cl_lock);
2501         if (time_before(clp->cl_last_renewal,now))
2502                 clp->cl_last_renewal = now;
2503         spin_unlock(&clp->cl_lock);
2504         return 0;
2505 }
2506
2507 static inline int nfs4_server_supports_acls(struct nfs_server *server)
2508 {
2509         return (server->caps & NFS_CAP_ACLS)
2510                 && (server->acl_bitmask & ACL4_SUPPORT_ALLOW_ACL)
2511                 && (server->acl_bitmask & ACL4_SUPPORT_DENY_ACL);
2512 }
2513
2514 /* Assuming that XATTR_SIZE_MAX is a multiple of PAGE_CACHE_SIZE, and that
2515  * it's OK to put sizeof(void) * (XATTR_SIZE_MAX/PAGE_CACHE_SIZE) bytes on
2516  * the stack.
2517  */
2518 #define NFS4ACL_MAXPAGES (XATTR_SIZE_MAX >> PAGE_CACHE_SHIFT)
2519
2520 static void buf_to_pages(const void *buf, size_t buflen,
2521                 struct page **pages, unsigned int *pgbase)
2522 {
2523         const void *p = buf;
2524
2525         *pgbase = offset_in_page(buf);
2526         p -= *pgbase;
2527         while (p < buf + buflen) {
2528                 *(pages++) = virt_to_page(p);
2529                 p += PAGE_CACHE_SIZE;
2530         }
2531 }
2532
2533 struct nfs4_cached_acl {
2534         int cached;
2535         size_t len;
2536         char data[0];
2537 };
2538
2539 static void nfs4_set_cached_acl(struct inode *inode, struct nfs4_cached_acl *acl)
2540 {
2541         struct nfs_inode *nfsi = NFS_I(inode);
2542
2543         spin_lock(&inode->i_lock);
2544         kfree(nfsi->nfs4_acl);
2545         nfsi->nfs4_acl = acl;
2546         spin_unlock(&inode->i_lock);
2547 }
2548
2549 static void nfs4_zap_acl_attr(struct inode *inode)
2550 {
2551         nfs4_set_cached_acl(inode, NULL);
2552 }
2553
2554 static inline ssize_t nfs4_read_cached_acl(struct inode *inode, char *buf, size_t buflen)
2555 {
2556         struct nfs_inode *nfsi = NFS_I(inode);
2557         struct nfs4_cached_acl *acl;
2558         int ret = -ENOENT;
2559
2560         spin_lock(&inode->i_lock);
2561         acl = nfsi->nfs4_acl;
2562         if (acl == NULL)
2563                 goto out;
2564         if (buf == NULL) /* user is just asking for length */
2565                 goto out_len;
2566         if (acl->cached == 0)
2567                 goto out;
2568         ret = -ERANGE; /* see getxattr(2) man page */
2569         if (acl->len > buflen)
2570                 goto out;
2571         memcpy(buf, acl->data, acl->len);
2572 out_len:
2573         ret = acl->len;
2574 out:
2575         spin_unlock(&inode->i_lock);
2576         return ret;
2577 }
2578
2579 static void nfs4_write_cached_acl(struct inode *inode, const char *buf, size_t acl_len)
2580 {
2581         struct nfs4_cached_acl *acl;
2582
2583         if (buf && acl_len <= PAGE_SIZE) {
2584                 acl = kmalloc(sizeof(*acl) + acl_len, GFP_KERNEL);
2585                 if (acl == NULL)
2586                         goto out;
2587                 acl->cached = 1;
2588                 memcpy(acl->data, buf, acl_len);
2589         } else {
2590                 acl = kmalloc(sizeof(*acl), GFP_KERNEL);
2591                 if (acl == NULL)
2592                         goto out;
2593                 acl->cached = 0;
2594         }
2595         acl->len = acl_len;
2596 out:
2597         nfs4_set_cached_acl(inode, acl);
2598 }
2599
2600 static inline ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
2601 {
2602         struct page *pages[NFS4ACL_MAXPAGES];
2603         struct nfs_getaclargs args = {
2604                 .fh = NFS_FH(inode),
2605                 .acl_pages = pages,
2606                 .acl_len = buflen,
2607         };
2608         size_t resp_len = buflen;
2609         void *resp_buf;
2610         struct rpc_message msg = {
2611                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETACL],
2612                 .rpc_argp = &args,
2613                 .rpc_resp = &resp_len,
2614         };
2615         struct page *localpage = NULL;
2616         int ret;
2617
2618         if (buflen < PAGE_SIZE) {
2619                 /* As long as we're doing a round trip to the server anyway,
2620                  * let's be prepared for a page of acl data. */
2621                 localpage = alloc_page(GFP_KERNEL);
2622                 resp_buf = page_address(localpage);
2623                 if (localpage == NULL)
2624                         return -ENOMEM;
2625                 args.acl_pages[0] = localpage;
2626                 args.acl_pgbase = 0;
2627                 resp_len = args.acl_len = PAGE_SIZE;
2628         } else {
2629                 resp_buf = buf;
2630                 buf_to_pages(buf, buflen, args.acl_pages, &args.acl_pgbase);
2631         }
2632         ret = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);
2633         if (ret)
2634                 goto out_free;
2635         if (resp_len > args.acl_len)
2636                 nfs4_write_cached_acl(inode, NULL, resp_len);
2637         else
2638                 nfs4_write_cached_acl(inode, resp_buf, resp_len);
2639         if (buf) {
2640                 ret = -ERANGE;
2641                 if (resp_len > buflen)
2642                         goto out_free;
2643                 if (localpage)
2644                         memcpy(buf, resp_buf, resp_len);
2645         }
2646         ret = resp_len;
2647 out_free:
2648         if (localpage)
2649                 __free_page(localpage);
2650         return ret;
2651 }
2652
2653 static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen)
2654 {
2655         struct nfs_server *server = NFS_SERVER(inode);
2656         int ret;
2657
2658         if (!nfs4_server_supports_acls(server))
2659                 return -EOPNOTSUPP;
2660         ret = nfs_revalidate_inode(server, inode);
2661         if (ret < 0)
2662                 return ret;
2663         ret = nfs4_read_cached_acl(inode, buf, buflen);
2664         if (ret != -ENOENT)
2665                 return ret;
2666         return nfs4_get_acl_uncached(inode, buf, buflen);
2667 }
2668
2669 static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen)
2670 {
2671         struct nfs_server *server = NFS_SERVER(inode);
2672         struct page *pages[NFS4ACL_MAXPAGES];
2673         struct nfs_setaclargs arg = {
2674                 .fh             = NFS_FH(inode),
2675                 .acl_pages      = pages,
2676                 .acl_len        = buflen,
2677         };
2678         struct rpc_message msg = {
2679                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_SETACL],
2680                 .rpc_argp       = &arg,
2681                 .rpc_resp       = NULL,
2682         };
2683         int ret;
2684
2685         if (!nfs4_server_supports_acls(server))
2686                 return -EOPNOTSUPP;
2687         nfs_inode_return_delegation(inode);
2688         buf_to_pages(buf, buflen, arg.acl_pages, &arg.acl_pgbase);
2689         ret = rpc_call_sync(NFS_SERVER(inode)->client, &msg, 0);
2690         if (ret == 0)
2691                 nfs4_write_cached_acl(inode, buf, buflen);
2692         return ret;
2693 }
2694
2695 static int
2696 nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server)
2697 {
2698         struct nfs4_client *clp = server->nfs4_state;
2699
2700         if (!clp || task->tk_status >= 0)
2701                 return 0;
2702         switch(task->tk_status) {
2703                 case -NFS4ERR_STALE_CLIENTID:
2704                 case -NFS4ERR_STALE_STATEID:
2705                 case -NFS4ERR_EXPIRED:
2706                         rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL, NULL);
2707                         nfs4_schedule_state_recovery(clp);
2708                         if (test_bit(NFS4CLNT_STATE_RECOVER, &clp->cl_state) == 0)
2709                                 rpc_wake_up_task(task);
2710                         task->tk_status = 0;
2711                         return -EAGAIN;
2712                 case -NFS4ERR_DELAY:
2713                         nfs_inc_server_stats((struct nfs_server *) server,
2714                                                 NFSIOS_DELAY);
2715                 case -NFS4ERR_GRACE:
2716                         rpc_delay(task, NFS4_POLL_RETRY_MAX);
2717                         task->tk_status = 0;
2718                         return -EAGAIN;
2719                 case -NFS4ERR_OLD_STATEID:
2720                         task->tk_status = 0;
2721                         return -EAGAIN;
2722         }
2723         task->tk_status = nfs4_map_errors(task->tk_status);
2724         return 0;
2725 }
2726
2727 static int nfs4_wait_bit_interruptible(void *word)
2728 {
2729         if (signal_pending(current))
2730                 return -ERESTARTSYS;
2731         schedule();
2732         return 0;
2733 }
2734
2735 static int nfs4_wait_clnt_recover(struct rpc_clnt *clnt, struct nfs4_client *clp)
2736 {
2737         sigset_t oldset;
2738         int res;
2739
2740         might_sleep();
2741
2742         rpc_clnt_sigmask(clnt, &oldset);
2743         res = wait_on_bit(&clp->cl_state, NFS4CLNT_STATE_RECOVER,
2744                         nfs4_wait_bit_interruptible,
2745                         TASK_INTERRUPTIBLE);
2746         rpc_clnt_sigunmask(clnt, &oldset);
2747         return res;
2748 }
2749
2750 static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
2751 {
2752         sigset_t oldset;
2753         int res = 0;
2754
2755         might_sleep();
2756
2757         if (*timeout <= 0)
2758                 *timeout = NFS4_POLL_RETRY_MIN;
2759         if (*timeout > NFS4_POLL_RETRY_MAX)
2760                 *timeout = NFS4_POLL_RETRY_MAX;
2761         rpc_clnt_sigmask(clnt, &oldset);
2762         if (clnt->cl_intr) {
2763                 schedule_timeout_interruptible(*timeout);
2764                 if (signalled())
2765                         res = -ERESTARTSYS;
2766         } else
2767                 schedule_timeout_uninterruptible(*timeout);
2768         rpc_clnt_sigunmask(clnt, &oldset);
2769         *timeout <<= 1;
2770         return res;
2771 }
2772
2773 /* This is the error handling routine for processes that are allowed
2774  * to sleep.
2775  */
2776 int nfs4_handle_exception(const struct nfs_server *server, int errorcode, struct nfs4_exception *exception)
2777 {
2778         struct nfs4_client *clp = server->nfs4_state;
2779         int ret = errorcode;
2780
2781         exception->retry = 0;
2782         switch(errorcode) {
2783                 case 0:
2784                         return 0;
2785                 case -NFS4ERR_STALE_CLIENTID:
2786                 case -NFS4ERR_STALE_STATEID:
2787                 case -NFS4ERR_EXPIRED:
2788                         nfs4_schedule_state_recovery(clp);
2789                         ret = nfs4_wait_clnt_recover(server->client, clp);
2790                         if (ret == 0)
2791                                 exception->retry = 1;
2792                         break;
2793                 case -NFS4ERR_GRACE:
2794                 case -NFS4ERR_DELAY:
2795                         ret = nfs4_delay(server->client, &exception->timeout);
2796                         if (ret != 0)
2797                                 break;
2798                 case -NFS4ERR_OLD_STATEID:
2799                         exception->retry = 1;
2800         }
2801         /* We failed to handle the error */
2802         return nfs4_map_errors(ret);
2803 }
2804
2805 int nfs4_proc_setclientid(struct nfs4_client *clp, u32 program, unsigned short port, struct rpc_cred *cred)
2806 {
2807         nfs4_verifier sc_verifier;
2808         struct nfs4_setclientid setclientid = {
2809                 .sc_verifier = &sc_verifier,
2810                 .sc_prog = program,
2811         };
2812         struct rpc_message msg = {
2813                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID],
2814                 .rpc_argp = &setclientid,
2815                 .rpc_resp = clp,
2816                 .rpc_cred = cred,
2817         };
2818         u32 *p;
2819         int loop = 0;
2820         int status;
2821
2822         p = (u32*)sc_verifier.data;
2823         *p++ = htonl((u32)clp->cl_boot_time.tv_sec);
2824         *p = htonl((u32)clp->cl_boot_time.tv_nsec);
2825
2826         for(;;) {
2827                 setclientid.sc_name_len = scnprintf(setclientid.sc_name,
2828                                 sizeof(setclientid.sc_name), "%s/%u.%u.%u.%u %s %u",
2829                                 clp->cl_ipaddr, NIPQUAD(clp->cl_addr.s_addr),
2830                                 cred->cr_ops->cr_name,
2831                                 clp->cl_id_uniquifier);
2832                 setclientid.sc_netid_len = scnprintf(setclientid.sc_netid,
2833                                 sizeof(setclientid.sc_netid), "tcp");
2834                 setclientid.sc_uaddr_len = scnprintf(setclientid.sc_uaddr,
2835                                 sizeof(setclientid.sc_uaddr), "%s.%d.%d",
2836                                 clp->cl_ipaddr, port >> 8, port & 255);
2837
2838                 status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
2839                 if (status != -NFS4ERR_CLID_INUSE)
2840                         break;
2841                 if (signalled())
2842                         break;
2843                 if (loop++ & 1)
2844                         ssleep(clp->cl_lease_time + 1);
2845                 else
2846                         if (++clp->cl_id_uniquifier == 0)
2847                                 break;
2848         }
2849         return status;
2850 }
2851
2852 static int _nfs4_proc_setclientid_confirm(struct nfs4_client *clp, struct rpc_cred *cred)
2853 {
2854         struct nfs_fsinfo fsinfo;
2855         struct rpc_message msg = {
2856                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID_CONFIRM],
2857                 .rpc_argp = clp,
2858                 .rpc_resp = &fsinfo,
2859                 .rpc_cred = cred,
2860         };
2861         unsigned long now;
2862         int status;
2863
2864         now = jiffies;
2865         status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
2866         if (status == 0) {
2867                 spin_lock(&clp->cl_lock);
2868                 clp->cl_lease_time = fsinfo.lease_time * HZ;
2869                 clp->cl_last_renewal = now;
2870                 clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state);
2871                 spin_unlock(&clp->cl_lock);
2872         }
2873         return status;
2874 }
2875
2876 int nfs4_proc_setclientid_confirm(struct nfs4_client *clp, struct rpc_cred *cred)
2877 {
2878         long timeout;
2879         int err;
2880         do {
2881                 err = _nfs4_proc_setclientid_confirm(clp, cred);
2882                 switch (err) {
2883                         case 0:
2884                                 return err;
2885                         case -NFS4ERR_RESOURCE:
2886                                 /* The IBM lawyers misread another document! */
2887                         case -NFS4ERR_DELAY:
2888                                 err = nfs4_delay(clp->cl_rpcclient, &timeout);
2889                 }
2890         } while (err == 0);
2891         return err;
2892 }
2893
2894 struct nfs4_delegreturndata {
2895         struct nfs4_delegreturnargs args;
2896         struct nfs4_delegreturnres res;
2897         struct nfs_fh fh;
2898         nfs4_stateid stateid;
2899         struct rpc_cred *cred;
2900         unsigned long timestamp;
2901         struct nfs_fattr fattr;
2902         int rpc_status;
2903 };
2904
2905 static void nfs4_delegreturn_prepare(struct rpc_task *task, void *calldata)
2906 {
2907         struct nfs4_delegreturndata *data = calldata;
2908         struct rpc_message msg = {
2909                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN],
2910                 .rpc_argp = &data->args,
2911                 .rpc_resp = &data->res,
2912                 .rpc_cred = data->cred,
2913         };
2914         nfs_fattr_init(data->res.fattr);
2915         rpc_call_setup(task, &msg, 0);
2916 }
2917
2918 static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
2919 {
2920         struct nfs4_delegreturndata *data = calldata;
2921         data->rpc_status = task->tk_status;
2922         if (data->rpc_status == 0)
2923                 renew_lease(data->res.server, data->timestamp);
2924 }
2925
2926 static void nfs4_delegreturn_release(void *calldata)
2927 {
2928         struct nfs4_delegreturndata *data = calldata;
2929
2930         put_rpccred(data->cred);
2931         kfree(calldata);
2932 }
2933
2934 static const struct rpc_call_ops nfs4_delegreturn_ops = {
2935         .rpc_call_prepare = nfs4_delegreturn_prepare,
2936         .rpc_call_done = nfs4_delegreturn_done,
2937         .rpc_release = nfs4_delegreturn_release,
2938 };
2939
2940 static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid)
2941 {
2942         struct nfs4_delegreturndata *data;
2943         struct nfs_server *server = NFS_SERVER(inode);
2944         struct rpc_task *task;
2945         int status;
2946
2947         data = kmalloc(sizeof(*data), GFP_KERNEL);
2948         if (data == NULL)
2949                 return -ENOMEM;
2950         data->args.fhandle = &data->fh;
2951         data->args.stateid = &data->stateid;
2952         data->args.bitmask = server->attr_bitmask;
2953         nfs_copy_fh(&data->fh, NFS_FH(inode));
2954         memcpy(&data->stateid, stateid, sizeof(data->stateid));
2955         data->res.fattr = &data->fattr;
2956         data->res.server = server;
2957         data->cred = get_rpccred(cred);
2958         data->timestamp = jiffies;
2959         data->rpc_status = 0;
2960
2961         task = rpc_run_task(NFS_CLIENT(inode), RPC_TASK_ASYNC, &nfs4_delegreturn_ops, data);
2962         if (IS_ERR(task)) {
2963                 nfs4_delegreturn_release(data);
2964                 return PTR_ERR(task);
2965         }
2966         status = nfs4_wait_for_completion_rpc_task(task);
2967         if (status == 0) {
2968                 status = data->rpc_status;
2969                 if (status == 0)
2970                         nfs_post_op_update_inode(inode, &data->fattr);
2971         }
2972         rpc_release_task(task);
2973         return status;
2974 }
2975
2976 int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid)
2977 {
2978         struct nfs_server *server = NFS_SERVER(inode);
2979         struct nfs4_exception exception = { };
2980         int err;
2981         do {
2982                 err = _nfs4_proc_delegreturn(inode, cred, stateid);
2983                 switch (err) {
2984                         case -NFS4ERR_STALE_STATEID:
2985                         case -NFS4ERR_EXPIRED:
2986                                 nfs4_schedule_state_recovery(server->nfs4_state);
2987                         case 0:
2988                                 return 0;
2989                 }
2990                 err = nfs4_handle_exception(server, err, &exception);
2991         } while (exception.retry);
2992         return err;
2993 }
2994
2995 #define NFS4_LOCK_MINTIMEOUT (1 * HZ)
2996 #define NFS4_LOCK_MAXTIMEOUT (30 * HZ)
2997
2998 /* 
2999  * sleep, with exponential backoff, and retry the LOCK operation. 
3000  */
3001 static unsigned long
3002 nfs4_set_lock_task_retry(unsigned long timeout)
3003 {
3004         schedule_timeout_interruptible(timeout);
3005         timeout <<= 1;
3006         if (timeout > NFS4_LOCK_MAXTIMEOUT)
3007                 return NFS4_LOCK_MAXTIMEOUT;
3008         return timeout;
3009 }
3010
3011 static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
3012 {
3013         struct inode *inode = state->inode;
3014         struct nfs_server *server = NFS_SERVER(inode);
3015         struct nfs4_client *clp = server->nfs4_state;
3016         struct nfs_lockt_args arg = {
3017                 .fh = NFS_FH(inode),
3018                 .fl = request,
3019         };
3020         struct nfs_lockt_res res = {
3021                 .denied = request,
3022         };
3023         struct rpc_message msg = {
3024                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_LOCKT],
3025                 .rpc_argp       = &arg,
3026                 .rpc_resp       = &res,
3027                 .rpc_cred       = state->owner->so_cred,
3028         };
3029         struct nfs4_lock_state *lsp;
3030         int status;
3031
3032         down_read(&clp->cl_sem);
3033         arg.lock_owner.clientid = clp->cl_clientid;
3034         status = nfs4_set_lock_state(state, request);
3035         if (status != 0)
3036                 goto out;
3037         lsp = request->fl_u.nfs4_fl.owner;
3038         arg.lock_owner.id = lsp->ls_id; 
3039         status = rpc_call_sync(server->client, &msg, 0);
3040         switch (status) {
3041                 case 0:
3042                         request->fl_type = F_UNLCK;
3043                         break;
3044                 case -NFS4ERR_DENIED:
3045                         status = 0;
3046         }
3047 out:
3048         up_read(&clp->cl_sem);
3049         return status;
3050 }
3051
3052 static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
3053 {
3054         struct nfs4_exception exception = { };
3055         int err;
3056
3057         do {
3058                 err = nfs4_handle_exception(NFS_SERVER(state->inode),
3059                                 _nfs4_proc_getlk(state, cmd, request),
3060                                 &exception);
3061         } while (exception.retry);
3062         return err;
3063 }
3064
3065 static int do_vfs_lock(struct file *file, struct file_lock *fl)
3066 {
3067         int res = 0;
3068         switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) {
3069                 case FL_POSIX:
3070                         res = posix_lock_file_wait(file, fl);
3071                         break;
3072                 case FL_FLOCK:
3073                         res = flock_lock_file_wait(file, fl);
3074                         break;
3075                 default:
3076                         BUG();
3077         }
3078         if (res < 0)
3079                 printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n",
3080                                 __FUNCTION__);
3081         return res;
3082 }
3083
3084 struct nfs4_unlockdata {
3085         struct nfs_locku_args arg;
3086         struct nfs_locku_res res;
3087         struct nfs4_lock_state *lsp;
3088         struct nfs_open_context *ctx;
3089         struct file_lock fl;
3090         const struct nfs_server *server;
3091         unsigned long timestamp;
3092 };
3093
3094 static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl,
3095                 struct nfs_open_context *ctx,
3096                 struct nfs4_lock_state *lsp,
3097                 struct nfs_seqid *seqid)
3098 {
3099         struct nfs4_unlockdata *p;
3100         struct inode *inode = lsp->ls_state->inode;
3101
3102         p = kmalloc(sizeof(*p), GFP_KERNEL);
3103         if (p == NULL)
3104                 return NULL;
3105         p->arg.fh = NFS_FH(inode);
3106         p->arg.fl = &p->fl;
3107         p->arg.seqid = seqid;
3108         p->arg.stateid = &lsp->ls_stateid;
3109         p->lsp = lsp;
3110         atomic_inc(&lsp->ls_count);
3111         /* Ensure we don't close file until we're done freeing locks! */
3112         p->ctx = get_nfs_open_context(ctx);
3113         memcpy(&p->fl, fl, sizeof(p->fl));
3114         p->server = NFS_SERVER(inode);
3115         return p;
3116 }
3117
3118 static void nfs4_locku_release_calldata(void *data)
3119 {
3120         struct nfs4_unlockdata *calldata = data;
3121         nfs_free_seqid(calldata->arg.seqid);
3122         nfs4_put_lock_state(calldata->lsp);
3123         put_nfs_open_context(calldata->ctx);
3124         kfree(calldata);
3125 }
3126
3127 static void nfs4_locku_done(struct rpc_task *task, void *data)
3128 {
3129         struct nfs4_unlockdata *calldata = data;
3130
3131         if (RPC_ASSASSINATED(task))
3132                 return;
3133         nfs_increment_lock_seqid(task->tk_status, calldata->arg.seqid);
3134         switch (task->tk_status) {
3135                 case 0:
3136                         memcpy(calldata->lsp->ls_stateid.data,
3137                                         calldata->res.stateid.data,
3138                                         sizeof(calldata->lsp->ls_stateid.data));
3139                         renew_lease(calldata->server, calldata->timestamp);
3140                         break;
3141                 case -NFS4ERR_STALE_STATEID:
3142                 case -NFS4ERR_EXPIRED:
3143                         nfs4_schedule_state_recovery(calldata->server->nfs4_state);
3144                         break;
3145                 default:
3146                         if (nfs4_async_handle_error(task, calldata->server) == -EAGAIN) {
3147                                 rpc_restart_call(task);
3148                         }
3149         }
3150 }
3151
3152 static void nfs4_locku_prepare(struct rpc_task *task, void *data)
3153 {
3154         struct nfs4_unlockdata *calldata = data;
3155         struct rpc_message msg = {
3156                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_LOCKU],
3157                 .rpc_argp       = &calldata->arg,
3158                 .rpc_resp       = &calldata->res,
3159                 .rpc_cred       = calldata->lsp->ls_state->owner->so_cred,
3160         };
3161
3162         if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
3163                 return;
3164         if ((calldata->lsp->ls_flags & NFS_LOCK_INITIALIZED) == 0) {
3165                 /* Note: exit _without_ running nfs4_locku_done */
3166                 task->tk_action = NULL;
3167                 return;
3168         }
3169         calldata->timestamp = jiffies;
3170         rpc_call_setup(task, &msg, 0);
3171 }
3172
3173 static const struct rpc_call_ops nfs4_locku_ops = {
3174         .rpc_call_prepare = nfs4_locku_prepare,
3175         .rpc_call_done = nfs4_locku_done,
3176         .rpc_release = nfs4_locku_release_calldata,
3177 };
3178
3179 static struct rpc_task *nfs4_do_unlck(struct file_lock *fl,
3180                 struct nfs_open_context *ctx,
3181                 struct nfs4_lock_state *lsp,
3182                 struct nfs_seqid *seqid)
3183 {
3184         struct nfs4_unlockdata *data;
3185         struct rpc_task *task;
3186
3187         data = nfs4_alloc_unlockdata(fl, ctx, lsp, seqid);
3188         if (data == NULL) {
3189                 nfs_free_seqid(seqid);
3190                 return ERR_PTR(-ENOMEM);
3191         }
3192
3193         /* Unlock _before_ we do the RPC call */
3194         do_vfs_lock(fl->fl_file, fl);
3195         task = rpc_run_task(NFS_CLIENT(lsp->ls_state->inode), RPC_TASK_ASYNC, &nfs4_locku_ops, data);
3196         if (IS_ERR(task))
3197                 nfs4_locku_release_calldata(data);
3198         return task;
3199 }
3200
3201 static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request)
3202 {
3203         struct nfs_seqid *seqid;
3204         struct nfs4_lock_state *lsp;
3205         struct rpc_task *task;
3206         int status = 0;
3207
3208         /* Is this a delegated lock? */
3209         if (test_bit(NFS_DELEGATED_STATE, &state->flags))
3210                 goto out_unlock;
3211         /* Is this open_owner holding any locks on the server? */
3212         if (test_bit(LK_STATE_IN_USE, &state->flags) == 0)
3213                 goto out_unlock;
3214
3215         status = nfs4_set_lock_state(state, request);
3216         if (status != 0)
3217                 goto out_unlock;
3218         lsp = request->fl_u.nfs4_fl.owner;
3219         status = -ENOMEM;
3220         seqid = nfs_alloc_seqid(&lsp->ls_seqid);
3221         if (seqid == NULL)
3222                 goto out_unlock;
3223         task = nfs4_do_unlck(request, request->fl_file->private_data, lsp, seqid);
3224         status = PTR_ERR(task);
3225         if (IS_ERR(task))
3226                 goto out_unlock;
3227         status = nfs4_wait_for_completion_rpc_task(task);
3228         rpc_release_task(task);
3229         return status;
3230 out_unlock:
3231         do_vfs_lock(request->fl_file, request);
3232         return status;
3233 }
3234
3235 struct nfs4_lockdata {
3236         struct nfs_lock_args arg;
3237         struct nfs_lock_res res;
3238         struct nfs4_lock_state *lsp;
3239         struct nfs_open_context *ctx;
3240         struct file_lock fl;
3241         unsigned long timestamp;
3242         int rpc_status;
3243         int cancelled;
3244 };
3245
3246 static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl,
3247                 struct nfs_open_context *ctx, struct nfs4_lock_state *lsp)
3248 {
3249         struct nfs4_lockdata *p;
3250         struct inode *inode = lsp->ls_state->inode;
3251         struct nfs_server *server = NFS_SERVER(inode);
3252
3253         p = kzalloc(sizeof(*p), GFP_KERNEL);
3254         if (p == NULL)
3255                 return NULL;
3256
3257         p->arg.fh = NFS_FH(inode);
3258         p->arg.fl = &p->fl;
3259         p->arg.lock_seqid = nfs_alloc_seqid(&lsp->ls_seqid);
3260         if (p->arg.lock_seqid == NULL)
3261                 goto out_free;
3262         p->arg.lock_stateid = &lsp->ls_stateid;
3263         p->arg.lock_owner.clientid = server->nfs4_state->cl_clientid;
3264         p->arg.lock_owner.id = lsp->ls_id;
3265         p->lsp = lsp;
3266         atomic_inc(&lsp->ls_count);
3267         p->ctx = get_nfs_open_context(ctx);
3268         memcpy(&p->fl, fl, sizeof(p->fl));
3269         return p;
3270 out_free:
3271         kfree(p);
3272         return NULL;
3273 }
3274
3275 static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
3276 {
3277         struct nfs4_lockdata *data = calldata;
3278         struct nfs4_state *state = data->lsp->ls_state;
3279         struct nfs4_state_owner *sp = state->owner;
3280         struct rpc_message msg = {
3281                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK],
3282                 .rpc_argp = &data->arg,
3283                 .rpc_resp = &data->res,
3284                 .rpc_cred = sp->so_cred,
3285         };
3286
3287         if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0)
3288                 return;
3289         dprintk("%s: begin!\n", __FUNCTION__);
3290         /* Do we need to do an open_to_lock_owner? */
3291         if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)) {
3292                 data->arg.open_seqid = nfs_alloc_seqid(&sp->so_seqid);
3293                 if (data->arg.open_seqid == NULL) {
3294                         data->rpc_status = -ENOMEM;
3295                         task->tk_action = NULL;
3296                         goto out;
3297                 }
3298                 data->arg.open_stateid = &state->stateid;
3299                 data->arg.new_lock_owner = 1;
3300         }
3301         data->timestamp = jiffies;
3302         rpc_call_setup(task, &msg, 0);
3303 out:
3304         dprintk("%s: done!, ret = %d\n", __FUNCTION__, data->rpc_status);
3305 }
3306
3307 static void nfs4_lock_done(struct rpc_task *task, void *calldata)
3308 {
3309         struct nfs4_lockdata *data = calldata;
3310
3311         dprintk("%s: begin!\n", __FUNCTION__);
3312
3313         data->rpc_status = task->tk_status;
3314         if (RPC_ASSASSINATED(task))
3315                 goto out;
3316         if (data->arg.new_lock_owner != 0) {
3317                 nfs_increment_open_seqid(data->rpc_status, data->arg.open_seqid);
3318                 if (data->rpc_status == 0)
3319                         nfs_confirm_seqid(&data->lsp->ls_seqid, 0);
3320                 else
3321                         goto out;
3322         }
3323         if (data->rpc_status == 0) {
3324                 memcpy(data->lsp->ls_stateid.data, data->res.stateid.data,
3325                                         sizeof(data->lsp->ls_stateid.data));
3326                 data->lsp->ls_flags |= NFS_LOCK_INITIALIZED;
3327                 renew_lease(NFS_SERVER(data->ctx->dentry->d_inode), data->timestamp);
3328         }
3329         nfs_increment_lock_seqid(data->rpc_status, data->arg.lock_seqid);
3330 out:
3331         dprintk("%s: done, ret = %d!\n", __FUNCTION__, data->rpc_status);
3332 }
3333
3334 static void nfs4_lock_release(void *calldata)
3335 {
3336         struct nfs4_lockdata *data = calldata;
3337
3338         dprintk("%s: begin!\n", __FUNCTION__);
3339         if (data->arg.open_seqid != NULL)
3340                 nfs_free_seqid(data->arg.open_seqid);
3341         if (data->cancelled != 0) {
3342                 struct rpc_task *task;
3343                 task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp,
3344                                 data->arg.lock_seqid);
3345                 if (!IS_ERR(task))
3346                         rpc_release_task(task);
3347                 dprintk("%s: cancelling lock!\n", __FUNCTION__);
3348         } else
3349                 nfs_free_seqid(data->arg.lock_seqid);
3350         nfs4_put_lock_state(data->lsp);
3351         put_nfs_open_context(data->ctx);
3352         kfree(data);
3353         dprintk("%s: done!\n", __FUNCTION__);
3354 }
3355
3356 static const struct rpc_call_ops nfs4_lock_ops = {
3357         .rpc_call_prepare = nfs4_lock_prepare,
3358         .rpc_call_done = nfs4_lock_done,
3359         .rpc_release = nfs4_lock_release,
3360 };
3361
3362 static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int reclaim)
3363 {
3364         struct nfs4_lockdata *data;
3365         struct rpc_task *task;
3366         int ret;
3367
3368         dprintk("%s: begin!\n", __FUNCTION__);
3369         data = nfs4_alloc_lockdata(fl, fl->fl_file->private_data,
3370                         fl->fl_u.nfs4_fl.owner);
3371         if (data == NULL)
3372                 return -ENOMEM;
3373         if (IS_SETLKW(cmd))
3374                 data->arg.block = 1;
3375         if (reclaim != 0)
3376                 data->arg.reclaim = 1;
3377         task = rpc_run_task(NFS_CLIENT(state->inode), RPC_TASK_ASYNC,
3378                         &nfs4_lock_ops, data);
3379         if (IS_ERR(task)) {
3380                 nfs4_lock_release(data);
3381                 return PTR_ERR(task);
3382         }
3383         ret = nfs4_wait_for_completion_rpc_task(task);
3384         if (ret == 0) {
3385                 ret = data->rpc_status;
3386                 if (ret == -NFS4ERR_DENIED)
3387                         ret = -EAGAIN;
3388         } else
3389                 data->cancelled = 1;
3390         rpc_release_task(task);
3391         dprintk("%s: done, ret = %d!\n", __FUNCTION__, ret);
3392         return ret;
3393 }
3394
3395 static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request)
3396 {
3397         struct nfs_server *server = NFS_SERVER(state->inode);
3398         struct nfs4_exception exception = { };
3399         int err;
3400
3401         /* Cache the lock if possible... */
3402         if (test_bit(NFS_DELEGATED_STATE, &state->flags))
3403                 return 0;
3404         do {
3405                 err = _nfs4_do_setlk(state, F_SETLK, request, 1);
3406                 if (err != -NFS4ERR_DELAY)
3407                         break;
3408                 nfs4_handle_exception(server, err, &exception);
3409         } while (exception.retry);
3410         return err;
3411 }
3412
3413 static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request)
3414 {
3415         struct nfs_server *server = NFS_SERVER(state->inode);
3416         struct nfs4_exception exception = { };
3417         int err;
3418
3419         err = nfs4_set_lock_state(state, request);
3420         if (err != 0)
3421                 return err;
3422         do {
3423                 err = _nfs4_do_setlk(state, F_SETLK, request, 0);
3424                 if (err != -NFS4ERR_DELAY)
3425                         break;
3426                 nfs4_handle_exception(server, err, &exception);
3427         } while (exception.retry);
3428         return err;
3429 }
3430
3431 static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
3432 {
3433         struct nfs4_client *clp = state->owner->so_client;
3434         int status;
3435
3436         /* Is this a delegated open? */
3437         if (NFS_I(state->inode)->delegation_state != 0) {
3438                 /* Yes: cache locks! */
3439                 status = do_vfs_lock(request->fl_file, request);
3440                 /* ...but avoid races with delegation recall... */
3441                 if (status < 0 || test_bit(NFS_DELEGATED_STATE, &state->flags))
3442                         return status;
3443         }
3444         down_read(&clp->cl_sem);
3445         status = nfs4_set_lock_state(state, request);
3446         if (status != 0)
3447                 goto out;
3448         status = _nfs4_do_setlk(state, cmd, request, 0);
3449         if (status != 0)
3450                 goto out;
3451         /* Note: we always want to sleep here! */
3452         request->fl_flags |= FL_SLEEP;
3453         if (do_vfs_lock(request->fl_file, request) < 0)
3454                 printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", __FUNCTION__);
3455 out:
3456         up_read(&clp->cl_sem);
3457         return status;
3458 }
3459
3460 static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
3461 {
3462         struct nfs4_exception exception = { };
3463         int err;
3464
3465         do {
3466                 err = nfs4_handle_exception(NFS_SERVER(state->inode),
3467                                 _nfs4_proc_setlk(state, cmd, request),
3468                                 &exception);
3469         } while (exception.retry);
3470         return err;
3471 }
3472
3473 static int
3474 nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request)
3475 {
3476         struct nfs_open_context *ctx;
3477         struct nfs4_state *state;
3478         unsigned long timeout = NFS4_LOCK_MINTIMEOUT;
3479         int status;
3480
3481         /* verify open state */
3482         ctx = (struct nfs_open_context *)filp->private_data;
3483         state = ctx->state;
3484
3485         if (request->fl_start < 0 || request->fl_end < 0)
3486                 return -EINVAL;
3487
3488         if (IS_GETLK(cmd))
3489                 return nfs4_proc_getlk(state, F_GETLK, request);
3490
3491         if (!(IS_SETLK(cmd) || IS_SETLKW(cmd)))
3492                 return -EINVAL;
3493
3494         if (request->fl_type == F_UNLCK)
3495                 return nfs4_proc_unlck(state, cmd, request);
3496
3497         do {
3498                 status = nfs4_proc_setlk(state, cmd, request);
3499                 if ((status != -EAGAIN) || IS_SETLK(cmd))
3500                         break;
3501                 timeout = nfs4_set_lock_task_retry(timeout);
3502                 status = -ERESTARTSYS;
3503                 if (signalled())
3504                         break;
3505         } while(status < 0);
3506         return status;
3507 }
3508
3509 int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl)
3510 {
3511         struct nfs_server *server = NFS_SERVER(state->inode);
3512         struct nfs4_exception exception = { };
3513         int err;
3514
3515         err = nfs4_set_lock_state(state, fl);
3516         if (err != 0)
3517                 goto out;
3518         do {
3519                 err = _nfs4_do_setlk(state, F_SETLK, fl, 0);
3520                 if (err != -NFS4ERR_DELAY)
3521                         break;
3522                 err = nfs4_handle_exception(server, err, &exception);
3523         } while (exception.retry);
3524 out:
3525         return err;
3526 }
3527
3528 #define XATTR_NAME_NFSV4_ACL "system.nfs4_acl"
3529
3530 int nfs4_setxattr(struct dentry *dentry, const char *key, const void *buf,
3531                 size_t buflen, int flags)
3532 {
3533         struct inode *inode = dentry->d_inode;
3534
3535         if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
3536                 return -EOPNOTSUPP;
3537
3538         if (!S_ISREG(inode->i_mode) &&
3539             (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX))
3540                 return -EPERM;
3541
3542         return nfs4_proc_set_acl(inode, buf, buflen);
3543 }
3544
3545 /* The getxattr man page suggests returning -ENODATA for unknown attributes,
3546  * and that's what we'll do for e.g. user attributes that haven't been set.
3547  * But we'll follow ext2/ext3's lead by returning -EOPNOTSUPP for unsupported
3548  * attributes in kernel-managed attribute namespaces. */
3549 ssize_t nfs4_getxattr(struct dentry *dentry, const char *key, void *buf,
3550                 size_t buflen)
3551 {
3552         struct inode *inode = dentry->d_inode;
3553
3554         if (strcmp(key, XATTR_NAME_NFSV4_ACL) != 0)
3555                 return -EOPNOTSUPP;
3556
3557         return nfs4_proc_get_acl(inode, buf, buflen);
3558 }
3559
3560 ssize_t nfs4_listxattr(struct dentry *dentry, char *buf, size_t buflen)
3561 {
3562         size_t len = strlen(XATTR_NAME_NFSV4_ACL) + 1;
3563
3564         if (buf && buflen < len)
3565                 return -ERANGE;
3566         if (buf)
3567                 memcpy(buf, XATTR_NAME_NFSV4_ACL, len);
3568         return len;
3569 }
3570
3571 struct nfs4_state_recovery_ops nfs4_reboot_recovery_ops = {
3572         .recover_open   = nfs4_open_reclaim,
3573         .recover_lock   = nfs4_lock_reclaim,
3574 };
3575
3576 struct nfs4_state_recovery_ops nfs4_network_partition_recovery_ops = {
3577         .recover_open   = nfs4_open_expired,
3578         .recover_lock   = nfs4_lock_expired,
3579 };
3580
3581 static struct inode_operations nfs4_file_inode_operations = {
3582         .permission     = nfs_permission,
3583         .getattr        = nfs_getattr,
3584         .setattr        = nfs_setattr,
3585         .getxattr       = nfs4_getxattr,
3586         .setxattr       = nfs4_setxattr,
3587         .listxattr      = nfs4_listxattr,
3588 };
3589
3590 struct nfs_rpc_ops      nfs_v4_clientops = {
3591         .version        = 4,                    /* protocol version */
3592         .dentry_ops     = &nfs4_dentry_operations,
3593         .dir_inode_ops  = &nfs4_dir_inode_operations,
3594         .file_inode_ops = &nfs4_file_inode_operations,
3595         .getroot        = nfs4_proc_get_root,
3596         .getattr        = nfs4_proc_getattr,
3597         .setattr        = nfs4_proc_setattr,
3598         .lookup         = nfs4_proc_lookup,
3599         .access         = nfs4_proc_access,
3600         .readlink       = nfs4_proc_readlink,
3601         .read           = nfs4_proc_read,
3602         .write          = nfs4_proc_write,
3603         .commit         = nfs4_proc_commit,
3604         .create         = nfs4_proc_create,
3605         .remove         = nfs4_proc_remove,
3606         .unlink_setup   = nfs4_proc_unlink_setup,
3607         .unlink_done    = nfs4_proc_unlink_done,
3608         .rename         = nfs4_proc_rename,
3609         .link           = nfs4_proc_link,
3610         .symlink        = nfs4_proc_symlink,
3611         .mkdir          = nfs4_proc_mkdir,
3612         .rmdir          = nfs4_proc_remove,
3613         .readdir        = nfs4_proc_readdir,
3614         .mknod          = nfs4_proc_mknod,
3615         .statfs         = nfs4_proc_statfs,
3616         .fsinfo         = nfs4_proc_fsinfo,
3617         .pathconf       = nfs4_proc_pathconf,
3618         .decode_dirent  = nfs4_decode_dirent,
3619         .read_setup     = nfs4_proc_read_setup,
3620         .read_done      = nfs4_read_done,
3621         .write_setup    = nfs4_proc_write_setup,
3622         .write_done     = nfs4_write_done,
3623         .commit_setup   = nfs4_proc_commit_setup,
3624         .commit_done    = nfs4_commit_done,
3625         .file_open      = nfs_open,
3626         .file_release   = nfs_release,
3627         .lock           = nfs4_proc_lock,
3628         .clear_acl_cache = nfs4_zap_acl_attr,
3629 };
3630
3631 /*
3632  * Local variables:
3633  *  c-basic-offset: 8
3634  * End:
3635  */