NFS: Add sequence_priviliged_ops for nfs4_proc_sequence()
[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/delay.h>
40 #include <linux/errno.h>
41 #include <linux/string.h>
42 #include <linux/ratelimit.h>
43 #include <linux/printk.h>
44 #include <linux/slab.h>
45 #include <linux/sunrpc/clnt.h>
46 #include <linux/sunrpc/gss_api.h>
47 #include <linux/nfs.h>
48 #include <linux/nfs4.h>
49 #include <linux/nfs_fs.h>
50 #include <linux/nfs_page.h>
51 #include <linux/nfs_mount.h>
52 #include <linux/namei.h>
53 #include <linux/mount.h>
54 #include <linux/module.h>
55 #include <linux/sunrpc/bc_xprt.h>
56 #include <linux/xattr.h>
57 #include <linux/utsname.h>
58
59 #include "nfs4_fs.h"
60 #include "delegation.h"
61 #include "internal.h"
62 #include "iostat.h"
63 #include "callback.h"
64 #include "pnfs.h"
65
66 #define NFSDBG_FACILITY         NFSDBG_PROC
67
68 #define NFS4_POLL_RETRY_MIN     (HZ/10)
69 #define NFS4_POLL_RETRY_MAX     (15*HZ)
70
71 #define NFS4_MAX_LOOP_ON_RECOVER (10)
72
73 struct nfs4_opendata;
74 static int _nfs4_proc_open(struct nfs4_opendata *data);
75 static int _nfs4_recover_proc_open(struct nfs4_opendata *data);
76 static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
77 static int nfs4_async_handle_error(struct rpc_task *, const struct nfs_server *, struct nfs4_state *);
78 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr);
79 static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
80                             struct nfs_fattr *fattr, struct iattr *sattr,
81                             struct nfs4_state *state);
82 #ifdef CONFIG_NFS_V4_1
83 static int nfs41_test_stateid(struct nfs_server *, struct nfs4_state *);
84 static int nfs41_free_stateid(struct nfs_server *, struct nfs4_state *);
85 #endif
86 /* Prevent leaks of NFSv4 errors into userland */
87 static int nfs4_map_errors(int err)
88 {
89         if (err >= -1000)
90                 return err;
91         switch (err) {
92         case -NFS4ERR_RESOURCE:
93                 return -EREMOTEIO;
94         case -NFS4ERR_WRONGSEC:
95                 return -EPERM;
96         case -NFS4ERR_BADOWNER:
97         case -NFS4ERR_BADNAME:
98                 return -EINVAL;
99         case -NFS4ERR_SHARE_DENIED:
100                 return -EACCES;
101         default:
102                 dprintk("%s could not handle NFSv4 error %d\n",
103                                 __func__, -err);
104                 break;
105         }
106         return -EIO;
107 }
108
109 /*
110  * This is our standard bitmap for GETATTR requests.
111  */
112 const u32 nfs4_fattr_bitmap[2] = {
113         FATTR4_WORD0_TYPE
114         | FATTR4_WORD0_CHANGE
115         | FATTR4_WORD0_SIZE
116         | FATTR4_WORD0_FSID
117         | FATTR4_WORD0_FILEID,
118         FATTR4_WORD1_MODE
119         | FATTR4_WORD1_NUMLINKS
120         | FATTR4_WORD1_OWNER
121         | FATTR4_WORD1_OWNER_GROUP
122         | FATTR4_WORD1_RAWDEV
123         | FATTR4_WORD1_SPACE_USED
124         | FATTR4_WORD1_TIME_ACCESS
125         | FATTR4_WORD1_TIME_METADATA
126         | FATTR4_WORD1_TIME_MODIFY
127 };
128
129 const u32 nfs4_statfs_bitmap[2] = {
130         FATTR4_WORD0_FILES_AVAIL
131         | FATTR4_WORD0_FILES_FREE
132         | FATTR4_WORD0_FILES_TOTAL,
133         FATTR4_WORD1_SPACE_AVAIL
134         | FATTR4_WORD1_SPACE_FREE
135         | FATTR4_WORD1_SPACE_TOTAL
136 };
137
138 const u32 nfs4_pathconf_bitmap[2] = {
139         FATTR4_WORD0_MAXLINK
140         | FATTR4_WORD0_MAXNAME,
141         0
142 };
143
144 const u32 nfs4_fsinfo_bitmap[3] = { FATTR4_WORD0_MAXFILESIZE
145                         | FATTR4_WORD0_MAXREAD
146                         | FATTR4_WORD0_MAXWRITE
147                         | FATTR4_WORD0_LEASE_TIME,
148                         FATTR4_WORD1_TIME_DELTA
149                         | FATTR4_WORD1_FS_LAYOUT_TYPES,
150                         FATTR4_WORD2_LAYOUT_BLKSIZE
151 };
152
153 const u32 nfs4_fs_locations_bitmap[2] = {
154         FATTR4_WORD0_TYPE
155         | FATTR4_WORD0_CHANGE
156         | FATTR4_WORD0_SIZE
157         | FATTR4_WORD0_FSID
158         | FATTR4_WORD0_FILEID
159         | FATTR4_WORD0_FS_LOCATIONS,
160         FATTR4_WORD1_MODE
161         | FATTR4_WORD1_NUMLINKS
162         | FATTR4_WORD1_OWNER
163         | FATTR4_WORD1_OWNER_GROUP
164         | FATTR4_WORD1_RAWDEV
165         | FATTR4_WORD1_SPACE_USED
166         | FATTR4_WORD1_TIME_ACCESS
167         | FATTR4_WORD1_TIME_METADATA
168         | FATTR4_WORD1_TIME_MODIFY
169         | FATTR4_WORD1_MOUNTED_ON_FILEID
170 };
171
172 static void nfs4_setup_readdir(u64 cookie, __be32 *verifier, struct dentry *dentry,
173                 struct nfs4_readdir_arg *readdir)
174 {
175         __be32 *start, *p;
176
177         BUG_ON(readdir->count < 80);
178         if (cookie > 2) {
179                 readdir->cookie = cookie;
180                 memcpy(&readdir->verifier, verifier, sizeof(readdir->verifier));
181                 return;
182         }
183
184         readdir->cookie = 0;
185         memset(&readdir->verifier, 0, sizeof(readdir->verifier));
186         if (cookie == 2)
187                 return;
188         
189         /*
190          * NFSv4 servers do not return entries for '.' and '..'
191          * Therefore, we fake these entries here.  We let '.'
192          * have cookie 0 and '..' have cookie 1.  Note that
193          * when talking to the server, we always send cookie 0
194          * instead of 1 or 2.
195          */
196         start = p = kmap_atomic(*readdir->pages, KM_USER0);
197         
198         if (cookie == 0) {
199                 *p++ = xdr_one;                                  /* next */
200                 *p++ = xdr_zero;                   /* cookie, first word */
201                 *p++ = xdr_one;                   /* cookie, second word */
202                 *p++ = xdr_one;                             /* entry len */
203                 memcpy(p, ".\0\0\0", 4);                        /* entry */
204                 p++;
205                 *p++ = xdr_one;                         /* bitmap length */
206                 *p++ = htonl(FATTR4_WORD0_FILEID);             /* bitmap */
207                 *p++ = htonl(8);              /* attribute buffer length */
208                 p = xdr_encode_hyper(p, NFS_FILEID(dentry->d_inode));
209         }
210         
211         *p++ = xdr_one;                                  /* next */
212         *p++ = xdr_zero;                   /* cookie, first word */
213         *p++ = xdr_two;                   /* cookie, second word */
214         *p++ = xdr_two;                             /* entry len */
215         memcpy(p, "..\0\0", 4);                         /* entry */
216         p++;
217         *p++ = xdr_one;                         /* bitmap length */
218         *p++ = htonl(FATTR4_WORD0_FILEID);             /* bitmap */
219         *p++ = htonl(8);              /* attribute buffer length */
220         p = xdr_encode_hyper(p, NFS_FILEID(dentry->d_parent->d_inode));
221
222         readdir->pgbase = (char *)p - (char *)start;
223         readdir->count -= readdir->pgbase;
224         kunmap_atomic(start, KM_USER0);
225 }
226
227 static int nfs4_wait_clnt_recover(struct nfs_client *clp)
228 {
229         int res;
230
231         might_sleep();
232
233         res = wait_on_bit(&clp->cl_state, NFS4CLNT_MANAGER_RUNNING,
234                         nfs_wait_bit_killable, TASK_KILLABLE);
235         return res;
236 }
237
238 static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
239 {
240         int res = 0;
241
242         might_sleep();
243
244         if (*timeout <= 0)
245                 *timeout = NFS4_POLL_RETRY_MIN;
246         if (*timeout > NFS4_POLL_RETRY_MAX)
247                 *timeout = NFS4_POLL_RETRY_MAX;
248         schedule_timeout_killable(*timeout);
249         if (fatal_signal_pending(current))
250                 res = -ERESTARTSYS;
251         *timeout <<= 1;
252         return res;
253 }
254
255 /* This is the error handling routine for processes that are allowed
256  * to sleep.
257  */
258 static int nfs4_handle_exception(struct nfs_server *server, int errorcode, struct nfs4_exception *exception)
259 {
260         struct nfs_client *clp = server->nfs_client;
261         struct nfs4_state *state = exception->state;
262         struct inode *inode = exception->inode;
263         int ret = errorcode;
264
265         exception->retry = 0;
266         switch(errorcode) {
267                 case 0:
268                         return 0;
269                 case -NFS4ERR_OPENMODE:
270                         if (nfs_have_delegation(inode, FMODE_READ)) {
271                                 nfs_inode_return_delegation(inode);
272                                 exception->retry = 1;
273                                 return 0;
274                         }
275                         if (state == NULL)
276                                 break;
277                         nfs4_schedule_stateid_recovery(server, state);
278                         goto wait_on_recovery;
279                 case -NFS4ERR_DELEG_REVOKED:
280                 case -NFS4ERR_ADMIN_REVOKED:
281                 case -NFS4ERR_BAD_STATEID:
282                         if (state != NULL)
283                                 nfs_remove_bad_delegation(state->inode);
284                         if (state == NULL)
285                                 break;
286                         nfs4_schedule_stateid_recovery(server, state);
287                         goto wait_on_recovery;
288                 case -NFS4ERR_EXPIRED:
289                         if (state != NULL)
290                                 nfs4_schedule_stateid_recovery(server, state);
291                 case -NFS4ERR_STALE_STATEID:
292                 case -NFS4ERR_STALE_CLIENTID:
293                         nfs4_schedule_lease_recovery(clp);
294                         goto wait_on_recovery;
295 #if defined(CONFIG_NFS_V4_1)
296                 case -NFS4ERR_BADSESSION:
297                 case -NFS4ERR_BADSLOT:
298                 case -NFS4ERR_BAD_HIGH_SLOT:
299                 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
300                 case -NFS4ERR_DEADSESSION:
301                 case -NFS4ERR_SEQ_FALSE_RETRY:
302                 case -NFS4ERR_SEQ_MISORDERED:
303                         dprintk("%s ERROR: %d Reset session\n", __func__,
304                                 errorcode);
305                         nfs4_schedule_session_recovery(clp->cl_session);
306                         goto wait_on_recovery;
307 #endif /* defined(CONFIG_NFS_V4_1) */
308                 case -NFS4ERR_FILE_OPEN:
309                         if (exception->timeout > HZ) {
310                                 /* We have retried a decent amount, time to
311                                  * fail
312                                  */
313                                 ret = -EBUSY;
314                                 break;
315                         }
316                 case -NFS4ERR_GRACE:
317                 case -NFS4ERR_DELAY:
318                 case -EKEYEXPIRED:
319                         ret = nfs4_delay(server->client, &exception->timeout);
320                         if (ret != 0)
321                                 break;
322                 case -NFS4ERR_RETRY_UNCACHED_REP:
323                 case -NFS4ERR_OLD_STATEID:
324                         exception->retry = 1;
325                         break;
326                 case -NFS4ERR_BADOWNER:
327                         /* The following works around a Linux server bug! */
328                 case -NFS4ERR_BADNAME:
329                         if (server->caps & NFS_CAP_UIDGID_NOMAP) {
330                                 server->caps &= ~NFS_CAP_UIDGID_NOMAP;
331                                 exception->retry = 1;
332                                 printk(KERN_WARNING "NFS: v4 server %s "
333                                                 "does not accept raw "
334                                                 "uid/gids. "
335                                                 "Reenabling the idmapper.\n",
336                                                 server->nfs_client->cl_hostname);
337                         }
338         }
339         /* We failed to handle the error */
340         return nfs4_map_errors(ret);
341 wait_on_recovery:
342         ret = nfs4_wait_clnt_recover(clp);
343         if (ret == 0)
344                 exception->retry = 1;
345         return ret;
346 }
347
348
349 static void do_renew_lease(struct nfs_client *clp, unsigned long timestamp)
350 {
351         spin_lock(&clp->cl_lock);
352         if (time_before(clp->cl_last_renewal,timestamp))
353                 clp->cl_last_renewal = timestamp;
354         spin_unlock(&clp->cl_lock);
355 }
356
357 static void renew_lease(const struct nfs_server *server, unsigned long timestamp)
358 {
359         do_renew_lease(server->nfs_client, timestamp);
360 }
361
362 #if defined(CONFIG_NFS_V4_1)
363
364 /*
365  * nfs4_free_slot - free a slot and efficiently update slot table.
366  *
367  * freeing a slot is trivially done by clearing its respective bit
368  * in the bitmap.
369  * If the freed slotid equals highest_used_slotid we want to update it
370  * so that the server would be able to size down the slot table if needed,
371  * otherwise we know that the highest_used_slotid is still in use.
372  * When updating highest_used_slotid there may be "holes" in the bitmap
373  * so we need to scan down from highest_used_slotid to 0 looking for the now
374  * highest slotid in use.
375  * If none found, highest_used_slotid is set to -1.
376  *
377  * Must be called while holding tbl->slot_tbl_lock
378  */
379 static void
380 nfs4_free_slot(struct nfs4_slot_table *tbl, struct nfs4_slot *free_slot)
381 {
382         int free_slotid = free_slot - tbl->slots;
383         int slotid = free_slotid;
384
385         BUG_ON(slotid < 0 || slotid >= NFS4_MAX_SLOT_TABLE);
386         /* clear used bit in bitmap */
387         __clear_bit(slotid, tbl->used_slots);
388
389         /* update highest_used_slotid when it is freed */
390         if (slotid == tbl->highest_used_slotid) {
391                 slotid = find_last_bit(tbl->used_slots, tbl->max_slots);
392                 if (slotid < tbl->max_slots)
393                         tbl->highest_used_slotid = slotid;
394                 else
395                         tbl->highest_used_slotid = -1;
396         }
397         dprintk("%s: free_slotid %u highest_used_slotid %d\n", __func__,
398                 free_slotid, tbl->highest_used_slotid);
399 }
400
401 /*
402  * Signal state manager thread if session fore channel is drained
403  */
404 static void nfs4_check_drain_fc_complete(struct nfs4_session *ses)
405 {
406         struct rpc_task *task;
407
408         if (!test_bit(NFS4_SESSION_DRAINING, &ses->session_state)) {
409                 task = rpc_wake_up_next(&ses->fc_slot_table.slot_tbl_waitq);
410                 if (task)
411                         rpc_task_set_priority(task, RPC_PRIORITY_PRIVILEGED);
412                 return;
413         }
414
415         if (ses->fc_slot_table.highest_used_slotid != -1)
416                 return;
417
418         dprintk("%s COMPLETE: Session Fore Channel Drained\n", __func__);
419         complete(&ses->fc_slot_table.complete);
420 }
421
422 /*
423  * Signal state manager thread if session back channel is drained
424  */
425 void nfs4_check_drain_bc_complete(struct nfs4_session *ses)
426 {
427         if (!test_bit(NFS4_SESSION_DRAINING, &ses->session_state) ||
428             ses->bc_slot_table.highest_used_slotid != -1)
429                 return;
430         dprintk("%s COMPLETE: Session Back Channel Drained\n", __func__);
431         complete(&ses->bc_slot_table.complete);
432 }
433
434 static void nfs41_sequence_free_slot(struct nfs4_sequence_res *res)
435 {
436         struct nfs4_slot_table *tbl;
437
438         tbl = &res->sr_session->fc_slot_table;
439         if (!res->sr_slot) {
440                 /* just wake up the next guy waiting since
441                  * we may have not consumed a slot after all */
442                 dprintk("%s: No slot\n", __func__);
443                 return;
444         }
445
446         spin_lock(&tbl->slot_tbl_lock);
447         nfs4_free_slot(tbl, res->sr_slot);
448         nfs4_check_drain_fc_complete(res->sr_session);
449         spin_unlock(&tbl->slot_tbl_lock);
450         res->sr_slot = NULL;
451 }
452
453 static int nfs41_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *res)
454 {
455         unsigned long timestamp;
456         struct nfs_client *clp;
457
458         /*
459          * sr_status remains 1 if an RPC level error occurred. The server
460          * may or may not have processed the sequence operation..
461          * Proceed as if the server received and processed the sequence
462          * operation.
463          */
464         if (res->sr_status == 1)
465                 res->sr_status = NFS_OK;
466
467         /* don't increment the sequence number if the task wasn't sent */
468         if (!RPC_WAS_SENT(task))
469                 goto out;
470
471         /* Check the SEQUENCE operation status */
472         switch (res->sr_status) {
473         case 0:
474                 /* Update the slot's sequence and clientid lease timer */
475                 ++res->sr_slot->seq_nr;
476                 timestamp = res->sr_renewal_time;
477                 clp = res->sr_session->clp;
478                 do_renew_lease(clp, timestamp);
479                 /* Check sequence flags */
480                 if (res->sr_status_flags != 0)
481                         nfs4_schedule_lease_recovery(clp);
482                 break;
483         case -NFS4ERR_DELAY:
484                 /* The server detected a resend of the RPC call and
485                  * returned NFS4ERR_DELAY as per Section 2.10.6.2
486                  * of RFC5661.
487                  */
488                 dprintk("%s: slot=%td seq=%d: Operation in progress\n",
489                         __func__,
490                         res->sr_slot - res->sr_session->fc_slot_table.slots,
491                         res->sr_slot->seq_nr);
492                 goto out_retry;
493         default:
494                 /* Just update the slot sequence no. */
495                 ++res->sr_slot->seq_nr;
496         }
497 out:
498         /* The session may be reset by one of the error handlers. */
499         dprintk("%s: Error %d free the slot \n", __func__, res->sr_status);
500         nfs41_sequence_free_slot(res);
501         return 1;
502 out_retry:
503         if (!rpc_restart_call(task))
504                 goto out;
505         rpc_delay(task, NFS4_POLL_RETRY_MAX);
506         return 0;
507 }
508
509 static int nfs4_sequence_done(struct rpc_task *task,
510                                struct nfs4_sequence_res *res)
511 {
512         if (res->sr_session == NULL)
513                 return 1;
514         return nfs41_sequence_done(task, res);
515 }
516
517 /*
518  * nfs4_find_slot - efficiently look for a free slot
519  *
520  * nfs4_find_slot looks for an unset bit in the used_slots bitmap.
521  * If found, we mark the slot as used, update the highest_used_slotid,
522  * and respectively set up the sequence operation args.
523  * The slot number is returned if found, or NFS4_MAX_SLOT_TABLE otherwise.
524  *
525  * Note: must be called with under the slot_tbl_lock.
526  */
527 static u8
528 nfs4_find_slot(struct nfs4_slot_table *tbl)
529 {
530         int slotid;
531         u8 ret_id = NFS4_MAX_SLOT_TABLE;
532         BUILD_BUG_ON((u8)NFS4_MAX_SLOT_TABLE != (int)NFS4_MAX_SLOT_TABLE);
533
534         dprintk("--> %s used_slots=%04lx highest_used=%d max_slots=%d\n",
535                 __func__, tbl->used_slots[0], tbl->highest_used_slotid,
536                 tbl->max_slots);
537         slotid = find_first_zero_bit(tbl->used_slots, tbl->max_slots);
538         if (slotid >= tbl->max_slots)
539                 goto out;
540         __set_bit(slotid, tbl->used_slots);
541         if (slotid > tbl->highest_used_slotid)
542                 tbl->highest_used_slotid = slotid;
543         ret_id = slotid;
544 out:
545         dprintk("<-- %s used_slots=%04lx highest_used=%d slotid=%d \n",
546                 __func__, tbl->used_slots[0], tbl->highest_used_slotid, ret_id);
547         return ret_id;
548 }
549
550 int nfs41_setup_sequence(struct nfs4_session *session,
551                                 struct nfs4_sequence_args *args,
552                                 struct nfs4_sequence_res *res,
553                                 int cache_reply,
554                                 struct rpc_task *task)
555 {
556         struct nfs4_slot *slot;
557         struct nfs4_slot_table *tbl;
558         u8 slotid;
559
560         dprintk("--> %s\n", __func__);
561         /* slot already allocated? */
562         if (res->sr_slot != NULL)
563                 return 0;
564
565         tbl = &session->fc_slot_table;
566
567         spin_lock(&tbl->slot_tbl_lock);
568         if (test_bit(NFS4_SESSION_DRAINING, &session->session_state) &&
569             !rpc_task_has_priority(task, RPC_PRIORITY_PRIVILEGED)) {
570                 /*
571                  * The state manager will wait until the slot table is empty.
572                  * Schedule the reset thread
573                  */
574                 rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL);
575                 spin_unlock(&tbl->slot_tbl_lock);
576                 dprintk("%s Schedule Session Reset\n", __func__);
577                 return -EAGAIN;
578         }
579
580         if (!rpc_queue_empty(&tbl->slot_tbl_waitq) &&
581             !rpc_task_has_priority(task, RPC_PRIORITY_PRIVILEGED)) {
582                 rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL);
583                 spin_unlock(&tbl->slot_tbl_lock);
584                 dprintk("%s enforce FIFO order\n", __func__);
585                 return -EAGAIN;
586         }
587
588         slotid = nfs4_find_slot(tbl);
589         if (slotid == NFS4_MAX_SLOT_TABLE) {
590                 rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL);
591                 spin_unlock(&tbl->slot_tbl_lock);
592                 dprintk("<-- %s: no free slots\n", __func__);
593                 return -EAGAIN;
594         }
595         spin_unlock(&tbl->slot_tbl_lock);
596
597         rpc_task_set_priority(task, RPC_PRIORITY_NORMAL);
598         slot = tbl->slots + slotid;
599         args->sa_session = session;
600         args->sa_slotid = slotid;
601         args->sa_cache_this = cache_reply;
602
603         dprintk("<-- %s slotid=%d seqid=%d\n", __func__, slotid, slot->seq_nr);
604
605         res->sr_session = session;
606         res->sr_slot = slot;
607         res->sr_renewal_time = jiffies;
608         res->sr_status_flags = 0;
609         /*
610          * sr_status is only set in decode_sequence, and so will remain
611          * set to 1 if an rpc level failure occurs.
612          */
613         res->sr_status = 1;
614         return 0;
615 }
616 EXPORT_SYMBOL_GPL(nfs41_setup_sequence);
617
618 int nfs4_setup_sequence(const struct nfs_server *server,
619                         struct nfs4_sequence_args *args,
620                         struct nfs4_sequence_res *res,
621                         int cache_reply,
622                         struct rpc_task *task)
623 {
624         struct nfs4_session *session = nfs4_get_session(server);
625         int ret = 0;
626
627         if (session == NULL) {
628                 args->sa_session = NULL;
629                 res->sr_session = NULL;
630                 goto out;
631         }
632
633         dprintk("--> %s clp %p session %p sr_slot %td\n",
634                 __func__, session->clp, session, res->sr_slot ?
635                         res->sr_slot - session->fc_slot_table.slots : -1);
636
637         ret = nfs41_setup_sequence(session, args, res, cache_reply,
638                                    task);
639 out:
640         dprintk("<-- %s status=%d\n", __func__, ret);
641         return ret;
642 }
643
644 struct nfs41_call_sync_data {
645         const struct nfs_server *seq_server;
646         struct nfs4_sequence_args *seq_args;
647         struct nfs4_sequence_res *seq_res;
648         int cache_reply;
649 };
650
651 static void nfs41_call_sync_prepare(struct rpc_task *task, void *calldata)
652 {
653         struct nfs41_call_sync_data *data = calldata;
654
655         dprintk("--> %s data->seq_server %p\n", __func__, data->seq_server);
656
657         if (nfs4_setup_sequence(data->seq_server, data->seq_args,
658                                 data->seq_res, data->cache_reply, task))
659                 return;
660         rpc_call_start(task);
661 }
662
663 static void nfs41_call_priv_sync_prepare(struct rpc_task *task, void *calldata)
664 {
665         rpc_task_set_priority(task, RPC_PRIORITY_PRIVILEGED);
666         nfs41_call_sync_prepare(task, calldata);
667 }
668
669 static void nfs41_call_sync_done(struct rpc_task *task, void *calldata)
670 {
671         struct nfs41_call_sync_data *data = calldata;
672
673         nfs41_sequence_done(task, data->seq_res);
674 }
675
676 struct rpc_call_ops nfs41_call_sync_ops = {
677         .rpc_call_prepare = nfs41_call_sync_prepare,
678         .rpc_call_done = nfs41_call_sync_done,
679 };
680
681 struct rpc_call_ops nfs41_call_priv_sync_ops = {
682         .rpc_call_prepare = nfs41_call_priv_sync_prepare,
683         .rpc_call_done = nfs41_call_sync_done,
684 };
685
686 static int nfs4_call_sync_sequence(struct rpc_clnt *clnt,
687                                    struct nfs_server *server,
688                                    struct rpc_message *msg,
689                                    struct nfs4_sequence_args *args,
690                                    struct nfs4_sequence_res *res,
691                                    int cache_reply,
692                                    int privileged)
693 {
694         int ret;
695         struct rpc_task *task;
696         struct nfs41_call_sync_data data = {
697                 .seq_server = server,
698                 .seq_args = args,
699                 .seq_res = res,
700                 .cache_reply = cache_reply,
701         };
702         struct rpc_task_setup task_setup = {
703                 .rpc_client = clnt,
704                 .rpc_message = msg,
705                 .callback_ops = &nfs41_call_sync_ops,
706                 .callback_data = &data
707         };
708
709         res->sr_slot = NULL;
710         if (privileged)
711                 task_setup.callback_ops = &nfs41_call_priv_sync_ops;
712         task = rpc_run_task(&task_setup);
713         if (IS_ERR(task))
714                 ret = PTR_ERR(task);
715         else {
716                 ret = task->tk_status;
717                 rpc_put_task(task);
718         }
719         return ret;
720 }
721
722 int _nfs4_call_sync_session(struct rpc_clnt *clnt,
723                             struct nfs_server *server,
724                             struct rpc_message *msg,
725                             struct nfs4_sequence_args *args,
726                             struct nfs4_sequence_res *res,
727                             int cache_reply)
728 {
729         return nfs4_call_sync_sequence(clnt, server, msg, args, res, cache_reply, 0);
730 }
731
732 #else
733 static int nfs4_sequence_done(struct rpc_task *task,
734                                struct nfs4_sequence_res *res)
735 {
736         return 1;
737 }
738 #endif /* CONFIG_NFS_V4_1 */
739
740 int _nfs4_call_sync(struct rpc_clnt *clnt,
741                     struct nfs_server *server,
742                     struct rpc_message *msg,
743                     struct nfs4_sequence_args *args,
744                     struct nfs4_sequence_res *res,
745                     int cache_reply)
746 {
747         args->sa_session = res->sr_session = NULL;
748         return rpc_call_sync(clnt, msg, 0);
749 }
750
751 static inline
752 int nfs4_call_sync(struct rpc_clnt *clnt,
753                    struct nfs_server *server,
754                    struct rpc_message *msg,
755                    struct nfs4_sequence_args *args,
756                    struct nfs4_sequence_res *res,
757                    int cache_reply)
758 {
759         return server->nfs_client->cl_mvops->call_sync(clnt, server, msg,
760                                                 args, res, cache_reply);
761 }
762
763 static void update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo)
764 {
765         struct nfs_inode *nfsi = NFS_I(dir);
766
767         spin_lock(&dir->i_lock);
768         nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA;
769         if (!cinfo->atomic || cinfo->before != dir->i_version)
770                 nfs_force_lookup_revalidate(dir);
771         dir->i_version = cinfo->after;
772         spin_unlock(&dir->i_lock);
773 }
774
775 struct nfs4_opendata {
776         struct kref kref;
777         struct nfs_openargs o_arg;
778         struct nfs_openres o_res;
779         struct nfs_open_confirmargs c_arg;
780         struct nfs_open_confirmres c_res;
781         struct nfs_fattr f_attr;
782         struct nfs_fattr dir_attr;
783         struct dentry *dir;
784         struct dentry *dentry;
785         struct nfs4_state_owner *owner;
786         struct nfs4_state *state;
787         struct iattr attrs;
788         unsigned long timestamp;
789         unsigned int rpc_done : 1;
790         int rpc_status;
791         int cancelled;
792 };
793
794
795 static void nfs4_init_opendata_res(struct nfs4_opendata *p)
796 {
797         p->o_res.f_attr = &p->f_attr;
798         p->o_res.dir_attr = &p->dir_attr;
799         p->o_res.seqid = p->o_arg.seqid;
800         p->c_res.seqid = p->c_arg.seqid;
801         p->o_res.server = p->o_arg.server;
802         nfs_fattr_init(&p->f_attr);
803         nfs_fattr_init(&p->dir_attr);
804 }
805
806 static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
807                 struct nfs4_state_owner *sp, fmode_t fmode, int flags,
808                 const struct iattr *attrs,
809                 gfp_t gfp_mask)
810 {
811         struct dentry *parent = dget_parent(dentry);
812         struct inode *dir = parent->d_inode;
813         struct nfs_server *server = NFS_SERVER(dir);
814         struct nfs4_opendata *p;
815
816         p = kzalloc(sizeof(*p), gfp_mask);
817         if (p == NULL)
818                 goto err;
819         p->o_arg.seqid = nfs_alloc_seqid(&sp->so_seqid, gfp_mask);
820         if (p->o_arg.seqid == NULL)
821                 goto err_free;
822         nfs_sb_active(dentry->d_sb);
823         p->dentry = dget(dentry);
824         p->dir = parent;
825         p->owner = sp;
826         atomic_inc(&sp->so_count);
827         p->o_arg.fh = NFS_FH(dir);
828         p->o_arg.open_flags = flags;
829         p->o_arg.fmode = fmode & (FMODE_READ|FMODE_WRITE);
830         p->o_arg.clientid = server->nfs_client->cl_clientid;
831         p->o_arg.id = sp->so_owner_id.id;
832         p->o_arg.name = &dentry->d_name;
833         p->o_arg.server = server;
834         p->o_arg.bitmask = server->attr_bitmask;
835         p->o_arg.claim = NFS4_OPEN_CLAIM_NULL;
836         if (flags & O_CREAT) {
837                 u32 *s;
838
839                 p->o_arg.u.attrs = &p->attrs;
840                 memcpy(&p->attrs, attrs, sizeof(p->attrs));
841                 s = (u32 *) p->o_arg.u.verifier.data;
842                 s[0] = jiffies;
843                 s[1] = current->pid;
844         }
845         p->c_arg.fh = &p->o_res.fh;
846         p->c_arg.stateid = &p->o_res.stateid;
847         p->c_arg.seqid = p->o_arg.seqid;
848         nfs4_init_opendata_res(p);
849         kref_init(&p->kref);
850         return p;
851 err_free:
852         kfree(p);
853 err:
854         dput(parent);
855         return NULL;
856 }
857
858 static void nfs4_opendata_free(struct kref *kref)
859 {
860         struct nfs4_opendata *p = container_of(kref,
861                         struct nfs4_opendata, kref);
862         struct super_block *sb = p->dentry->d_sb;
863
864         nfs_free_seqid(p->o_arg.seqid);
865         if (p->state != NULL)
866                 nfs4_put_open_state(p->state);
867         nfs4_put_state_owner(p->owner);
868         dput(p->dir);
869         dput(p->dentry);
870         nfs_sb_deactive(sb);
871         kfree(p);
872 }
873
874 static void nfs4_opendata_put(struct nfs4_opendata *p)
875 {
876         if (p != NULL)
877                 kref_put(&p->kref, nfs4_opendata_free);
878 }
879
880 static int nfs4_wait_for_completion_rpc_task(struct rpc_task *task)
881 {
882         int ret;
883
884         ret = rpc_wait_for_completion_task(task);
885         return ret;
886 }
887
888 static int can_open_cached(struct nfs4_state *state, fmode_t mode, int open_mode)
889 {
890         int ret = 0;
891
892         if (open_mode & O_EXCL)
893                 goto out;
894         switch (mode & (FMODE_READ|FMODE_WRITE)) {
895                 case FMODE_READ:
896                         ret |= test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0
897                                 && state->n_rdonly != 0;
898                         break;
899                 case FMODE_WRITE:
900                         ret |= test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0
901                                 && state->n_wronly != 0;
902                         break;
903                 case FMODE_READ|FMODE_WRITE:
904                         ret |= test_bit(NFS_O_RDWR_STATE, &state->flags) != 0
905                                 && state->n_rdwr != 0;
906         }
907 out:
908         return ret;
909 }
910
911 static int can_open_delegated(struct nfs_delegation *delegation, fmode_t fmode)
912 {
913         if (delegation == NULL)
914                 return 0;
915         if ((delegation->type & fmode) != fmode)
916                 return 0;
917         if (test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags))
918                 return 0;
919         nfs_mark_delegation_referenced(delegation);
920         return 1;
921 }
922
923 static void update_open_stateflags(struct nfs4_state *state, fmode_t fmode)
924 {
925         switch (fmode) {
926                 case FMODE_WRITE:
927                         state->n_wronly++;
928                         break;
929                 case FMODE_READ:
930                         state->n_rdonly++;
931                         break;
932                 case FMODE_READ|FMODE_WRITE:
933                         state->n_rdwr++;
934         }
935         nfs4_state_set_mode_locked(state, state->state | fmode);
936 }
937
938 static void nfs_set_open_stateid_locked(struct nfs4_state *state, nfs4_stateid *stateid, fmode_t fmode)
939 {
940         if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0)
941                 memcpy(state->stateid.data, stateid->data, sizeof(state->stateid.data));
942         memcpy(state->open_stateid.data, stateid->data, sizeof(state->open_stateid.data));
943         switch (fmode) {
944                 case FMODE_READ:
945                         set_bit(NFS_O_RDONLY_STATE, &state->flags);
946                         break;
947                 case FMODE_WRITE:
948                         set_bit(NFS_O_WRONLY_STATE, &state->flags);
949                         break;
950                 case FMODE_READ|FMODE_WRITE:
951                         set_bit(NFS_O_RDWR_STATE, &state->flags);
952         }
953 }
954
955 static void nfs_set_open_stateid(struct nfs4_state *state, nfs4_stateid *stateid, fmode_t fmode)
956 {
957         write_seqlock(&state->seqlock);
958         nfs_set_open_stateid_locked(state, stateid, fmode);
959         write_sequnlock(&state->seqlock);
960 }
961
962 static void __update_open_stateid(struct nfs4_state *state, nfs4_stateid *open_stateid, const nfs4_stateid *deleg_stateid, fmode_t fmode)
963 {
964         /*
965          * Protect the call to nfs4_state_set_mode_locked and
966          * serialise the stateid update
967          */
968         write_seqlock(&state->seqlock);
969         if (deleg_stateid != NULL) {
970                 memcpy(state->stateid.data, deleg_stateid->data, sizeof(state->stateid.data));
971                 set_bit(NFS_DELEGATED_STATE, &state->flags);
972         }
973         if (open_stateid != NULL)
974                 nfs_set_open_stateid_locked(state, open_stateid, fmode);
975         write_sequnlock(&state->seqlock);
976         spin_lock(&state->owner->so_lock);
977         update_open_stateflags(state, fmode);
978         spin_unlock(&state->owner->so_lock);
979 }
980
981 static int update_open_stateid(struct nfs4_state *state, nfs4_stateid *open_stateid, nfs4_stateid *delegation, fmode_t fmode)
982 {
983         struct nfs_inode *nfsi = NFS_I(state->inode);
984         struct nfs_delegation *deleg_cur;
985         int ret = 0;
986
987         fmode &= (FMODE_READ|FMODE_WRITE);
988
989         rcu_read_lock();
990         deleg_cur = rcu_dereference(nfsi->delegation);
991         if (deleg_cur == NULL)
992                 goto no_delegation;
993
994         spin_lock(&deleg_cur->lock);
995         if (nfsi->delegation != deleg_cur ||
996             (deleg_cur->type & fmode) != fmode)
997                 goto no_delegation_unlock;
998
999         if (delegation == NULL)
1000                 delegation = &deleg_cur->stateid;
1001         else if (memcmp(deleg_cur->stateid.data, delegation->data, NFS4_STATEID_SIZE) != 0)
1002                 goto no_delegation_unlock;
1003
1004         nfs_mark_delegation_referenced(deleg_cur);
1005         __update_open_stateid(state, open_stateid, &deleg_cur->stateid, fmode);
1006         ret = 1;
1007 no_delegation_unlock:
1008         spin_unlock(&deleg_cur->lock);
1009 no_delegation:
1010         rcu_read_unlock();
1011
1012         if (!ret && open_stateid != NULL) {
1013                 __update_open_stateid(state, open_stateid, NULL, fmode);
1014                 ret = 1;
1015         }
1016
1017         return ret;
1018 }
1019
1020
1021 static void nfs4_return_incompatible_delegation(struct inode *inode, fmode_t fmode)
1022 {
1023         struct nfs_delegation *delegation;
1024
1025         rcu_read_lock();
1026         delegation = rcu_dereference(NFS_I(inode)->delegation);
1027         if (delegation == NULL || (delegation->type & fmode) == fmode) {
1028                 rcu_read_unlock();
1029                 return;
1030         }
1031         rcu_read_unlock();
1032         nfs_inode_return_delegation(inode);
1033 }
1034
1035 static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata)
1036 {
1037         struct nfs4_state *state = opendata->state;
1038         struct nfs_inode *nfsi = NFS_I(state->inode);
1039         struct nfs_delegation *delegation;
1040         int open_mode = opendata->o_arg.open_flags & O_EXCL;
1041         fmode_t fmode = opendata->o_arg.fmode;
1042         nfs4_stateid stateid;
1043         int ret = -EAGAIN;
1044
1045         for (;;) {
1046                 if (can_open_cached(state, fmode, open_mode)) {
1047                         spin_lock(&state->owner->so_lock);
1048                         if (can_open_cached(state, fmode, open_mode)) {
1049                                 update_open_stateflags(state, fmode);
1050                                 spin_unlock(&state->owner->so_lock);
1051                                 goto out_return_state;
1052                         }
1053                         spin_unlock(&state->owner->so_lock);
1054                 }
1055                 rcu_read_lock();
1056                 delegation = rcu_dereference(nfsi->delegation);
1057                 if (!can_open_delegated(delegation, fmode)) {
1058                         rcu_read_unlock();
1059                         break;
1060                 }
1061                 /* Save the delegation */
1062                 memcpy(stateid.data, delegation->stateid.data, sizeof(stateid.data));
1063                 rcu_read_unlock();
1064                 ret = nfs_may_open(state->inode, state->owner->so_cred, open_mode);
1065                 if (ret != 0)
1066                         goto out;
1067                 ret = -EAGAIN;
1068
1069                 /* Try to update the stateid using the delegation */
1070                 if (update_open_stateid(state, NULL, &stateid, fmode))
1071                         goto out_return_state;
1072         }
1073 out:
1074         return ERR_PTR(ret);
1075 out_return_state:
1076         atomic_inc(&state->count);
1077         return state;
1078 }
1079
1080 static struct nfs4_state *nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data)
1081 {
1082         struct inode *inode;
1083         struct nfs4_state *state = NULL;
1084         struct nfs_delegation *delegation;
1085         int ret;
1086
1087         if (!data->rpc_done) {
1088                 state = nfs4_try_open_cached(data);
1089                 goto out;
1090         }
1091
1092         ret = -EAGAIN;
1093         if (!(data->f_attr.valid & NFS_ATTR_FATTR))
1094                 goto err;
1095         inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh, &data->f_attr);
1096         ret = PTR_ERR(inode);
1097         if (IS_ERR(inode))
1098                 goto err;
1099         ret = -ENOMEM;
1100         state = nfs4_get_open_state(inode, data->owner);
1101         if (state == NULL)
1102                 goto err_put_inode;
1103         if (data->o_res.delegation_type != 0) {
1104                 int delegation_flags = 0;
1105
1106                 rcu_read_lock();
1107                 delegation = rcu_dereference(NFS_I(inode)->delegation);
1108                 if (delegation)
1109                         delegation_flags = delegation->flags;
1110                 rcu_read_unlock();
1111                 if (data->o_arg.claim == NFS4_OPEN_CLAIM_DELEGATE_CUR) {
1112                         pr_err_ratelimited("NFS: Broken NFSv4 server %s is "
1113                                         "returning a delegation for "
1114                                         "OPEN(CLAIM_DELEGATE_CUR)\n",
1115                                         NFS_CLIENT(inode)->cl_server);
1116                 } else if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0)
1117                         nfs_inode_set_delegation(state->inode,
1118                                         data->owner->so_cred,
1119                                         &data->o_res);
1120                 else
1121                         nfs_inode_reclaim_delegation(state->inode,
1122                                         data->owner->so_cred,
1123                                         &data->o_res);
1124         }
1125
1126         update_open_stateid(state, &data->o_res.stateid, NULL,
1127                         data->o_arg.fmode);
1128         iput(inode);
1129 out:
1130         return state;
1131 err_put_inode:
1132         iput(inode);
1133 err:
1134         return ERR_PTR(ret);
1135 }
1136
1137 static struct nfs_open_context *nfs4_state_find_open_context(struct nfs4_state *state)
1138 {
1139         struct nfs_inode *nfsi = NFS_I(state->inode);
1140         struct nfs_open_context *ctx;
1141
1142         spin_lock(&state->inode->i_lock);
1143         list_for_each_entry(ctx, &nfsi->open_files, list) {
1144                 if (ctx->state != state)
1145                         continue;
1146                 get_nfs_open_context(ctx);
1147                 spin_unlock(&state->inode->i_lock);
1148                 return ctx;
1149         }
1150         spin_unlock(&state->inode->i_lock);
1151         return ERR_PTR(-ENOENT);
1152 }
1153
1154 static struct nfs4_opendata *nfs4_open_recoverdata_alloc(struct nfs_open_context *ctx, struct nfs4_state *state)
1155 {
1156         struct nfs4_opendata *opendata;
1157
1158         opendata = nfs4_opendata_alloc(ctx->dentry, state->owner, 0, 0, NULL, GFP_NOFS);
1159         if (opendata == NULL)
1160                 return ERR_PTR(-ENOMEM);
1161         opendata->state = state;
1162         atomic_inc(&state->count);
1163         return opendata;
1164 }
1165
1166 static int nfs4_open_recover_helper(struct nfs4_opendata *opendata, fmode_t fmode, struct nfs4_state **res)
1167 {
1168         struct nfs4_state *newstate;
1169         int ret;
1170
1171         opendata->o_arg.open_flags = 0;
1172         opendata->o_arg.fmode = fmode;
1173         memset(&opendata->o_res, 0, sizeof(opendata->o_res));
1174         memset(&opendata->c_res, 0, sizeof(opendata->c_res));
1175         nfs4_init_opendata_res(opendata);
1176         ret = _nfs4_recover_proc_open(opendata);
1177         if (ret != 0)
1178                 return ret; 
1179         newstate = nfs4_opendata_to_nfs4_state(opendata);
1180         if (IS_ERR(newstate))
1181                 return PTR_ERR(newstate);
1182         nfs4_close_state(newstate, fmode);
1183         *res = newstate;
1184         return 0;
1185 }
1186
1187 static int nfs4_open_recover(struct nfs4_opendata *opendata, struct nfs4_state *state)
1188 {
1189         struct nfs4_state *newstate;
1190         int ret;
1191
1192         /* memory barrier prior to reading state->n_* */
1193         clear_bit(NFS_DELEGATED_STATE, &state->flags);
1194         smp_rmb();
1195         if (state->n_rdwr != 0) {
1196                 clear_bit(NFS_O_RDWR_STATE, &state->flags);
1197                 ret = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE, &newstate);
1198                 if (ret != 0)
1199                         return ret;
1200                 if (newstate != state)
1201                         return -ESTALE;
1202         }
1203         if (state->n_wronly != 0) {
1204                 clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1205                 ret = nfs4_open_recover_helper(opendata, FMODE_WRITE, &newstate);
1206                 if (ret != 0)
1207                         return ret;
1208                 if (newstate != state)
1209                         return -ESTALE;
1210         }
1211         if (state->n_rdonly != 0) {
1212                 clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1213                 ret = nfs4_open_recover_helper(opendata, FMODE_READ, &newstate);
1214                 if (ret != 0)
1215                         return ret;
1216                 if (newstate != state)
1217                         return -ESTALE;
1218         }
1219         /*
1220          * We may have performed cached opens for all three recoveries.
1221          * Check if we need to update the current stateid.
1222          */
1223         if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0 &&
1224             memcmp(state->stateid.data, state->open_stateid.data, sizeof(state->stateid.data)) != 0) {
1225                 write_seqlock(&state->seqlock);
1226                 if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0)
1227                         memcpy(state->stateid.data, state->open_stateid.data, sizeof(state->stateid.data));
1228                 write_sequnlock(&state->seqlock);
1229         }
1230         return 0;
1231 }
1232
1233 /*
1234  * OPEN_RECLAIM:
1235  *      reclaim state on the server after a reboot.
1236  */
1237 static int _nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state)
1238 {
1239         struct nfs_delegation *delegation;
1240         struct nfs4_opendata *opendata;
1241         fmode_t delegation_type = 0;
1242         int status;
1243
1244         opendata = nfs4_open_recoverdata_alloc(ctx, state);
1245         if (IS_ERR(opendata))
1246                 return PTR_ERR(opendata);
1247         opendata->o_arg.claim = NFS4_OPEN_CLAIM_PREVIOUS;
1248         opendata->o_arg.fh = NFS_FH(state->inode);
1249         rcu_read_lock();
1250         delegation = rcu_dereference(NFS_I(state->inode)->delegation);
1251         if (delegation != NULL && test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags) != 0)
1252                 delegation_type = delegation->type;
1253         rcu_read_unlock();
1254         opendata->o_arg.u.delegation_type = delegation_type;
1255         status = nfs4_open_recover(opendata, state);
1256         nfs4_opendata_put(opendata);
1257         return status;
1258 }
1259
1260 static int nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state)
1261 {
1262         struct nfs_server *server = NFS_SERVER(state->inode);
1263         struct nfs4_exception exception = { };
1264         int err;
1265         do {
1266                 err = _nfs4_do_open_reclaim(ctx, state);
1267                 if (err != -NFS4ERR_DELAY)
1268                         break;
1269                 nfs4_handle_exception(server, err, &exception);
1270         } while (exception.retry);
1271         return err;
1272 }
1273
1274 static int nfs4_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state)
1275 {
1276         struct nfs_open_context *ctx;
1277         int ret;
1278
1279         ctx = nfs4_state_find_open_context(state);
1280         if (IS_ERR(ctx))
1281                 return PTR_ERR(ctx);
1282         ret = nfs4_do_open_reclaim(ctx, state);
1283         put_nfs_open_context(ctx);
1284         return ret;
1285 }
1286
1287 static int _nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid)
1288 {
1289         struct nfs4_opendata *opendata;
1290         int ret;
1291
1292         opendata = nfs4_open_recoverdata_alloc(ctx, state);
1293         if (IS_ERR(opendata))
1294                 return PTR_ERR(opendata);
1295         opendata->o_arg.claim = NFS4_OPEN_CLAIM_DELEGATE_CUR;
1296         memcpy(opendata->o_arg.u.delegation.data, stateid->data,
1297                         sizeof(opendata->o_arg.u.delegation.data));
1298         ret = nfs4_open_recover(opendata, state);
1299         nfs4_opendata_put(opendata);
1300         return ret;
1301 }
1302
1303 int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid)
1304 {
1305         struct nfs4_exception exception = { };
1306         struct nfs_server *server = NFS_SERVER(state->inode);
1307         int err;
1308         do {
1309                 err = _nfs4_open_delegation_recall(ctx, state, stateid);
1310                 switch (err) {
1311                         case 0:
1312                         case -ENOENT:
1313                         case -ESTALE:
1314                                 goto out;
1315                         case -NFS4ERR_BADSESSION:
1316                         case -NFS4ERR_BADSLOT:
1317                         case -NFS4ERR_BAD_HIGH_SLOT:
1318                         case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1319                         case -NFS4ERR_DEADSESSION:
1320                                 nfs4_schedule_session_recovery(server->nfs_client->cl_session);
1321                                 goto out;
1322                         case -NFS4ERR_STALE_CLIENTID:
1323                         case -NFS4ERR_STALE_STATEID:
1324                         case -NFS4ERR_EXPIRED:
1325                                 /* Don't recall a delegation if it was lost */
1326                                 nfs4_schedule_lease_recovery(server->nfs_client);
1327                                 goto out;
1328                         case -ERESTARTSYS:
1329                                 /*
1330                                  * The show must go on: exit, but mark the
1331                                  * stateid as needing recovery.
1332                                  */
1333                         case -NFS4ERR_DELEG_REVOKED:
1334                         case -NFS4ERR_ADMIN_REVOKED:
1335                         case -NFS4ERR_BAD_STATEID:
1336                                 nfs_inode_find_state_and_recover(state->inode,
1337                                                 stateid);
1338                                 nfs4_schedule_stateid_recovery(server, state);
1339                         case -EKEYEXPIRED:
1340                                 /*
1341                                  * User RPCSEC_GSS context has expired.
1342                                  * We cannot recover this stateid now, so
1343                                  * skip it and allow recovery thread to
1344                                  * proceed.
1345                                  */
1346                         case -ENOMEM:
1347                                 err = 0;
1348                                 goto out;
1349                 }
1350                 err = nfs4_handle_exception(server, err, &exception);
1351         } while (exception.retry);
1352 out:
1353         return err;
1354 }
1355
1356 static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata)
1357 {
1358         struct nfs4_opendata *data = calldata;
1359
1360         data->rpc_status = task->tk_status;
1361         if (data->rpc_status == 0) {
1362                 memcpy(data->o_res.stateid.data, data->c_res.stateid.data,
1363                                 sizeof(data->o_res.stateid.data));
1364                 nfs_confirm_seqid(&data->owner->so_seqid, 0);
1365                 renew_lease(data->o_res.server, data->timestamp);
1366                 data->rpc_done = 1;
1367         }
1368 }
1369
1370 static void nfs4_open_confirm_release(void *calldata)
1371 {
1372         struct nfs4_opendata *data = calldata;
1373         struct nfs4_state *state = NULL;
1374
1375         /* If this request hasn't been cancelled, do nothing */
1376         if (data->cancelled == 0)
1377                 goto out_free;
1378         /* In case of error, no cleanup! */
1379         if (!data->rpc_done)
1380                 goto out_free;
1381         state = nfs4_opendata_to_nfs4_state(data);
1382         if (!IS_ERR(state))
1383                 nfs4_close_state(state, data->o_arg.fmode);
1384 out_free:
1385         nfs4_opendata_put(data);
1386 }
1387
1388 static const struct rpc_call_ops nfs4_open_confirm_ops = {
1389         .rpc_call_done = nfs4_open_confirm_done,
1390         .rpc_release = nfs4_open_confirm_release,
1391 };
1392
1393 /*
1394  * Note: On error, nfs4_proc_open_confirm will free the struct nfs4_opendata
1395  */
1396 static int _nfs4_proc_open_confirm(struct nfs4_opendata *data)
1397 {
1398         struct nfs_server *server = NFS_SERVER(data->dir->d_inode);
1399         struct rpc_task *task;
1400         struct  rpc_message msg = {
1401                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM],
1402                 .rpc_argp = &data->c_arg,
1403                 .rpc_resp = &data->c_res,
1404                 .rpc_cred = data->owner->so_cred,
1405         };
1406         struct rpc_task_setup task_setup_data = {
1407                 .rpc_client = server->client,
1408                 .rpc_message = &msg,
1409                 .callback_ops = &nfs4_open_confirm_ops,
1410                 .callback_data = data,
1411                 .workqueue = nfsiod_workqueue,
1412                 .flags = RPC_TASK_ASYNC,
1413         };
1414         int status;
1415
1416         kref_get(&data->kref);
1417         data->rpc_done = 0;
1418         data->rpc_status = 0;
1419         data->timestamp = jiffies;
1420         task = rpc_run_task(&task_setup_data);
1421         if (IS_ERR(task))
1422                 return PTR_ERR(task);
1423         status = nfs4_wait_for_completion_rpc_task(task);
1424         if (status != 0) {
1425                 data->cancelled = 1;
1426                 smp_wmb();
1427         } else
1428                 status = data->rpc_status;
1429         rpc_put_task(task);
1430         return status;
1431 }
1432
1433 static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
1434 {
1435         struct nfs4_opendata *data = calldata;
1436         struct nfs4_state_owner *sp = data->owner;
1437
1438         if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0)
1439                 return;
1440         /*
1441          * Check if we still need to send an OPEN call, or if we can use
1442          * a delegation instead.
1443          */
1444         if (data->state != NULL) {
1445                 struct nfs_delegation *delegation;
1446
1447                 if (can_open_cached(data->state, data->o_arg.fmode, data->o_arg.open_flags))
1448                         goto out_no_action;
1449                 rcu_read_lock();
1450                 delegation = rcu_dereference(NFS_I(data->state->inode)->delegation);
1451                 if (data->o_arg.claim != NFS4_OPEN_CLAIM_DELEGATE_CUR &&
1452                     can_open_delegated(delegation, data->o_arg.fmode))
1453                         goto unlock_no_action;
1454                 rcu_read_unlock();
1455         }
1456         /* Update sequence id. */
1457         data->o_arg.id = sp->so_owner_id.id;
1458         data->o_arg.clientid = sp->so_server->nfs_client->cl_clientid;
1459         if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS) {
1460                 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
1461                 nfs_copy_fh(&data->o_res.fh, data->o_arg.fh);
1462         }
1463         data->timestamp = jiffies;
1464         if (nfs4_setup_sequence(data->o_arg.server,
1465                                 &data->o_arg.seq_args,
1466                                 &data->o_res.seq_res,
1467                                 1, task) != 0)
1468                 nfs_release_seqid(data->o_arg.seqid);
1469         else
1470                 rpc_call_start(task);
1471         return;
1472 unlock_no_action:
1473         rcu_read_unlock();
1474 out_no_action:
1475         task->tk_action = NULL;
1476
1477 }
1478
1479 static void nfs4_recover_open_prepare(struct rpc_task *task, void *calldata)
1480 {
1481         rpc_task_set_priority(task, RPC_PRIORITY_PRIVILEGED);
1482         nfs4_open_prepare(task, calldata);
1483 }
1484
1485 static void nfs4_open_done(struct rpc_task *task, void *calldata)
1486 {
1487         struct nfs4_opendata *data = calldata;
1488
1489         data->rpc_status = task->tk_status;
1490
1491         if (!nfs4_sequence_done(task, &data->o_res.seq_res))
1492                 return;
1493
1494         if (task->tk_status == 0) {
1495                 switch (data->o_res.f_attr->mode & S_IFMT) {
1496                         case S_IFREG:
1497                                 break;
1498                         case S_IFLNK:
1499                                 data->rpc_status = -ELOOP;
1500                                 break;
1501                         case S_IFDIR:
1502                                 data->rpc_status = -EISDIR;
1503                                 break;
1504                         default:
1505                                 data->rpc_status = -ENOTDIR;
1506                 }
1507                 renew_lease(data->o_res.server, data->timestamp);
1508                 if (!(data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM))
1509                         nfs_confirm_seqid(&data->owner->so_seqid, 0);
1510         }
1511         data->rpc_done = 1;
1512 }
1513
1514 static void nfs4_open_release(void *calldata)
1515 {
1516         struct nfs4_opendata *data = calldata;
1517         struct nfs4_state *state = NULL;
1518
1519         /* If this request hasn't been cancelled, do nothing */
1520         if (data->cancelled == 0)
1521                 goto out_free;
1522         /* In case of error, no cleanup! */
1523         if (data->rpc_status != 0 || !data->rpc_done)
1524                 goto out_free;
1525         /* In case we need an open_confirm, no cleanup! */
1526         if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM)
1527                 goto out_free;
1528         state = nfs4_opendata_to_nfs4_state(data);
1529         if (!IS_ERR(state))
1530                 nfs4_close_state(state, data->o_arg.fmode);
1531 out_free:
1532         nfs4_opendata_put(data);
1533 }
1534
1535 static const struct rpc_call_ops nfs4_open_ops = {
1536         .rpc_call_prepare = nfs4_open_prepare,
1537         .rpc_call_done = nfs4_open_done,
1538         .rpc_release = nfs4_open_release,
1539 };
1540
1541 static const struct rpc_call_ops nfs4_recover_open_ops = {
1542         .rpc_call_prepare = nfs4_recover_open_prepare,
1543         .rpc_call_done = nfs4_open_done,
1544         .rpc_release = nfs4_open_release,
1545 };
1546
1547 static int nfs4_run_open_task(struct nfs4_opendata *data, int isrecover)
1548 {
1549         struct inode *dir = data->dir->d_inode;
1550         struct nfs_server *server = NFS_SERVER(dir);
1551         struct nfs_openargs *o_arg = &data->o_arg;
1552         struct nfs_openres *o_res = &data->o_res;
1553         struct rpc_task *task;
1554         struct rpc_message msg = {
1555                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN],
1556                 .rpc_argp = o_arg,
1557                 .rpc_resp = o_res,
1558                 .rpc_cred = data->owner->so_cred,
1559         };
1560         struct rpc_task_setup task_setup_data = {
1561                 .rpc_client = server->client,
1562                 .rpc_message = &msg,
1563                 .callback_ops = &nfs4_open_ops,
1564                 .callback_data = data,
1565                 .workqueue = nfsiod_workqueue,
1566                 .flags = RPC_TASK_ASYNC,
1567         };
1568         int status;
1569
1570         kref_get(&data->kref);
1571         data->rpc_done = 0;
1572         data->rpc_status = 0;
1573         data->cancelled = 0;
1574         if (isrecover)
1575                 task_setup_data.callback_ops = &nfs4_recover_open_ops;
1576         task = rpc_run_task(&task_setup_data);
1577         if (IS_ERR(task))
1578                 return PTR_ERR(task);
1579         status = nfs4_wait_for_completion_rpc_task(task);
1580         if (status != 0) {
1581                 data->cancelled = 1;
1582                 smp_wmb();
1583         } else
1584                 status = data->rpc_status;
1585         rpc_put_task(task);
1586
1587         return status;
1588 }
1589
1590 static int _nfs4_recover_proc_open(struct nfs4_opendata *data)
1591 {
1592         struct inode *dir = data->dir->d_inode;
1593         struct nfs_openres *o_res = &data->o_res;
1594         int status;
1595
1596         status = nfs4_run_open_task(data, 1);
1597         if (status != 0 || !data->rpc_done)
1598                 return status;
1599
1600         nfs_refresh_inode(dir, o_res->dir_attr);
1601
1602         if (o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) {
1603                 status = _nfs4_proc_open_confirm(data);
1604                 if (status != 0)
1605                         return status;
1606         }
1607
1608         return status;
1609 }
1610
1611 /*
1612  * Note: On error, nfs4_proc_open will free the struct nfs4_opendata
1613  */
1614 static int _nfs4_proc_open(struct nfs4_opendata *data)
1615 {
1616         struct inode *dir = data->dir->d_inode;
1617         struct nfs_server *server = NFS_SERVER(dir);
1618         struct nfs_openargs *o_arg = &data->o_arg;
1619         struct nfs_openres *o_res = &data->o_res;
1620         int status;
1621
1622         status = nfs4_run_open_task(data, 0);
1623         if (!data->rpc_done)
1624                 return status;
1625         if (status != 0) {
1626                 if (status == -NFS4ERR_BADNAME &&
1627                                 !(o_arg->open_flags & O_CREAT))
1628                         return -ENOENT;
1629                 return status;
1630         }
1631
1632         if (o_arg->open_flags & O_CREAT) {
1633                 update_changeattr(dir, &o_res->cinfo);
1634                 nfs_post_op_update_inode(dir, o_res->dir_attr);
1635         } else
1636                 nfs_refresh_inode(dir, o_res->dir_attr);
1637         if ((o_res->rflags & NFS4_OPEN_RESULT_LOCKTYPE_POSIX) == 0)
1638                 server->caps &= ~NFS_CAP_POSIX_LOCK;
1639         if(o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) {
1640                 status = _nfs4_proc_open_confirm(data);
1641                 if (status != 0)
1642                         return status;
1643         }
1644         if (!(o_res->f_attr->valid & NFS_ATTR_FATTR))
1645                 _nfs4_proc_getattr(server, &o_res->fh, o_res->f_attr);
1646         return 0;
1647 }
1648
1649 static int nfs4_client_recover_expired_lease(struct nfs_client *clp)
1650 {
1651         unsigned int loop;
1652         int ret;
1653
1654         for (loop = NFS4_MAX_LOOP_ON_RECOVER; loop != 0; loop--) {
1655                 ret = nfs4_wait_clnt_recover(clp);
1656                 if (ret != 0)
1657                         break;
1658                 if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) &&
1659                     !test_bit(NFS4CLNT_CHECK_LEASE,&clp->cl_state))
1660                         break;
1661                 nfs4_schedule_state_manager(clp);
1662                 ret = -EIO;
1663         }
1664         return ret;
1665 }
1666
1667 static int nfs4_recover_expired_lease(struct nfs_server *server)
1668 {
1669         return nfs4_client_recover_expired_lease(server->nfs_client);
1670 }
1671
1672 /*
1673  * OPEN_EXPIRED:
1674  *      reclaim state on the server after a network partition.
1675  *      Assumes caller holds the appropriate lock
1676  */
1677 static int _nfs4_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state)
1678 {
1679         struct nfs4_opendata *opendata;
1680         int ret;
1681
1682         opendata = nfs4_open_recoverdata_alloc(ctx, state);
1683         if (IS_ERR(opendata))
1684                 return PTR_ERR(opendata);
1685         ret = nfs4_open_recover(opendata, state);
1686         if (ret == -ESTALE)
1687                 d_drop(ctx->dentry);
1688         nfs4_opendata_put(opendata);
1689         return ret;
1690 }
1691
1692 static int nfs4_do_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state)
1693 {
1694         struct nfs_server *server = NFS_SERVER(state->inode);
1695         struct nfs4_exception exception = { };
1696         int err;
1697
1698         do {
1699                 err = _nfs4_open_expired(ctx, state);
1700                 switch (err) {
1701                 default:
1702                         goto out;
1703                 case -NFS4ERR_GRACE:
1704                 case -NFS4ERR_DELAY:
1705                         nfs4_handle_exception(server, err, &exception);
1706                         err = 0;
1707                 }
1708         } while (exception.retry);
1709 out:
1710         return err;
1711 }
1712
1713 static int nfs4_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state)
1714 {
1715         struct nfs_open_context *ctx;
1716         int ret;
1717
1718         ctx = nfs4_state_find_open_context(state);
1719         if (IS_ERR(ctx))
1720                 return PTR_ERR(ctx);
1721         ret = nfs4_do_open_expired(ctx, state);
1722         put_nfs_open_context(ctx);
1723         return ret;
1724 }
1725
1726 #if defined(CONFIG_NFS_V4_1)
1727 static int nfs41_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state)
1728 {
1729         int status;
1730         struct nfs_server *server = NFS_SERVER(state->inode);
1731
1732         status = nfs41_test_stateid(server, state);
1733         if (status == NFS_OK)
1734                 return 0;
1735         nfs41_free_stateid(server, state);
1736         return nfs4_open_expired(sp, state);
1737 }
1738 #endif
1739
1740 /*
1741  * on an EXCLUSIVE create, the server should send back a bitmask with FATTR4-*
1742  * fields corresponding to attributes that were used to store the verifier.
1743  * Make sure we clobber those fields in the later setattr call
1744  */
1745 static inline void nfs4_exclusive_attrset(struct nfs4_opendata *opendata, struct iattr *sattr)
1746 {
1747         if ((opendata->o_res.attrset[1] & FATTR4_WORD1_TIME_ACCESS) &&
1748             !(sattr->ia_valid & ATTR_ATIME_SET))
1749                 sattr->ia_valid |= ATTR_ATIME;
1750
1751         if ((opendata->o_res.attrset[1] & FATTR4_WORD1_TIME_MODIFY) &&
1752             !(sattr->ia_valid & ATTR_MTIME_SET))
1753                 sattr->ia_valid |= ATTR_MTIME;
1754 }
1755
1756 /*
1757  * Returns a referenced nfs4_state
1758  */
1759 static int _nfs4_do_open(struct inode *dir, struct dentry *dentry, fmode_t fmode, int flags, struct iattr *sattr, struct rpc_cred *cred, struct nfs4_state **res)
1760 {
1761         struct nfs4_state_owner  *sp;
1762         struct nfs4_state     *state = NULL;
1763         struct nfs_server       *server = NFS_SERVER(dir);
1764         struct nfs4_opendata *opendata;
1765         int status;
1766
1767         /* Protect against reboot recovery conflicts */
1768         status = -ENOMEM;
1769         if (!(sp = nfs4_get_state_owner(server, cred))) {
1770                 dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n");
1771                 goto out_err;
1772         }
1773         status = nfs4_recover_expired_lease(server);
1774         if (status != 0)
1775                 goto err_put_state_owner;
1776         if (dentry->d_inode != NULL)
1777                 nfs4_return_incompatible_delegation(dentry->d_inode, fmode);
1778         status = -ENOMEM;
1779         opendata = nfs4_opendata_alloc(dentry, sp, fmode, flags, sattr, GFP_KERNEL);
1780         if (opendata == NULL)
1781                 goto err_put_state_owner;
1782
1783         if (dentry->d_inode != NULL)
1784                 opendata->state = nfs4_get_open_state(dentry->d_inode, sp);
1785
1786         status = _nfs4_proc_open(opendata);
1787         if (status != 0)
1788                 goto err_opendata_put;
1789
1790         state = nfs4_opendata_to_nfs4_state(opendata);
1791         status = PTR_ERR(state);
1792         if (IS_ERR(state))
1793                 goto err_opendata_put;
1794         if (server->caps & NFS_CAP_POSIX_LOCK)
1795                 set_bit(NFS_STATE_POSIX_LOCKS, &state->flags);
1796
1797         if (opendata->o_arg.open_flags & O_EXCL) {
1798                 nfs4_exclusive_attrset(opendata, sattr);
1799
1800                 nfs_fattr_init(opendata->o_res.f_attr);
1801                 status = nfs4_do_setattr(state->inode, cred,
1802                                 opendata->o_res.f_attr, sattr,
1803                                 state);
1804                 if (status == 0)
1805                         nfs_setattr_update_inode(state->inode, sattr);
1806                 nfs_post_op_update_inode(state->inode, opendata->o_res.f_attr);
1807         }
1808         nfs_revalidate_inode(server, state->inode);
1809         nfs4_opendata_put(opendata);
1810         nfs4_put_state_owner(sp);
1811         *res = state;
1812         return 0;
1813 err_opendata_put:
1814         nfs4_opendata_put(opendata);
1815 err_put_state_owner:
1816         nfs4_put_state_owner(sp);
1817 out_err:
1818         *res = NULL;
1819         return status;
1820 }
1821
1822
1823 static struct nfs4_state *nfs4_do_open(struct inode *dir, struct dentry *dentry, fmode_t fmode, int flags, struct iattr *sattr, struct rpc_cred *cred)
1824 {
1825         struct nfs4_exception exception = { };
1826         struct nfs4_state *res;
1827         int status;
1828
1829         fmode &= FMODE_READ|FMODE_WRITE;
1830         do {
1831                 status = _nfs4_do_open(dir, dentry, fmode, flags, sattr, cred, &res);
1832                 if (status == 0)
1833                         break;
1834                 /* NOTE: BAD_SEQID means the server and client disagree about the
1835                  * book-keeping w.r.t. state-changing operations
1836                  * (OPEN/CLOSE/LOCK/LOCKU...)
1837                  * It is actually a sign of a bug on the client or on the server.
1838                  *
1839                  * If we receive a BAD_SEQID error in the particular case of
1840                  * doing an OPEN, we assume that nfs_increment_open_seqid() will
1841                  * have unhashed the old state_owner for us, and that we can
1842                  * therefore safely retry using a new one. We should still warn
1843                  * the user though...
1844                  */
1845                 if (status == -NFS4ERR_BAD_SEQID) {
1846                         pr_warn_ratelimited("NFS: v4 server %s "
1847                                         " returned a bad sequence-id error!\n",
1848                                         NFS_SERVER(dir)->nfs_client->cl_hostname);
1849                         exception.retry = 1;
1850                         continue;
1851                 }
1852                 /*
1853                  * BAD_STATEID on OPEN means that the server cancelled our
1854                  * state before it received the OPEN_CONFIRM.
1855                  * Recover by retrying the request as per the discussion
1856                  * on Page 181 of RFC3530.
1857                  */
1858                 if (status == -NFS4ERR_BAD_STATEID) {
1859                         exception.retry = 1;
1860                         continue;
1861                 }
1862                 if (status == -EAGAIN) {
1863                         /* We must have found a delegation */
1864                         exception.retry = 1;
1865                         continue;
1866                 }
1867                 res = ERR_PTR(nfs4_handle_exception(NFS_SERVER(dir),
1868                                         status, &exception));
1869         } while (exception.retry);
1870         return res;
1871 }
1872
1873 static int _nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
1874                             struct nfs_fattr *fattr, struct iattr *sattr,
1875                             struct nfs4_state *state)
1876 {
1877         struct nfs_server *server = NFS_SERVER(inode);
1878         struct nfs_setattrargs  arg = {
1879                 .fh             = NFS_FH(inode),
1880                 .iap            = sattr,
1881                 .server         = server,
1882                 .bitmask = server->attr_bitmask,
1883         };
1884         struct nfs_setattrres  res = {
1885                 .fattr          = fattr,
1886                 .server         = server,
1887         };
1888         struct rpc_message msg = {
1889                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_SETATTR],
1890                 .rpc_argp       = &arg,
1891                 .rpc_resp       = &res,
1892                 .rpc_cred       = cred,
1893         };
1894         unsigned long timestamp = jiffies;
1895         int status;
1896
1897         nfs_fattr_init(fattr);
1898
1899         if (nfs4_copy_delegation_stateid(&arg.stateid, inode)) {
1900                 /* Use that stateid */
1901         } else if (state != NULL) {
1902                 nfs4_copy_stateid(&arg.stateid, state, current->files, current->tgid);
1903         } else
1904                 memcpy(&arg.stateid, &zero_stateid, sizeof(arg.stateid));
1905
1906         status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
1907         if (status == 0 && state != NULL)
1908                 renew_lease(server, timestamp);
1909         return status;
1910 }
1911
1912 static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
1913                            struct nfs_fattr *fattr, struct iattr *sattr,
1914                            struct nfs4_state *state)
1915 {
1916         struct nfs_server *server = NFS_SERVER(inode);
1917         struct nfs4_exception exception = {
1918                 .state = state,
1919                 .inode = inode,
1920         };
1921         int err;
1922         do {
1923                 err = nfs4_handle_exception(server,
1924                                 _nfs4_do_setattr(inode, cred, fattr, sattr, state),
1925                                 &exception);
1926         } while (exception.retry);
1927         return err;
1928 }
1929
1930 struct nfs4_closedata {
1931         struct inode *inode;
1932         struct nfs4_state *state;
1933         struct nfs_closeargs arg;
1934         struct nfs_closeres res;
1935         struct nfs_fattr fattr;
1936         unsigned long timestamp;
1937         bool roc;
1938         u32 roc_barrier;
1939 };
1940
1941 static void nfs4_free_closedata(void *data)
1942 {
1943         struct nfs4_closedata *calldata = data;
1944         struct nfs4_state_owner *sp = calldata->state->owner;
1945         struct super_block *sb = calldata->state->inode->i_sb;
1946
1947         if (calldata->roc)
1948                 pnfs_roc_release(calldata->state->inode);
1949         nfs4_put_open_state(calldata->state);
1950         nfs_free_seqid(calldata->arg.seqid);
1951         nfs4_put_state_owner(sp);
1952         nfs_sb_deactive(sb);
1953         kfree(calldata);
1954 }
1955
1956 static void nfs4_close_clear_stateid_flags(struct nfs4_state *state,
1957                 fmode_t fmode)
1958 {
1959         spin_lock(&state->owner->so_lock);
1960         if (!(fmode & FMODE_READ))
1961                 clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1962         if (!(fmode & FMODE_WRITE))
1963                 clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1964         clear_bit(NFS_O_RDWR_STATE, &state->flags);
1965         spin_unlock(&state->owner->so_lock);
1966 }
1967
1968 static void nfs4_close_done(struct rpc_task *task, void *data)
1969 {
1970         struct nfs4_closedata *calldata = data;
1971         struct nfs4_state *state = calldata->state;
1972         struct nfs_server *server = NFS_SERVER(calldata->inode);
1973
1974         if (!nfs4_sequence_done(task, &calldata->res.seq_res))
1975                 return;
1976         /* hmm. we are done with the inode, and in the process of freeing
1977          * the state_owner. we keep this around to process errors
1978          */
1979         switch (task->tk_status) {
1980                 case 0:
1981                         if (calldata->roc)
1982                                 pnfs_roc_set_barrier(state->inode,
1983                                                      calldata->roc_barrier);
1984                         nfs_set_open_stateid(state, &calldata->res.stateid, 0);
1985                         renew_lease(server, calldata->timestamp);
1986                         nfs4_close_clear_stateid_flags(state,
1987                                         calldata->arg.fmode);
1988                         break;
1989                 case -NFS4ERR_STALE_STATEID:
1990                 case -NFS4ERR_OLD_STATEID:
1991                 case -NFS4ERR_BAD_STATEID:
1992                 case -NFS4ERR_EXPIRED:
1993                         if (calldata->arg.fmode == 0)
1994                                 break;
1995                 default:
1996                         if (nfs4_async_handle_error(task, server, state) == -EAGAIN)
1997                                 rpc_restart_call_prepare(task);
1998         }
1999         nfs_release_seqid(calldata->arg.seqid);
2000         nfs_refresh_inode(calldata->inode, calldata->res.fattr);
2001 }
2002
2003 static void nfs4_close_prepare(struct rpc_task *task, void *data)
2004 {
2005         struct nfs4_closedata *calldata = data;
2006         struct nfs4_state *state = calldata->state;
2007         int call_close = 0;
2008
2009         if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
2010                 return;
2011
2012         task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE];
2013         calldata->arg.fmode = FMODE_READ|FMODE_WRITE;
2014         spin_lock(&state->owner->so_lock);
2015         /* Calculate the change in open mode */
2016         if (state->n_rdwr == 0) {
2017                 if (state->n_rdonly == 0) {
2018                         call_close |= test_bit(NFS_O_RDONLY_STATE, &state->flags);
2019                         call_close |= test_bit(NFS_O_RDWR_STATE, &state->flags);
2020                         calldata->arg.fmode &= ~FMODE_READ;
2021                 }
2022                 if (state->n_wronly == 0) {
2023                         call_close |= test_bit(NFS_O_WRONLY_STATE, &state->flags);
2024                         call_close |= test_bit(NFS_O_RDWR_STATE, &state->flags);
2025                         calldata->arg.fmode &= ~FMODE_WRITE;
2026                 }
2027         }
2028         spin_unlock(&state->owner->so_lock);
2029
2030         if (!call_close) {
2031                 /* Note: exit _without_ calling nfs4_close_done */
2032                 task->tk_action = NULL;
2033                 return;
2034         }
2035
2036         if (calldata->arg.fmode == 0) {
2037                 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE];
2038                 if (calldata->roc &&
2039                     pnfs_roc_drain(calldata->inode, &calldata->roc_barrier)) {
2040                         rpc_sleep_on(&NFS_SERVER(calldata->inode)->roc_rpcwaitq,
2041                                      task, NULL);
2042                         return;
2043                 }
2044         }
2045
2046         nfs_fattr_init(calldata->res.fattr);
2047         calldata->timestamp = jiffies;
2048         if (nfs4_setup_sequence(NFS_SERVER(calldata->inode),
2049                                 &calldata->arg.seq_args, &calldata->res.seq_res,
2050                                 1, task) != 0)
2051                 nfs_release_seqid(calldata->arg.seqid);
2052         else
2053                 rpc_call_start(task);
2054 }
2055
2056 static const struct rpc_call_ops nfs4_close_ops = {
2057         .rpc_call_prepare = nfs4_close_prepare,
2058         .rpc_call_done = nfs4_close_done,
2059         .rpc_release = nfs4_free_closedata,
2060 };
2061
2062 /* 
2063  * It is possible for data to be read/written from a mem-mapped file 
2064  * after the sys_close call (which hits the vfs layer as a flush).
2065  * This means that we can't safely call nfsv4 close on a file until 
2066  * the inode is cleared. This in turn means that we are not good
2067  * NFSv4 citizens - we do not indicate to the server to update the file's 
2068  * share state even when we are done with one of the three share 
2069  * stateid's in the inode.
2070  *
2071  * NOTE: Caller must be holding the sp->so_owner semaphore!
2072  */
2073 int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait, bool roc)
2074 {
2075         struct nfs_server *server = NFS_SERVER(state->inode);
2076         struct nfs4_closedata *calldata;
2077         struct nfs4_state_owner *sp = state->owner;
2078         struct rpc_task *task;
2079         struct rpc_message msg = {
2080                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE],
2081                 .rpc_cred = state->owner->so_cred,
2082         };
2083         struct rpc_task_setup task_setup_data = {
2084                 .rpc_client = server->client,
2085                 .rpc_message = &msg,
2086                 .callback_ops = &nfs4_close_ops,
2087                 .workqueue = nfsiod_workqueue,
2088                 .flags = RPC_TASK_ASYNC,
2089         };
2090         int status = -ENOMEM;
2091
2092         calldata = kzalloc(sizeof(*calldata), gfp_mask);
2093         if (calldata == NULL)
2094                 goto out;
2095         calldata->inode = state->inode;
2096         calldata->state = state;
2097         calldata->arg.fh = NFS_FH(state->inode);
2098         calldata->arg.stateid = &state->open_stateid;
2099         /* Serialization for the sequence id */
2100         calldata->arg.seqid = nfs_alloc_seqid(&state->owner->so_seqid, gfp_mask);
2101         if (calldata->arg.seqid == NULL)
2102                 goto out_free_calldata;
2103         calldata->arg.fmode = 0;
2104         calldata->arg.bitmask = server->cache_consistency_bitmask;
2105         calldata->res.fattr = &calldata->fattr;
2106         calldata->res.seqid = calldata->arg.seqid;
2107         calldata->res.server = server;
2108         calldata->roc = roc;
2109         nfs_sb_active(calldata->inode->i_sb);
2110
2111         msg.rpc_argp = &calldata->arg;
2112         msg.rpc_resp = &calldata->res;
2113         task_setup_data.callback_data = calldata;
2114         task = rpc_run_task(&task_setup_data);
2115         if (IS_ERR(task))
2116                 return PTR_ERR(task);
2117         status = 0;
2118         if (wait)
2119                 status = rpc_wait_for_completion_task(task);
2120         rpc_put_task(task);
2121         return status;
2122 out_free_calldata:
2123         kfree(calldata);
2124 out:
2125         if (roc)
2126                 pnfs_roc_release(state->inode);
2127         nfs4_put_open_state(state);
2128         nfs4_put_state_owner(sp);
2129         return status;
2130 }
2131
2132 static struct inode *
2133 nfs4_atomic_open(struct inode *dir, struct nfs_open_context *ctx, int open_flags, struct iattr *attr)
2134 {
2135         struct nfs4_state *state;
2136
2137         /* Protect against concurrent sillydeletes */
2138         state = nfs4_do_open(dir, ctx->dentry, ctx->mode, open_flags, attr, ctx->cred);
2139         if (IS_ERR(state))
2140                 return ERR_CAST(state);
2141         ctx->state = state;
2142         return igrab(state->inode);
2143 }
2144
2145 static void nfs4_close_context(struct nfs_open_context *ctx, int is_sync)
2146 {
2147         if (ctx->state == NULL)
2148                 return;
2149         if (is_sync)
2150                 nfs4_close_sync(ctx->state, ctx->mode);
2151         else
2152                 nfs4_close_state(ctx->state, ctx->mode);
2153 }
2154
2155 static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
2156 {
2157         struct nfs4_server_caps_arg args = {
2158                 .fhandle = fhandle,
2159         };
2160         struct nfs4_server_caps_res res = {};
2161         struct rpc_message msg = {
2162                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SERVER_CAPS],
2163                 .rpc_argp = &args,
2164                 .rpc_resp = &res,
2165         };
2166         int status;
2167
2168         status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
2169         if (status == 0) {
2170                 memcpy(server->attr_bitmask, res.attr_bitmask, sizeof(server->attr_bitmask));
2171                 server->caps &= ~(NFS_CAP_ACLS|NFS_CAP_HARDLINKS|
2172                                 NFS_CAP_SYMLINKS|NFS_CAP_FILEID|
2173                                 NFS_CAP_MODE|NFS_CAP_NLINK|NFS_CAP_OWNER|
2174                                 NFS_CAP_OWNER_GROUP|NFS_CAP_ATIME|
2175                                 NFS_CAP_CTIME|NFS_CAP_MTIME);
2176                 if (res.attr_bitmask[0] & FATTR4_WORD0_ACL)
2177                         server->caps |= NFS_CAP_ACLS;
2178                 if (res.has_links != 0)
2179                         server->caps |= NFS_CAP_HARDLINKS;
2180                 if (res.has_symlinks != 0)
2181                         server->caps |= NFS_CAP_SYMLINKS;
2182                 if (res.attr_bitmask[0] & FATTR4_WORD0_FILEID)
2183                         server->caps |= NFS_CAP_FILEID;
2184                 if (res.attr_bitmask[1] & FATTR4_WORD1_MODE)
2185                         server->caps |= NFS_CAP_MODE;
2186                 if (res.attr_bitmask[1] & FATTR4_WORD1_NUMLINKS)
2187                         server->caps |= NFS_CAP_NLINK;
2188                 if (res.attr_bitmask[1] & FATTR4_WORD1_OWNER)
2189                         server->caps |= NFS_CAP_OWNER;
2190                 if (res.attr_bitmask[1] & FATTR4_WORD1_OWNER_GROUP)
2191                         server->caps |= NFS_CAP_OWNER_GROUP;
2192                 if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_ACCESS)
2193                         server->caps |= NFS_CAP_ATIME;
2194                 if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_METADATA)
2195                         server->caps |= NFS_CAP_CTIME;
2196                 if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_MODIFY)
2197                         server->caps |= NFS_CAP_MTIME;
2198
2199                 memcpy(server->cache_consistency_bitmask, res.attr_bitmask, sizeof(server->cache_consistency_bitmask));
2200                 server->cache_consistency_bitmask[0] &= FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE;
2201                 server->cache_consistency_bitmask[1] &= FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY;
2202                 server->acl_bitmask = res.acl_bitmask;
2203         }
2204
2205         return status;
2206 }
2207
2208 int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
2209 {
2210         struct nfs4_exception exception = { };
2211         int err;
2212         do {
2213                 err = nfs4_handle_exception(server,
2214                                 _nfs4_server_capabilities(server, fhandle),
2215                                 &exception);
2216         } while (exception.retry);
2217         return err;
2218 }
2219
2220 static int _nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
2221                 struct nfs_fsinfo *info)
2222 {
2223         struct nfs4_lookup_root_arg args = {
2224                 .bitmask = nfs4_fattr_bitmap,
2225         };
2226         struct nfs4_lookup_res res = {
2227                 .server = server,
2228                 .fattr = info->fattr,
2229                 .fh = fhandle,
2230         };
2231         struct rpc_message msg = {
2232                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP_ROOT],
2233                 .rpc_argp = &args,
2234                 .rpc_resp = &res,
2235         };
2236
2237         nfs_fattr_init(info->fattr);
2238         return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
2239 }
2240
2241 static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
2242                 struct nfs_fsinfo *info)
2243 {
2244         struct nfs4_exception exception = { };
2245         int err;
2246         do {
2247                 err = _nfs4_lookup_root(server, fhandle, info);
2248                 switch (err) {
2249                 case 0:
2250                 case -NFS4ERR_WRONGSEC:
2251                         goto out;
2252                 default:
2253                         err = nfs4_handle_exception(server, err, &exception);
2254                 }
2255         } while (exception.retry);
2256 out:
2257         return err;
2258 }
2259
2260 static int nfs4_lookup_root_sec(struct nfs_server *server, struct nfs_fh *fhandle,
2261                                 struct nfs_fsinfo *info, rpc_authflavor_t flavor)
2262 {
2263         struct rpc_auth *auth;
2264         int ret;
2265
2266         auth = rpcauth_create(flavor, server->client);
2267         if (!auth) {
2268                 ret = -EIO;
2269                 goto out;
2270         }
2271         ret = nfs4_lookup_root(server, fhandle, info);
2272 out:
2273         return ret;
2274 }
2275
2276 static int nfs4_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle,
2277                               struct nfs_fsinfo *info)
2278 {
2279         int i, len, status = 0;
2280         rpc_authflavor_t flav_array[NFS_MAX_SECFLAVORS];
2281
2282         len = gss_mech_list_pseudoflavors(&flav_array[0]);
2283         flav_array[len] = RPC_AUTH_NULL;
2284         len += 1;
2285
2286         for (i = 0; i < len; i++) {
2287                 status = nfs4_lookup_root_sec(server, fhandle, info, flav_array[i]);
2288                 if (status == -NFS4ERR_WRONGSEC || status == -EACCES)
2289                         continue;
2290                 break;
2291         }
2292         /*
2293          * -EACCESS could mean that the user doesn't have correct permissions
2294          * to access the mount.  It could also mean that we tried to mount
2295          * with a gss auth flavor, but rpc.gssd isn't running.  Either way,
2296          * existing mount programs don't handle -EACCES very well so it should
2297          * be mapped to -EPERM instead.
2298          */
2299         if (status == -EACCES)
2300                 status = -EPERM;
2301         return status;
2302 }
2303
2304 /*
2305  * get the file handle for the "/" directory on the server
2306  */
2307 static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *fhandle,
2308                               struct nfs_fsinfo *info)
2309 {
2310         int minor_version = server->nfs_client->cl_minorversion;
2311         int status = nfs4_lookup_root(server, fhandle, info);
2312         if ((status == -NFS4ERR_WRONGSEC) && !(server->flags & NFS_MOUNT_SECFLAVOUR))
2313                 /*
2314                  * A status of -NFS4ERR_WRONGSEC will be mapped to -EPERM
2315                  * by nfs4_map_errors() as this function exits.
2316                  */
2317                 status = nfs_v4_minor_ops[minor_version]->find_root_sec(server, fhandle, info);
2318         if (status == 0)
2319                 status = nfs4_server_capabilities(server, fhandle);
2320         if (status == 0)
2321                 status = nfs4_do_fsinfo(server, fhandle, info);
2322         return nfs4_map_errors(status);
2323 }
2324
2325 static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr);
2326 /*
2327  * Get locations and (maybe) other attributes of a referral.
2328  * Note that we'll actually follow the referral later when
2329  * we detect fsid mismatch in inode revalidation
2330  */
2331 static int nfs4_get_referral(struct inode *dir, const struct qstr *name,
2332                              struct nfs_fattr *fattr, struct nfs_fh *fhandle)
2333 {
2334         int status = -ENOMEM;
2335         struct page *page = NULL;
2336         struct nfs4_fs_locations *locations = NULL;
2337
2338         page = alloc_page(GFP_KERNEL);
2339         if (page == NULL)
2340                 goto out;
2341         locations = kmalloc(sizeof(struct nfs4_fs_locations), GFP_KERNEL);
2342         if (locations == NULL)
2343                 goto out;
2344
2345         status = nfs4_proc_fs_locations(dir, name, locations, page);
2346         if (status != 0)
2347                 goto out;
2348         /* Make sure server returned a different fsid for the referral */
2349         if (nfs_fsid_equal(&NFS_SERVER(dir)->fsid, &locations->fattr.fsid)) {
2350                 dprintk("%s: server did not return a different fsid for"
2351                         " a referral at %s\n", __func__, name->name);
2352                 status = -EIO;
2353                 goto out;
2354         }
2355         /* Fixup attributes for the nfs_lookup() call to nfs_fhget() */
2356         nfs_fixup_referral_attributes(&locations->fattr);
2357
2358         /* replace the lookup nfs_fattr with the locations nfs_fattr */
2359         memcpy(fattr, &locations->fattr, sizeof(struct nfs_fattr));
2360         memset(fhandle, 0, sizeof(struct nfs_fh));
2361 out:
2362         if (page)
2363                 __free_page(page);
2364         kfree(locations);
2365         return status;
2366 }
2367
2368 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
2369 {
2370         struct nfs4_getattr_arg args = {
2371                 .fh = fhandle,
2372                 .bitmask = server->attr_bitmask,
2373         };
2374         struct nfs4_getattr_res res = {
2375                 .fattr = fattr,
2376                 .server = server,
2377         };
2378         struct rpc_message msg = {
2379                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETATTR],
2380                 .rpc_argp = &args,
2381                 .rpc_resp = &res,
2382         };
2383         
2384         nfs_fattr_init(fattr);
2385         return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
2386 }
2387
2388 static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr)
2389 {
2390         struct nfs4_exception exception = { };
2391         int err;
2392         do {
2393                 err = nfs4_handle_exception(server,
2394                                 _nfs4_proc_getattr(server, fhandle, fattr),
2395                                 &exception);
2396         } while (exception.retry);
2397         return err;
2398 }
2399
2400 /* 
2401  * The file is not closed if it is opened due to the a request to change
2402  * the size of the file. The open call will not be needed once the
2403  * VFS layer lookup-intents are implemented.
2404  *
2405  * Close is called when the inode is destroyed.
2406  * If we haven't opened the file for O_WRONLY, we
2407  * need to in the size_change case to obtain a stateid.
2408  *
2409  * Got race?
2410  * Because OPEN is always done by name in nfsv4, it is
2411  * possible that we opened a different file by the same
2412  * name.  We can recognize this race condition, but we
2413  * can't do anything about it besides returning an error.
2414  *
2415  * This will be fixed with VFS changes (lookup-intent).
2416  */
2417 static int
2418 nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
2419                   struct iattr *sattr)
2420 {
2421         struct inode *inode = dentry->d_inode;
2422         struct rpc_cred *cred = NULL;
2423         struct nfs4_state *state = NULL;
2424         int status;
2425
2426         if (pnfs_ld_layoutret_on_setattr(inode))
2427                 pnfs_return_layout(inode);
2428
2429         nfs_fattr_init(fattr);
2430         
2431         /* Search for an existing open(O_WRITE) file */
2432         if (sattr->ia_valid & ATTR_FILE) {
2433                 struct nfs_open_context *ctx;
2434
2435                 ctx = nfs_file_open_context(sattr->ia_file);
2436                 if (ctx) {
2437                         cred = ctx->cred;
2438                         state = ctx->state;
2439                 }
2440         }
2441
2442         status = nfs4_do_setattr(inode, cred, fattr, sattr, state);
2443         if (status == 0)
2444                 nfs_setattr_update_inode(inode, sattr);
2445         return status;
2446 }
2447
2448 static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
2449                 const struct qstr *name, struct nfs_fh *fhandle,
2450                 struct nfs_fattr *fattr)
2451 {
2452         struct nfs_server *server = NFS_SERVER(dir);
2453         int                    status;
2454         struct nfs4_lookup_arg args = {
2455                 .bitmask = server->attr_bitmask,
2456                 .dir_fh = NFS_FH(dir),
2457                 .name = name,
2458         };
2459         struct nfs4_lookup_res res = {
2460                 .server = server,
2461                 .fattr = fattr,
2462                 .fh = fhandle,
2463         };
2464         struct rpc_message msg = {
2465                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP],
2466                 .rpc_argp = &args,
2467                 .rpc_resp = &res,
2468         };
2469
2470         nfs_fattr_init(fattr);
2471
2472         dprintk("NFS call  lookup %s\n", name->name);
2473         status = nfs4_call_sync(clnt, server, &msg, &args.seq_args, &res.seq_res, 0);
2474         dprintk("NFS reply lookup: %d\n", status);
2475         return status;
2476 }
2477
2478 void nfs_fixup_secinfo_attributes(struct nfs_fattr *fattr, struct nfs_fh *fh)
2479 {
2480         memset(fh, 0, sizeof(struct nfs_fh));
2481         fattr->fsid.major = 1;
2482         fattr->valid |= NFS_ATTR_FATTR_TYPE | NFS_ATTR_FATTR_MODE |
2483                 NFS_ATTR_FATTR_NLINK | NFS_ATTR_FATTR_FSID | NFS_ATTR_FATTR_MOUNTPOINT;
2484         fattr->mode = S_IFDIR | S_IRUGO | S_IXUGO;
2485         fattr->nlink = 2;
2486 }
2487
2488 static int nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir, struct qstr *name,
2489                             struct nfs_fh *fhandle, struct nfs_fattr *fattr)
2490 {
2491         struct nfs4_exception exception = { };
2492         int err;
2493         do {
2494                 int status;
2495
2496                 status = _nfs4_proc_lookup(clnt, dir, name, fhandle, fattr);
2497                 switch (status) {
2498                 case -NFS4ERR_BADNAME:
2499                         return -ENOENT;
2500                 case -NFS4ERR_MOVED:
2501                         return nfs4_get_referral(dir, name, fattr, fhandle);
2502                 case -NFS4ERR_WRONGSEC:
2503                         nfs_fixup_secinfo_attributes(fattr, fhandle);
2504                 }
2505                 err = nfs4_handle_exception(NFS_SERVER(dir),
2506                                 status, &exception);
2507         } while (exception.retry);
2508         return err;
2509 }
2510
2511 static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
2512 {
2513         struct nfs_server *server = NFS_SERVER(inode);
2514         struct nfs4_accessargs args = {
2515                 .fh = NFS_FH(inode),
2516                 .bitmask = server->attr_bitmask,
2517         };
2518         struct nfs4_accessres res = {
2519                 .server = server,
2520         };
2521         struct rpc_message msg = {
2522                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ACCESS],
2523                 .rpc_argp = &args,
2524                 .rpc_resp = &res,
2525                 .rpc_cred = entry->cred,
2526         };
2527         int mode = entry->mask;
2528         int status;
2529
2530         /*
2531          * Determine which access bits we want to ask for...
2532          */
2533         if (mode & MAY_READ)
2534                 args.access |= NFS4_ACCESS_READ;
2535         if (S_ISDIR(inode->i_mode)) {
2536                 if (mode & MAY_WRITE)
2537                         args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE;
2538                 if (mode & MAY_EXEC)
2539                         args.access |= NFS4_ACCESS_LOOKUP;
2540         } else {
2541                 if (mode & MAY_WRITE)
2542                         args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND;
2543                 if (mode & MAY_EXEC)
2544                         args.access |= NFS4_ACCESS_EXECUTE;
2545         }
2546
2547         res.fattr = nfs_alloc_fattr();
2548         if (res.fattr == NULL)
2549                 return -ENOMEM;
2550
2551         status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
2552         if (!status) {
2553                 entry->mask = 0;
2554                 if (res.access & NFS4_ACCESS_READ)
2555                         entry->mask |= MAY_READ;
2556                 if (res.access & (NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE))
2557                         entry->mask |= MAY_WRITE;
2558                 if (res.access & (NFS4_ACCESS_LOOKUP|NFS4_ACCESS_EXECUTE))
2559                         entry->mask |= MAY_EXEC;
2560                 nfs_refresh_inode(inode, res.fattr);
2561         }
2562         nfs_free_fattr(res.fattr);
2563         return status;
2564 }
2565
2566 static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
2567 {
2568         struct nfs4_exception exception = { };
2569         int err;
2570         do {
2571                 err = nfs4_handle_exception(NFS_SERVER(inode),
2572                                 _nfs4_proc_access(inode, entry),
2573                                 &exception);
2574         } while (exception.retry);
2575         return err;
2576 }
2577
2578 /*
2579  * TODO: For the time being, we don't try to get any attributes
2580  * along with any of the zero-copy operations READ, READDIR,
2581  * READLINK, WRITE.
2582  *
2583  * In the case of the first three, we want to put the GETATTR
2584  * after the read-type operation -- this is because it is hard
2585  * to predict the length of a GETATTR response in v4, and thus
2586  * align the READ data correctly.  This means that the GETATTR
2587  * may end up partially falling into the page cache, and we should
2588  * shift it into the 'tail' of the xdr_buf before processing.
2589  * To do this efficiently, we need to know the total length
2590  * of data received, which doesn't seem to be available outside
2591  * of the RPC layer.
2592  *
2593  * In the case of WRITE, we also want to put the GETATTR after
2594  * the operation -- in this case because we want to make sure
2595  * we get the post-operation mtime and size.  This means that
2596  * we can't use xdr_encode_pages() as written: we need a variant
2597  * of it which would leave room in the 'tail' iovec.
2598  *
2599  * Both of these changes to the XDR layer would in fact be quite
2600  * minor, but I decided to leave them for a subsequent patch.
2601  */
2602 static int _nfs4_proc_readlink(struct inode *inode, struct page *page,
2603                 unsigned int pgbase, unsigned int pglen)
2604 {
2605         struct nfs4_readlink args = {
2606                 .fh       = NFS_FH(inode),
2607                 .pgbase   = pgbase,
2608                 .pglen    = pglen,
2609                 .pages    = &page,
2610         };
2611         struct nfs4_readlink_res res;
2612         struct rpc_message msg = {
2613                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READLINK],
2614                 .rpc_argp = &args,
2615                 .rpc_resp = &res,
2616         };
2617
2618         return nfs4_call_sync(NFS_SERVER(inode)->client, NFS_SERVER(inode), &msg, &args.seq_args, &res.seq_res, 0);
2619 }
2620
2621 static int nfs4_proc_readlink(struct inode *inode, struct page *page,
2622                 unsigned int pgbase, unsigned int pglen)
2623 {
2624         struct nfs4_exception exception = { };
2625         int err;
2626         do {
2627                 err = nfs4_handle_exception(NFS_SERVER(inode),
2628                                 _nfs4_proc_readlink(inode, page, pgbase, pglen),
2629                                 &exception);
2630         } while (exception.retry);
2631         return err;
2632 }
2633
2634 /*
2635  * Got race?
2636  * We will need to arrange for the VFS layer to provide an atomic open.
2637  * Until then, this create/open method is prone to inefficiency and race
2638  * conditions due to the lookup, create, and open VFS calls from sys_open()
2639  * placed on the wire.
2640  *
2641  * Given the above sorry state of affairs, I'm simply sending an OPEN.
2642  * The file will be opened again in the subsequent VFS open call
2643  * (nfs4_proc_file_open).
2644  *
2645  * The open for read will just hang around to be used by any process that
2646  * opens the file O_RDONLY. This will all be resolved with the VFS changes.
2647  */
2648
2649 static int
2650 nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
2651                  int flags, struct nfs_open_context *ctx)
2652 {
2653         struct dentry *de = dentry;
2654         struct nfs4_state *state;
2655         struct rpc_cred *cred = NULL;
2656         fmode_t fmode = 0;
2657         int status = 0;
2658
2659         if (ctx != NULL) {
2660                 cred = ctx->cred;
2661                 de = ctx->dentry;
2662                 fmode = ctx->mode;
2663         }
2664         sattr->ia_mode &= ~current_umask();
2665         state = nfs4_do_open(dir, de, fmode, flags, sattr, cred);
2666         d_drop(dentry);
2667         if (IS_ERR(state)) {
2668                 status = PTR_ERR(state);
2669                 goto out;
2670         }
2671         d_add(dentry, igrab(state->inode));
2672         nfs_set_verifier(dentry, nfs_save_change_attribute(dir));
2673         if (ctx != NULL)
2674                 ctx->state = state;
2675         else
2676                 nfs4_close_sync(state, fmode);
2677 out:
2678         return status;
2679 }
2680
2681 static int _nfs4_proc_remove(struct inode *dir, struct qstr *name)
2682 {
2683         struct nfs_server *server = NFS_SERVER(dir);
2684         struct nfs_removeargs args = {
2685                 .fh = NFS_FH(dir),
2686                 .name.len = name->len,
2687                 .name.name = name->name,
2688                 .bitmask = server->attr_bitmask,
2689         };
2690         struct nfs_removeres res = {
2691                 .server = server,
2692         };
2693         struct rpc_message msg = {
2694                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE],
2695                 .rpc_argp = &args,
2696                 .rpc_resp = &res,
2697         };
2698         int status = -ENOMEM;
2699
2700         res.dir_attr = nfs_alloc_fattr();
2701         if (res.dir_attr == NULL)
2702                 goto out;
2703
2704         status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 1);
2705         if (status == 0) {
2706                 update_changeattr(dir, &res.cinfo);
2707                 nfs_post_op_update_inode(dir, res.dir_attr);
2708         }
2709         nfs_free_fattr(res.dir_attr);
2710 out:
2711         return status;
2712 }
2713
2714 static int nfs4_proc_remove(struct inode *dir, struct qstr *name)
2715 {
2716         struct nfs4_exception exception = { };
2717         int err;
2718         do {
2719                 err = nfs4_handle_exception(NFS_SERVER(dir),
2720                                 _nfs4_proc_remove(dir, name),
2721                                 &exception);
2722         } while (exception.retry);
2723         return err;
2724 }
2725
2726 static void nfs4_proc_unlink_setup(struct rpc_message *msg, struct inode *dir)
2727 {
2728         struct nfs_server *server = NFS_SERVER(dir);
2729         struct nfs_removeargs *args = msg->rpc_argp;
2730         struct nfs_removeres *res = msg->rpc_resp;
2731
2732         args->bitmask = server->cache_consistency_bitmask;
2733         res->server = server;
2734         res->seq_res.sr_slot = NULL;
2735         msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE];
2736 }
2737
2738 static int nfs4_proc_unlink_done(struct rpc_task *task, struct inode *dir)
2739 {
2740         struct nfs_removeres *res = task->tk_msg.rpc_resp;
2741
2742         if (!nfs4_sequence_done(task, &res->seq_res))
2743                 return 0;
2744         if (nfs4_async_handle_error(task, res->server, NULL) == -EAGAIN)
2745                 return 0;
2746         update_changeattr(dir, &res->cinfo);
2747         nfs_post_op_update_inode(dir, res->dir_attr);
2748         return 1;
2749 }
2750
2751 static void nfs4_proc_rename_setup(struct rpc_message *msg, struct inode *dir)
2752 {
2753         struct nfs_server *server = NFS_SERVER(dir);
2754         struct nfs_renameargs *arg = msg->rpc_argp;
2755         struct nfs_renameres *res = msg->rpc_resp;
2756
2757         msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENAME];
2758         arg->bitmask = server->attr_bitmask;
2759         res->server = server;
2760 }
2761
2762 static int nfs4_proc_rename_done(struct rpc_task *task, struct inode *old_dir,
2763                                  struct inode *new_dir)
2764 {
2765         struct nfs_renameres *res = task->tk_msg.rpc_resp;
2766
2767         if (!nfs4_sequence_done(task, &res->seq_res))
2768                 return 0;
2769         if (nfs4_async_handle_error(task, res->server, NULL) == -EAGAIN)
2770                 return 0;
2771
2772         update_changeattr(old_dir, &res->old_cinfo);
2773         nfs_post_op_update_inode(old_dir, res->old_fattr);
2774         update_changeattr(new_dir, &res->new_cinfo);
2775         nfs_post_op_update_inode(new_dir, res->new_fattr);
2776         return 1;
2777 }
2778
2779 static int _nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name,
2780                 struct inode *new_dir, struct qstr *new_name)
2781 {
2782         struct nfs_server *server = NFS_SERVER(old_dir);
2783         struct nfs_renameargs arg = {
2784                 .old_dir = NFS_FH(old_dir),
2785                 .new_dir = NFS_FH(new_dir),
2786                 .old_name = old_name,
2787                 .new_name = new_name,
2788                 .bitmask = server->attr_bitmask,
2789         };
2790         struct nfs_renameres res = {
2791                 .server = server,
2792         };
2793         struct rpc_message msg = {
2794                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENAME],
2795                 .rpc_argp = &arg,
2796                 .rpc_resp = &res,
2797         };
2798         int status = -ENOMEM;
2799         
2800         res.old_fattr = nfs_alloc_fattr();
2801         res.new_fattr = nfs_alloc_fattr();
2802         if (res.old_fattr == NULL || res.new_fattr == NULL)
2803                 goto out;
2804
2805         status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
2806         if (!status) {
2807                 update_changeattr(old_dir, &res.old_cinfo);
2808                 nfs_post_op_update_inode(old_dir, res.old_fattr);
2809                 update_changeattr(new_dir, &res.new_cinfo);
2810                 nfs_post_op_update_inode(new_dir, res.new_fattr);
2811         }
2812 out:
2813         nfs_free_fattr(res.new_fattr);
2814         nfs_free_fattr(res.old_fattr);
2815         return status;
2816 }
2817
2818 static int nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name,
2819                 struct inode *new_dir, struct qstr *new_name)
2820 {
2821         struct nfs4_exception exception = { };
2822         int err;
2823         do {
2824                 err = nfs4_handle_exception(NFS_SERVER(old_dir),
2825                                 _nfs4_proc_rename(old_dir, old_name,
2826                                         new_dir, new_name),
2827                                 &exception);
2828         } while (exception.retry);
2829         return err;
2830 }
2831
2832 static int _nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
2833 {
2834         struct nfs_server *server = NFS_SERVER(inode);
2835         struct nfs4_link_arg arg = {
2836                 .fh     = NFS_FH(inode),
2837                 .dir_fh = NFS_FH(dir),
2838                 .name   = name,
2839                 .bitmask = server->attr_bitmask,
2840         };
2841         struct nfs4_link_res res = {
2842                 .server = server,
2843         };
2844         struct rpc_message msg = {
2845                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LINK],
2846                 .rpc_argp = &arg,
2847                 .rpc_resp = &res,
2848         };
2849         int status = -ENOMEM;
2850
2851         res.fattr = nfs_alloc_fattr();
2852         res.dir_attr = nfs_alloc_fattr();
2853         if (res.fattr == NULL || res.dir_attr == NULL)
2854                 goto out;
2855
2856         status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
2857         if (!status) {
2858                 update_changeattr(dir, &res.cinfo);
2859                 nfs_post_op_update_inode(dir, res.dir_attr);
2860                 nfs_post_op_update_inode(inode, res.fattr);
2861         }
2862 out:
2863         nfs_free_fattr(res.dir_attr);
2864         nfs_free_fattr(res.fattr);
2865         return status;
2866 }
2867
2868 static int nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name)
2869 {
2870         struct nfs4_exception exception = { };
2871         int err;
2872         do {
2873                 err = nfs4_handle_exception(NFS_SERVER(inode),
2874                                 _nfs4_proc_link(inode, dir, name),
2875                                 &exception);
2876         } while (exception.retry);
2877         return err;
2878 }
2879
2880 struct nfs4_createdata {
2881         struct rpc_message msg;
2882         struct nfs4_create_arg arg;
2883         struct nfs4_create_res res;
2884         struct nfs_fh fh;
2885         struct nfs_fattr fattr;
2886         struct nfs_fattr dir_fattr;
2887 };
2888
2889 static struct nfs4_createdata *nfs4_alloc_createdata(struct inode *dir,
2890                 struct qstr *name, struct iattr *sattr, u32 ftype)
2891 {
2892         struct nfs4_createdata *data;
2893
2894         data = kzalloc(sizeof(*data), GFP_KERNEL);
2895         if (data != NULL) {
2896                 struct nfs_server *server = NFS_SERVER(dir);
2897
2898                 data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE];
2899                 data->msg.rpc_argp = &data->arg;
2900                 data->msg.rpc_resp = &data->res;
2901                 data->arg.dir_fh = NFS_FH(dir);
2902                 data->arg.server = server;
2903                 data->arg.name = name;
2904                 data->arg.attrs = sattr;
2905                 data->arg.ftype = ftype;
2906                 data->arg.bitmask = server->attr_bitmask;
2907                 data->res.server = server;
2908                 data->res.fh = &data->fh;
2909                 data->res.fattr = &data->fattr;
2910                 data->res.dir_fattr = &data->dir_fattr;
2911                 nfs_fattr_init(data->res.fattr);
2912                 nfs_fattr_init(data->res.dir_fattr);
2913         }
2914         return data;
2915 }
2916
2917 static int nfs4_do_create(struct inode *dir, struct dentry *dentry, struct nfs4_createdata *data)
2918 {
2919         int status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &data->msg,
2920                                     &data->arg.seq_args, &data->res.seq_res, 1);
2921         if (status == 0) {
2922                 update_changeattr(dir, &data->res.dir_cinfo);
2923                 nfs_post_op_update_inode(dir, data->res.dir_fattr);
2924                 status = nfs_instantiate(dentry, data->res.fh, data->res.fattr);
2925         }
2926         return status;
2927 }
2928
2929 static void nfs4_free_createdata(struct nfs4_createdata *data)
2930 {
2931         kfree(data);
2932 }
2933
2934 static int _nfs4_proc_symlink(struct inode *dir, struct dentry *dentry,
2935                 struct page *page, unsigned int len, struct iattr *sattr)
2936 {
2937         struct nfs4_createdata *data;
2938         int status = -ENAMETOOLONG;
2939
2940         if (len > NFS4_MAXPATHLEN)
2941                 goto out;
2942
2943         status = -ENOMEM;
2944         data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4LNK);
2945         if (data == NULL)
2946                 goto out;
2947
2948         data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SYMLINK];
2949         data->arg.u.symlink.pages = &page;
2950         data->arg.u.symlink.len = len;
2951         
2952         status = nfs4_do_create(dir, dentry, data);
2953
2954         nfs4_free_createdata(data);
2955 out:
2956         return status;
2957 }
2958
2959 static int nfs4_proc_symlink(struct inode *dir, struct dentry *dentry,
2960                 struct page *page, unsigned int len, struct iattr *sattr)
2961 {
2962         struct nfs4_exception exception = { };
2963         int err;
2964         do {
2965                 err = nfs4_handle_exception(NFS_SERVER(dir),
2966                                 _nfs4_proc_symlink(dir, dentry, page,
2967                                                         len, sattr),
2968                                 &exception);
2969         } while (exception.retry);
2970         return err;
2971 }
2972
2973 static int _nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
2974                 struct iattr *sattr)
2975 {
2976         struct nfs4_createdata *data;
2977         int status = -ENOMEM;
2978
2979         data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4DIR);
2980         if (data == NULL)
2981                 goto out;
2982
2983         status = nfs4_do_create(dir, dentry, data);
2984
2985         nfs4_free_createdata(data);
2986 out:
2987         return status;
2988 }
2989
2990 static int nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
2991                 struct iattr *sattr)
2992 {
2993         struct nfs4_exception exception = { };
2994         int err;
2995
2996         sattr->ia_mode &= ~current_umask();
2997         do {
2998                 err = nfs4_handle_exception(NFS_SERVER(dir),
2999                                 _nfs4_proc_mkdir(dir, dentry, sattr),
3000                                 &exception);
3001         } while (exception.retry);
3002         return err;
3003 }
3004
3005 static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
3006                 u64 cookie, struct page **pages, unsigned int count, int plus)
3007 {
3008         struct inode            *dir = dentry->d_inode;
3009         struct nfs4_readdir_arg args = {
3010                 .fh = NFS_FH(dir),
3011                 .pages = pages,
3012                 .pgbase = 0,
3013                 .count = count,
3014                 .bitmask = NFS_SERVER(dentry->d_inode)->attr_bitmask,
3015                 .plus = plus,
3016         };
3017         struct nfs4_readdir_res res;
3018         struct rpc_message msg = {
3019                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR],
3020                 .rpc_argp = &args,
3021                 .rpc_resp = &res,
3022                 .rpc_cred = cred,
3023         };
3024         int                     status;
3025
3026         dprintk("%s: dentry = %s/%s, cookie = %Lu\n", __func__,
3027                         dentry->d_parent->d_name.name,
3028                         dentry->d_name.name,
3029                         (unsigned long long)cookie);
3030         nfs4_setup_readdir(cookie, NFS_I(dir)->cookieverf, dentry, &args);
3031         res.pgbase = args.pgbase;
3032         status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0);
3033         if (status >= 0) {
3034                 memcpy(NFS_I(dir)->cookieverf, res.verifier.data, NFS4_VERIFIER_SIZE);
3035                 status += args.pgbase;
3036         }
3037
3038         nfs_invalidate_atime(dir);
3039
3040         dprintk("%s: returns %d\n", __func__, status);
3041         return status;
3042 }
3043
3044 static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
3045                 u64 cookie, struct page **pages, unsigned int count, int plus)
3046 {
3047         struct nfs4_exception exception = { };
3048         int err;
3049         do {
3050                 err = nfs4_handle_exception(NFS_SERVER(dentry->d_inode),
3051                                 _nfs4_proc_readdir(dentry, cred, cookie,
3052                                         pages, count, plus),
3053                                 &exception);
3054         } while (exception.retry);
3055         return err;
3056 }
3057
3058 static int _nfs4_proc_mknod(struct inode *dir, struct dentry *dentry,
3059                 struct iattr *sattr, dev_t rdev)
3060 {
3061         struct nfs4_createdata *data;
3062         int mode = sattr->ia_mode;
3063         int status = -ENOMEM;
3064
3065         BUG_ON(!(sattr->ia_valid & ATTR_MODE));
3066         BUG_ON(!S_ISFIFO(mode) && !S_ISBLK(mode) && !S_ISCHR(mode) && !S_ISSOCK(mode));
3067
3068         data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4SOCK);
3069         if (data == NULL)
3070                 goto out;
3071
3072         if (S_ISFIFO(mode))
3073                 data->arg.ftype = NF4FIFO;
3074         else if (S_ISBLK(mode)) {
3075                 data->arg.ftype = NF4BLK;
3076                 data->arg.u.device.specdata1 = MAJOR(rdev);
3077                 data->arg.u.device.specdata2 = MINOR(rdev);
3078         }
3079         else if (S_ISCHR(mode)) {
3080                 data->arg.ftype = NF4CHR;
3081                 data->arg.u.device.specdata1 = MAJOR(rdev);
3082                 data->arg.u.device.specdata2 = MINOR(rdev);
3083         }
3084         
3085         status = nfs4_do_create(dir, dentry, data);
3086
3087         nfs4_free_createdata(data);
3088 out:
3089         return status;
3090 }
3091
3092 static int nfs4_proc_mknod(struct inode *dir, struct dentry *dentry,
3093                 struct iattr *sattr, dev_t rdev)
3094 {
3095         struct nfs4_exception exception = { };
3096         int err;
3097
3098         sattr->ia_mode &= ~current_umask();
3099         do {
3100                 err = nfs4_handle_exception(NFS_SERVER(dir),
3101                                 _nfs4_proc_mknod(dir, dentry, sattr, rdev),
3102                                 &exception);
3103         } while (exception.retry);
3104         return err;
3105 }
3106
3107 static int _nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
3108                  struct nfs_fsstat *fsstat)
3109 {
3110         struct nfs4_statfs_arg args = {
3111                 .fh = fhandle,
3112                 .bitmask = server->attr_bitmask,
3113         };
3114         struct nfs4_statfs_res res = {
3115                 .fsstat = fsstat,
3116         };
3117         struct rpc_message msg = {
3118                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_STATFS],
3119                 .rpc_argp = &args,
3120                 .rpc_resp = &res,
3121         };
3122
3123         nfs_fattr_init(fsstat->fattr);
3124         return  nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
3125 }
3126
3127 static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat)
3128 {
3129         struct nfs4_exception exception = { };
3130         int err;
3131         do {
3132                 err = nfs4_handle_exception(server,
3133                                 _nfs4_proc_statfs(server, fhandle, fsstat),
3134                                 &exception);
3135         } while (exception.retry);
3136         return err;
3137 }
3138
3139 static int _nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
3140                 struct nfs_fsinfo *fsinfo)
3141 {
3142         struct nfs4_fsinfo_arg args = {
3143                 .fh = fhandle,
3144                 .bitmask = server->attr_bitmask,
3145         };
3146         struct nfs4_fsinfo_res res = {
3147                 .fsinfo = fsinfo,
3148         };
3149         struct rpc_message msg = {
3150                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSINFO],
3151                 .rpc_argp = &args,
3152                 .rpc_resp = &res,
3153         };
3154
3155         return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
3156 }
3157
3158 static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
3159 {
3160         struct nfs4_exception exception = { };
3161         int err;
3162
3163         do {
3164                 err = nfs4_handle_exception(server,
3165                                 _nfs4_do_fsinfo(server, fhandle, fsinfo),
3166                                 &exception);
3167         } while (exception.retry);
3168         return err;
3169 }
3170
3171 static int nfs4_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
3172 {
3173         nfs_fattr_init(fsinfo->fattr);
3174         return nfs4_do_fsinfo(server, fhandle, fsinfo);
3175 }
3176
3177 static int _nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
3178                 struct nfs_pathconf *pathconf)
3179 {
3180         struct nfs4_pathconf_arg args = {
3181                 .fh = fhandle,
3182                 .bitmask = server->attr_bitmask,
3183         };
3184         struct nfs4_pathconf_res res = {
3185                 .pathconf = pathconf,
3186         };
3187         struct rpc_message msg = {
3188                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_PATHCONF],
3189                 .rpc_argp = &args,
3190                 .rpc_resp = &res,
3191         };
3192
3193         /* None of the pathconf attributes are mandatory to implement */
3194         if ((args.bitmask[0] & nfs4_pathconf_bitmap[0]) == 0) {
3195                 memset(pathconf, 0, sizeof(*pathconf));
3196                 return 0;
3197         }
3198
3199         nfs_fattr_init(pathconf->fattr);
3200         return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
3201 }
3202
3203 static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
3204                 struct nfs_pathconf *pathconf)
3205 {
3206         struct nfs4_exception exception = { };
3207         int err;
3208
3209         do {
3210                 err = nfs4_handle_exception(server,
3211                                 _nfs4_proc_pathconf(server, fhandle, pathconf),
3212                                 &exception);
3213         } while (exception.retry);
3214         return err;
3215 }
3216
3217 void __nfs4_read_done_cb(struct nfs_read_data *data)
3218 {
3219         nfs_invalidate_atime(data->inode);
3220 }
3221
3222 static int nfs4_read_done_cb(struct rpc_task *task, struct nfs_read_data *data)
3223 {
3224         struct nfs_server *server = NFS_SERVER(data->inode);
3225
3226         if (nfs4_async_handle_error(task, server, data->args.context->state) == -EAGAIN) {
3227                 rpc_restart_call_prepare(task);
3228                 return -EAGAIN;
3229         }
3230
3231         __nfs4_read_done_cb(data);
3232         if (task->tk_status > 0)
3233                 renew_lease(server, data->timestamp);
3234         return 0;
3235 }
3236
3237 static int nfs4_read_done(struct rpc_task *task, struct nfs_read_data *data)
3238 {
3239
3240         dprintk("--> %s\n", __func__);
3241
3242         if (!nfs4_sequence_done(task, &data->res.seq_res))
3243                 return -EAGAIN;
3244
3245         return data->read_done_cb ? data->read_done_cb(task, data) :
3246                                     nfs4_read_done_cb(task, data);
3247 }
3248
3249 static void nfs4_proc_read_setup(struct nfs_read_data *data, struct rpc_message *msg)
3250 {
3251         data->timestamp   = jiffies;
3252         data->read_done_cb = nfs4_read_done_cb;
3253         msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
3254 }
3255
3256 /* Reset the the nfs_read_data to send the read to the MDS. */
3257 void nfs4_reset_read(struct rpc_task *task, struct nfs_read_data *data)
3258 {
3259         dprintk("%s Reset task for i/o through\n", __func__);
3260         put_lseg(data->lseg);
3261         data->lseg = NULL;
3262         /* offsets will differ in the dense stripe case */
3263         data->args.offset = data->mds_offset;
3264         data->ds_clp = NULL;
3265         data->args.fh     = NFS_FH(data->inode);
3266         data->read_done_cb = nfs4_read_done_cb;
3267         task->tk_ops = data->mds_ops;
3268         rpc_task_reset_client(task, NFS_CLIENT(data->inode));
3269 }
3270 EXPORT_SYMBOL_GPL(nfs4_reset_read);
3271
3272 static int nfs4_write_done_cb(struct rpc_task *task, struct nfs_write_data *data)
3273 {
3274         struct inode *inode = data->inode;
3275         
3276         if (nfs4_async_handle_error(task, NFS_SERVER(inode), data->args.context->state) == -EAGAIN) {
3277                 rpc_restart_call_prepare(task);
3278                 return -EAGAIN;
3279         }
3280         if (task->tk_status >= 0) {
3281                 renew_lease(NFS_SERVER(inode), data->timestamp);
3282                 nfs_post_op_update_inode_force_wcc(inode, data->res.fattr);
3283         }
3284         return 0;
3285 }
3286
3287 static int nfs4_write_done(struct rpc_task *task, struct nfs_write_data *data)
3288 {
3289         if (!nfs4_sequence_done(task, &data->res.seq_res))
3290                 return -EAGAIN;
3291         return data->write_done_cb ? data->write_done_cb(task, data) :
3292                 nfs4_write_done_cb(task, data);
3293 }
3294
3295 /* Reset the the nfs_write_data to send the write to the MDS. */
3296 void nfs4_reset_write(struct rpc_task *task, struct nfs_write_data *data)
3297 {
3298         dprintk("%s Reset task for i/o through\n", __func__);
3299         put_lseg(data->lseg);
3300         data->lseg          = NULL;
3301         data->ds_clp        = NULL;
3302         data->write_done_cb = nfs4_write_done_cb;
3303         data->args.fh       = NFS_FH(data->inode);
3304         data->args.bitmask  = data->res.server->cache_consistency_bitmask;
3305         data->args.offset   = data->mds_offset;
3306         data->res.fattr     = &data->fattr;
3307         task->tk_ops        = data->mds_ops;
3308         rpc_task_reset_client(task, NFS_CLIENT(data->inode));
3309 }
3310 EXPORT_SYMBOL_GPL(nfs4_reset_write);
3311
3312 static void nfs4_proc_write_setup(struct nfs_write_data *data, struct rpc_message *msg)
3313 {
3314         struct nfs_server *server = NFS_SERVER(data->inode);
3315
3316         if (data->lseg) {
3317                 data->args.bitmask = NULL;
3318                 data->res.fattr = NULL;
3319         } else
3320                 data->args.bitmask = server->cache_consistency_bitmask;
3321         if (!data->write_done_cb)
3322                 data->write_done_cb = nfs4_write_done_cb;
3323         data->res.server = server;
3324         data->timestamp   = jiffies;
3325
3326         msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE];
3327 }
3328
3329 static int nfs4_commit_done_cb(struct rpc_task *task, struct nfs_write_data *data)
3330 {
3331         struct inode *inode = data->inode;
3332
3333         if (nfs4_async_handle_error(task, NFS_SERVER(inode), NULL) == -EAGAIN) {
3334                 rpc_restart_call_prepare(task);
3335                 return -EAGAIN;
3336         }
3337         nfs_refresh_inode(inode, data->res.fattr);
3338         return 0;
3339 }
3340
3341 static int nfs4_commit_done(struct rpc_task *task, struct nfs_write_data *data)
3342 {
3343         if (!nfs4_sequence_done(task, &data->res.seq_res))
3344                 return -EAGAIN;
3345         return data->write_done_cb(task, data);
3346 }
3347
3348 static void nfs4_proc_commit_setup(struct nfs_write_data *data, struct rpc_message *msg)
3349 {
3350         struct nfs_server *server = NFS_SERVER(data->inode);
3351
3352         if (data->lseg) {
3353                 data->args.bitmask = NULL;
3354                 data->res.fattr = NULL;
3355         } else
3356                 data->args.bitmask = server->cache_consistency_bitmask;
3357         if (!data->write_done_cb)
3358                 data->write_done_cb = nfs4_commit_done_cb;
3359         data->res.server = server;
3360         msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT];
3361 }
3362
3363 struct nfs4_renewdata {
3364         struct nfs_client       *client;
3365         unsigned long           timestamp;
3366 };
3367
3368 /*
3369  * nfs4_proc_async_renew(): This is not one of the nfs_rpc_ops; it is a special
3370  * standalone procedure for queueing an asynchronous RENEW.
3371  */
3372 static void nfs4_renew_release(void *calldata)
3373 {
3374         struct nfs4_renewdata *data = calldata;
3375         struct nfs_client *clp = data->client;
3376
3377         if (atomic_read(&clp->cl_count) > 1)
3378                 nfs4_schedule_state_renewal(clp);
3379         nfs_put_client(clp);
3380         kfree(data);
3381 }
3382
3383 static void nfs4_renew_done(struct rpc_task *task, void *calldata)
3384 {
3385         struct nfs4_renewdata *data = calldata;
3386         struct nfs_client *clp = data->client;
3387         unsigned long timestamp = data->timestamp;
3388
3389         if (task->tk_status < 0) {
3390                 /* Unless we're shutting down, schedule state recovery! */
3391                 if (test_bit(NFS_CS_RENEWD, &clp->cl_res_state) == 0)
3392                         return;
3393                 if (task->tk_status != NFS4ERR_CB_PATH_DOWN) {
3394                         nfs4_schedule_lease_recovery(clp);
3395                         return;
3396                 }
3397                 nfs4_schedule_path_down_recovery(clp);
3398         }
3399         do_renew_lease(clp, timestamp);
3400 }
3401
3402 static const struct rpc_call_ops nfs4_renew_ops = {
3403         .rpc_call_done = nfs4_renew_done,
3404         .rpc_release = nfs4_renew_release,
3405 };
3406
3407 static int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred, unsigned renew_flags)
3408 {
3409         struct rpc_message msg = {
3410                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
3411                 .rpc_argp       = clp,
3412                 .rpc_cred       = cred,
3413         };
3414         struct nfs4_renewdata *data;
3415
3416         if (renew_flags == 0)
3417                 return 0;
3418         if (!atomic_inc_not_zero(&clp->cl_count))
3419                 return -EIO;
3420         data = kmalloc(sizeof(*data), GFP_NOFS);
3421         if (data == NULL)
3422                 return -ENOMEM;
3423         data->client = clp;
3424         data->timestamp = jiffies;
3425         return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_SOFT,
3426                         &nfs4_renew_ops, data);
3427 }
3428
3429 static int nfs4_proc_renew(struct nfs_client *clp, struct rpc_cred *cred)
3430 {
3431         struct rpc_message msg = {
3432                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
3433                 .rpc_argp       = clp,
3434                 .rpc_cred       = cred,
3435         };
3436         unsigned long now = jiffies;
3437         int status;
3438
3439         status = rpc_call_sync(clp->cl_rpcclient, &msg, 0);
3440         if (status < 0)
3441                 return status;
3442         do_renew_lease(clp, now);
3443         return 0;
3444 }
3445
3446 static inline int nfs4_server_supports_acls(struct nfs_server *server)
3447 {
3448         return (server->caps & NFS_CAP_ACLS)
3449                 && (server->acl_bitmask & ACL4_SUPPORT_ALLOW_ACL)
3450                 && (server->acl_bitmask & ACL4_SUPPORT_DENY_ACL);
3451 }
3452
3453 /* Assuming that XATTR_SIZE_MAX is a multiple of PAGE_CACHE_SIZE, and that
3454  * it's OK to put sizeof(void) * (XATTR_SIZE_MAX/PAGE_CACHE_SIZE) bytes on
3455  * the stack.
3456  */
3457 #define NFS4ACL_MAXPAGES (XATTR_SIZE_MAX >> PAGE_CACHE_SHIFT)
3458
3459 static int buf_to_pages_noslab(const void *buf, size_t buflen,
3460                 struct page **pages, unsigned int *pgbase)
3461 {
3462         struct page *newpage, **spages;
3463         int rc = 0;
3464         size_t len;
3465         spages = pages;
3466
3467         do {
3468                 len = min_t(size_t, PAGE_CACHE_SIZE, buflen);
3469                 newpage = alloc_page(GFP_KERNEL);
3470
3471                 if (newpage == NULL)
3472                         goto unwind;
3473                 memcpy(page_address(newpage), buf, len);
3474                 buf += len;
3475                 buflen -= len;
3476                 *pages++ = newpage;
3477                 rc++;
3478         } while (buflen != 0);
3479
3480         return rc;
3481
3482 unwind:
3483         for(; rc > 0; rc--)
3484                 __free_page(spages[rc-1]);
3485         return -ENOMEM;
3486 }
3487
3488 struct nfs4_cached_acl {
3489         int cached;
3490         size_t len;
3491         char data[0];
3492 };
3493
3494 static void nfs4_set_cached_acl(struct inode *inode, struct nfs4_cached_acl *acl)
3495 {
3496         struct nfs_inode *nfsi = NFS_I(inode);
3497
3498         spin_lock(&inode->i_lock);
3499         kfree(nfsi->nfs4_acl);
3500         nfsi->nfs4_acl = acl;
3501         spin_unlock(&inode->i_lock);
3502 }
3503
3504 static void nfs4_zap_acl_attr(struct inode *inode)
3505 {
3506         nfs4_set_cached_acl(inode, NULL);
3507 }
3508
3509 static inline ssize_t nfs4_read_cached_acl(struct inode *inode, char *buf, size_t buflen)
3510 {
3511         struct nfs_inode *nfsi = NFS_I(inode);
3512         struct nfs4_cached_acl *acl;
3513         int ret = -ENOENT;
3514
3515         spin_lock(&inode->i_lock);
3516         acl = nfsi->nfs4_acl;
3517         if (acl == NULL)
3518                 goto out;
3519         if (buf == NULL) /* user is just asking for length */
3520                 goto out_len;
3521         if (acl->cached == 0)
3522                 goto out;
3523         ret = -ERANGE; /* see getxattr(2) man page */
3524         if (acl->len > buflen)
3525                 goto out;
3526         memcpy(buf, acl->data, acl->len);
3527 out_len:
3528         ret = acl->len;
3529 out:
3530         spin_unlock(&inode->i_lock);
3531         return ret;
3532 }
3533
3534 static void nfs4_write_cached_acl(struct inode *inode, struct page **pages, size_t pgbase, size_t acl_len)
3535 {
3536         struct nfs4_cached_acl *acl;
3537
3538         if (pages && acl_len <= PAGE_SIZE) {
3539                 acl = kmalloc(sizeof(*acl) + acl_len, GFP_KERNEL);
3540                 if (acl == NULL)
3541                         goto out;
3542                 acl->cached = 1;
3543                 _copy_from_pages(acl->data, pages, pgbase, acl_len);
3544         } else {
3545                 acl = kmalloc(sizeof(*acl), GFP_KERNEL);
3546                 if (acl == NULL)
3547                         goto out;
3548                 acl->cached = 0;
3549         }
3550         acl->len = acl_len;
3551 out:
3552         nfs4_set_cached_acl(inode, acl);
3553 }
3554
3555 /*
3556  * The getxattr API returns the required buffer length when called with a
3557  * NULL buf. The NFSv4 acl tool then calls getxattr again after allocating
3558  * the required buf.  On a NULL buf, we send a page of data to the server
3559  * guessing that the ACL request can be serviced by a page. If so, we cache
3560  * up to the page of ACL data, and the 2nd call to getxattr is serviced by
3561  * the cache. If not so, we throw away the page, and cache the required
3562  * length. The next getxattr call will then produce another round trip to
3563  * the server, this time with the input buf of the required size.
3564  */
3565 static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
3566 {
3567         struct page *pages[NFS4ACL_MAXPAGES] = {NULL, };
3568         struct nfs_getaclargs args = {
3569                 .fh = NFS_FH(inode),
3570                 .acl_pages = pages,
3571                 .acl_len = buflen,
3572         };
3573         struct nfs_getaclres res = {
3574                 .acl_len = buflen,
3575         };
3576         struct rpc_message msg = {
3577                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETACL],
3578                 .rpc_argp = &args,
3579                 .rpc_resp = &res,
3580         };
3581         int ret = -ENOMEM, npages, i, acl_len = 0;
3582
3583         npages = (buflen + PAGE_SIZE - 1) >> PAGE_SHIFT;
3584         /* As long as we're doing a round trip to the server anyway,
3585          * let's be prepared for a page of acl data. */
3586         if (npages == 0)
3587                 npages = 1;
3588
3589         /* Add an extra page to handle the bitmap returned */
3590         npages++;
3591
3592         for (i = 0; i < npages; i++) {
3593                 pages[i] = alloc_page(GFP_KERNEL);
3594                 if (!pages[i])
3595                         goto out_free;
3596         }
3597
3598         /* for decoding across pages */
3599         res.acl_scratch = alloc_page(GFP_KERNEL);
3600         if (!res.acl_scratch)
3601                 goto out_free;
3602
3603         args.acl_len = npages * PAGE_SIZE;
3604         args.acl_pgbase = 0;
3605
3606         /* Let decode_getfacl know not to fail if the ACL data is larger than
3607          * the page we send as a guess */
3608         if (buf == NULL)
3609                 res.acl_flags |= NFS4_ACL_LEN_REQUEST;
3610
3611         dprintk("%s  buf %p buflen %zu npages %d args.acl_len %zu\n",
3612                 __func__, buf, buflen, npages, args.acl_len);
3613         ret = nfs4_call_sync(NFS_SERVER(inode)->client, NFS_SERVER(inode),
3614                              &msg, &args.seq_args, &res.seq_res, 0);
3615         if (ret)
3616                 goto out_free;
3617
3618         acl_len = res.acl_len - res.acl_data_offset;
3619         if (acl_len > args.acl_len)
3620                 nfs4_write_cached_acl(inode, NULL, 0, acl_len);
3621         else
3622                 nfs4_write_cached_acl(inode, pages, res.acl_data_offset,
3623                                       acl_len);
3624         if (buf) {
3625                 ret = -ERANGE;
3626                 if (acl_len > buflen)
3627                         goto out_free;
3628                 _copy_from_pages(buf, pages, res.acl_data_offset,
3629                                 acl_len);
3630         }
3631         ret = acl_len;
3632 out_free:
3633         for (i = 0; i < npages; i++)
3634                 if (pages[i])
3635                         __free_page(pages[i]);
3636         if (res.acl_scratch)
3637                 __free_page(res.acl_scratch);
3638         return ret;
3639 }
3640
3641 static ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
3642 {
3643         struct nfs4_exception exception = { };
3644         ssize_t ret;
3645         do {
3646                 ret = __nfs4_get_acl_uncached(inode, buf, buflen);
3647                 if (ret >= 0)
3648                         break;
3649                 ret = nfs4_handle_exception(NFS_SERVER(inode), ret, &exception);
3650         } while (exception.retry);
3651         return ret;
3652 }
3653
3654 static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen)
3655 {
3656         struct nfs_server *server = NFS_SERVER(inode);
3657         int ret;
3658
3659         if (!nfs4_server_supports_acls(server))
3660                 return -EOPNOTSUPP;
3661         ret = nfs_revalidate_inode(server, inode);
3662         if (ret < 0)
3663                 return ret;
3664         if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_ACL)
3665                 nfs_zap_acl_cache(inode);
3666         ret = nfs4_read_cached_acl(inode, buf, buflen);
3667         if (ret != -ENOENT)
3668                 /* -ENOENT is returned if there is no ACL or if there is an ACL
3669                  * but no cached acl data, just the acl length */
3670                 return ret;
3671         return nfs4_get_acl_uncached(inode, buf, buflen);
3672 }
3673
3674 static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen)
3675 {
3676         struct nfs_server *server = NFS_SERVER(inode);
3677         struct page *pages[NFS4ACL_MAXPAGES];
3678         struct nfs_setaclargs arg = {
3679                 .fh             = NFS_FH(inode),
3680                 .acl_pages      = pages,
3681                 .acl_len        = buflen,
3682         };
3683         struct nfs_setaclres res;
3684         struct rpc_message msg = {
3685                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_SETACL],
3686                 .rpc_argp       = &arg,
3687                 .rpc_resp       = &res,
3688         };
3689         int ret, i;
3690
3691         if (!nfs4_server_supports_acls(server))
3692                 return -EOPNOTSUPP;
3693         i = buf_to_pages_noslab(buf, buflen, arg.acl_pages, &arg.acl_pgbase);
3694         if (i < 0)
3695                 return i;
3696         nfs_inode_return_delegation(inode);
3697         ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
3698
3699         /*
3700          * Free each page after tx, so the only ref left is
3701          * held by the network stack
3702          */
3703         for (; i > 0; i--)
3704                 put_page(pages[i-1]);
3705
3706         /*
3707          * Acl update can result in inode attribute update.
3708          * so mark the attribute cache invalid.
3709          */
3710         spin_lock(&inode->i_lock);
3711         NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATTR;
3712         spin_unlock(&inode->i_lock);
3713         nfs_access_zap_cache(inode);
3714         nfs_zap_acl_cache(inode);
3715         return ret;
3716 }
3717
3718 static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen)
3719 {
3720         struct nfs4_exception exception = { };
3721         int err;
3722         do {
3723                 err = nfs4_handle_exception(NFS_SERVER(inode),
3724                                 __nfs4_proc_set_acl(inode, buf, buflen),
3725                                 &exception);
3726         } while (exception.retry);
3727         return err;
3728 }
3729
3730 static int
3731 nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, struct nfs4_state *state)
3732 {
3733         struct nfs_client *clp = server->nfs_client;
3734
3735         if (task->tk_status >= 0)
3736                 return 0;
3737         switch(task->tk_status) {
3738                 case -NFS4ERR_DELEG_REVOKED:
3739                 case -NFS4ERR_ADMIN_REVOKED:
3740                 case -NFS4ERR_BAD_STATEID:
3741                         if (state != NULL)
3742                                 nfs_remove_bad_delegation(state->inode);
3743                 case -NFS4ERR_OPENMODE:
3744                         if (state == NULL)
3745                                 break;
3746                         nfs4_schedule_stateid_recovery(server, state);
3747                         goto wait_on_recovery;
3748                 case -NFS4ERR_EXPIRED:
3749                         if (state != NULL)
3750                                 nfs4_schedule_stateid_recovery(server, state);
3751                 case -NFS4ERR_STALE_STATEID:
3752                 case -NFS4ERR_STALE_CLIENTID:
3753                         nfs4_schedule_lease_recovery(clp);
3754                         goto wait_on_recovery;
3755 #if defined(CONFIG_NFS_V4_1)
3756                 case -NFS4ERR_BADSESSION:
3757                 case -NFS4ERR_BADSLOT:
3758                 case -NFS4ERR_BAD_HIGH_SLOT:
3759                 case -NFS4ERR_DEADSESSION:
3760                 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
3761                 case -NFS4ERR_SEQ_FALSE_RETRY:
3762                 case -NFS4ERR_SEQ_MISORDERED:
3763                         dprintk("%s ERROR %d, Reset session\n", __func__,
3764                                 task->tk_status);
3765                         nfs4_schedule_session_recovery(clp->cl_session);
3766                         task->tk_status = 0;
3767                         return -EAGAIN;
3768 #endif /* CONFIG_NFS_V4_1 */
3769                 case -NFS4ERR_DELAY:
3770                         nfs_inc_server_stats(server, NFSIOS_DELAY);
3771                 case -NFS4ERR_GRACE:
3772                 case -EKEYEXPIRED:
3773                         rpc_delay(task, NFS4_POLL_RETRY_MAX);
3774                         task->tk_status = 0;
3775                         return -EAGAIN;
3776                 case -NFS4ERR_RETRY_UNCACHED_REP:
3777                 case -NFS4ERR_OLD_STATEID:
3778                         task->tk_status = 0;
3779                         return -EAGAIN;
3780         }
3781         task->tk_status = nfs4_map_errors(task->tk_status);
3782         return 0;
3783 wait_on_recovery:
3784         rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL);
3785         if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0)
3786                 rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task);
3787         task->tk_status = 0;
3788         return -EAGAIN;
3789 }
3790
3791 int nfs4_proc_setclientid(struct nfs_client *clp, u32 program,
3792                 unsigned short port, struct rpc_cred *cred,
3793                 struct nfs4_setclientid_res *res)
3794 {
3795         nfs4_verifier sc_verifier;
3796         struct nfs4_setclientid setclientid = {
3797                 .sc_verifier = &sc_verifier,
3798                 .sc_prog = program,
3799                 .sc_cb_ident = clp->cl_cb_ident,
3800         };
3801         struct rpc_message msg = {
3802                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID],
3803                 .rpc_argp = &setclientid,
3804                 .rpc_resp = res,
3805                 .rpc_cred = cred,
3806         };
3807         __be32 *p;
3808         int loop = 0;
3809         int status;
3810
3811         p = (__be32*)sc_verifier.data;
3812         *p++ = htonl((u32)clp->cl_boot_time.tv_sec);
3813         *p = htonl((u32)clp->cl_boot_time.tv_nsec);
3814
3815         for(;;) {
3816                 setclientid.sc_name_len = scnprintf(setclientid.sc_name,
3817                                 sizeof(setclientid.sc_name), "%s/%s %s %s %u",
3818                                 clp->cl_ipaddr,
3819                                 rpc_peeraddr2str(clp->cl_rpcclient,
3820                                                         RPC_DISPLAY_ADDR),
3821                                 rpc_peeraddr2str(clp->cl_rpcclient,
3822                                                         RPC_DISPLAY_PROTO),
3823                                 clp->cl_rpcclient->cl_auth->au_ops->au_name,
3824                                 clp->cl_id_uniquifier);
3825                 setclientid.sc_netid_len = scnprintf(setclientid.sc_netid,
3826                                 sizeof(setclientid.sc_netid),
3827                                 rpc_peeraddr2str(clp->cl_rpcclient,
3828                                                         RPC_DISPLAY_NETID));
3829                 setclientid.sc_uaddr_len = scnprintf(setclientid.sc_uaddr,
3830                                 sizeof(setclientid.sc_uaddr), "%s.%u.%u",
3831                                 clp->cl_ipaddr, port >> 8, port & 255);
3832
3833                 status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
3834                 if (status != -NFS4ERR_CLID_INUSE)
3835                         break;
3836                 if (loop != 0) {
3837                         ++clp->cl_id_uniquifier;
3838                         break;
3839                 }
3840                 ++loop;
3841                 ssleep(clp->cl_lease_time / HZ + 1);
3842         }
3843         return status;
3844 }
3845
3846 int nfs4_proc_setclientid_confirm(struct nfs_client *clp,
3847                 struct nfs4_setclientid_res *arg,
3848                 struct rpc_cred *cred)
3849 {
3850         struct nfs_fsinfo fsinfo;
3851         struct rpc_message msg = {
3852                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID_CONFIRM],
3853                 .rpc_argp = arg,
3854                 .rpc_resp = &fsinfo,
3855                 .rpc_cred = cred,
3856         };
3857         unsigned long now;
3858         int status;
3859
3860         now = jiffies;
3861         status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
3862         if (status == 0) {
3863                 spin_lock(&clp->cl_lock);
3864                 clp->cl_lease_time = fsinfo.lease_time * HZ;
3865                 clp->cl_last_renewal = now;
3866                 spin_unlock(&clp->cl_lock);
3867         }
3868         return status;
3869 }
3870
3871 struct nfs4_delegreturndata {
3872         struct nfs4_delegreturnargs args;
3873         struct nfs4_delegreturnres res;
3874         struct nfs_fh fh;
3875         nfs4_stateid stateid;
3876         unsigned long timestamp;
3877         struct nfs_fattr fattr;
3878         int rpc_status;
3879 };
3880
3881 static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
3882 {
3883         struct nfs4_delegreturndata *data = calldata;
3884
3885         if (!nfs4_sequence_done(task, &data->res.seq_res))
3886                 return;
3887
3888         switch (task->tk_status) {
3889         case -NFS4ERR_STALE_STATEID:
3890         case -NFS4ERR_EXPIRED:
3891         case 0:
3892                 renew_lease(data->res.server, data->timestamp);
3893                 break;
3894         default:
3895                 if (nfs4_async_handle_error(task, data->res.server, NULL) ==
3896                                 -EAGAIN) {
3897                         rpc_restart_call_prepare(task);
3898                         return;
3899                 }
3900         }
3901         data->rpc_status = task->tk_status;
3902 }
3903
3904 static void nfs4_delegreturn_release(void *calldata)
3905 {
3906         kfree(calldata);
3907 }
3908
3909 #if defined(CONFIG_NFS_V4_1)
3910 static void nfs4_delegreturn_prepare(struct rpc_task *task, void *data)
3911 {
3912         struct nfs4_delegreturndata *d_data;
3913
3914         d_data = (struct nfs4_delegreturndata *)data;
3915
3916         if (nfs4_setup_sequence(d_data->res.server,
3917                                 &d_data->args.seq_args,
3918                                 &d_data->res.seq_res, 1, task))
3919                 return;
3920         rpc_call_start(task);
3921 }
3922 #endif /* CONFIG_NFS_V4_1 */
3923
3924 static const struct rpc_call_ops nfs4_delegreturn_ops = {
3925 #if defined(CONFIG_NFS_V4_1)
3926         .rpc_call_prepare = nfs4_delegreturn_prepare,
3927 #endif /* CONFIG_NFS_V4_1 */
3928         .rpc_call_done = nfs4_delegreturn_done,
3929         .rpc_release = nfs4_delegreturn_release,
3930 };
3931
3932 static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync)
3933 {
3934         struct nfs4_delegreturndata *data;
3935         struct nfs_server *server = NFS_SERVER(inode);
3936         struct rpc_task *task;
3937         struct rpc_message msg = {
3938                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN],
3939                 .rpc_cred = cred,
3940         };
3941         struct rpc_task_setup task_setup_data = {
3942                 .rpc_client = server->client,
3943                 .rpc_message = &msg,
3944                 .callback_ops = &nfs4_delegreturn_ops,
3945                 .flags = RPC_TASK_ASYNC,
3946         };
3947         int status = 0;
3948
3949         data = kzalloc(sizeof(*data), GFP_NOFS);
3950         if (data == NULL)
3951                 return -ENOMEM;
3952         data->args.fhandle = &data->fh;
3953         data->args.stateid = &data->stateid;
3954         data->args.bitmask = server->attr_bitmask;
3955         nfs_copy_fh(&data->fh, NFS_FH(inode));
3956         memcpy(&data->stateid, stateid, sizeof(data->stateid));
3957         data->res.fattr = &data->fattr;
3958         data->res.server = server;
3959         nfs_fattr_init(data->res.fattr);
3960         data->timestamp = jiffies;
3961         data->rpc_status = 0;
3962
3963         task_setup_data.callback_data = data;
3964         msg.rpc_argp = &data->args;
3965         msg.rpc_resp = &data->res;
3966         task = rpc_run_task(&task_setup_data);
3967         if (IS_ERR(task))
3968                 return PTR_ERR(task);
3969         if (!issync)
3970                 goto out;
3971         status = nfs4_wait_for_completion_rpc_task(task);
3972         if (status != 0)
3973                 goto out;
3974         status = data->rpc_status;
3975         if (status != 0)
3976                 goto out;
3977         nfs_refresh_inode(inode, &data->fattr);
3978 out:
3979         rpc_put_task(task);
3980         return status;
3981 }
3982
3983 int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync)
3984 {
3985         struct nfs_server *server = NFS_SERVER(inode);
3986         struct nfs4_exception exception = { };
3987         int err;
3988         do {
3989                 err = _nfs4_proc_delegreturn(inode, cred, stateid, issync);
3990                 switch (err) {
3991                         case -NFS4ERR_STALE_STATEID:
3992                         case -NFS4ERR_EXPIRED:
3993                         case 0:
3994                                 return 0;
3995                 }
3996                 err = nfs4_handle_exception(server, err, &exception);
3997         } while (exception.retry);
3998         return err;
3999 }
4000
4001 #define NFS4_LOCK_MINTIMEOUT (1 * HZ)
4002 #define NFS4_LOCK_MAXTIMEOUT (30 * HZ)
4003
4004 /* 
4005  * sleep, with exponential backoff, and retry the LOCK operation. 
4006  */
4007 static unsigned long
4008 nfs4_set_lock_task_retry(unsigned long timeout)
4009 {
4010         schedule_timeout_killable(timeout);
4011         timeout <<= 1;
4012         if (timeout > NFS4_LOCK_MAXTIMEOUT)
4013                 return NFS4_LOCK_MAXTIMEOUT;
4014         return timeout;
4015 }
4016
4017 static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
4018 {
4019         struct inode *inode = state->inode;
4020         struct nfs_server *server = NFS_SERVER(inode);
4021         struct nfs_client *clp = server->nfs_client;
4022         struct nfs_lockt_args arg = {
4023                 .fh = NFS_FH(inode),
4024                 .fl = request,
4025         };
4026         struct nfs_lockt_res res = {
4027                 .denied = request,
4028         };
4029         struct rpc_message msg = {
4030                 .rpc_proc       = &nfs4_procedures[NFSPROC4_CLNT_LOCKT],
4031                 .rpc_argp       = &arg,
4032                 .rpc_resp       = &res,
4033                 .rpc_cred       = state->owner->so_cred,
4034         };
4035         struct nfs4_lock_state *lsp;
4036         int status;
4037
4038         arg.lock_owner.clientid = clp->cl_clientid;
4039         status = nfs4_set_lock_state(state, request);
4040         if (status != 0)
4041                 goto out;
4042         lsp = request->fl_u.nfs4_fl.owner;
4043         arg.lock_owner.id = lsp->ls_id.id;
4044         arg.lock_owner.s_dev = server->s_dev;
4045         status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
4046         switch (status) {
4047                 case 0:
4048                         request->fl_type = F_UNLCK;
4049                         break;
4050                 case -NFS4ERR_DENIED:
4051                         status = 0;
4052         }
4053         request->fl_ops->fl_release_private(request);
4054 out:
4055         return status;
4056 }
4057
4058 static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
4059 {
4060         struct nfs4_exception exception = { };
4061         int err;
4062
4063         do {
4064                 err = nfs4_handle_exception(NFS_SERVER(state->inode),
4065                                 _nfs4_proc_getlk(state, cmd, request),
4066                                 &exception);
4067         } while (exception.retry);
4068         return err;
4069 }
4070
4071 static int do_vfs_lock(struct file *file, struct file_lock *fl)
4072 {
4073         int res = 0;
4074         switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) {
4075                 case FL_POSIX:
4076                         res = posix_lock_file_wait(file, fl);
4077                         break;
4078                 case FL_FLOCK:
4079                         res = flock_lock_file_wait(file, fl);
4080                         break;
4081                 default:
4082                         BUG();
4083         }
4084         return res;
4085 }
4086
4087 struct nfs4_unlockdata {
4088         struct nfs_locku_args arg;
4089         struct nfs_locku_res res;
4090         struct nfs4_lock_state *lsp;
4091         struct nfs_open_context *ctx;
4092         struct file_lock fl;
4093         const struct nfs_server *server;
4094         unsigned long timestamp;
4095 };
4096
4097 static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl,
4098                 struct nfs_open_context *ctx,
4099                 struct nfs4_lock_state *lsp,
4100                 struct nfs_seqid *seqid)
4101 {
4102         struct nfs4_unlockdata *p;
4103         struct inode *inode = lsp->ls_state->inode;
4104
4105         p = kzalloc(sizeof(*p), GFP_NOFS);
4106         if (p == NULL)
4107                 return NULL;
4108         p->arg.fh = NFS_FH(inode);
4109         p->arg.fl = &p->fl;
4110         p->arg.seqid = seqid;
4111         p->res.seqid = seqid;
4112         p->arg.stateid = &lsp->ls_stateid;
4113         p->lsp = lsp;
4114         atomic_inc(&lsp->ls_count);
4115         /* Ensure we don't close file until we're done freeing locks! */
4116         p->ctx = get_nfs_open_context(ctx);
4117         memcpy(&p->fl, fl, sizeof(p->fl));
4118         p->server = NFS_SERVER(inode);
4119         return p;
4120 }
4121
4122 static void nfs4_locku_release_calldata(void *data)
4123 {
4124         struct nfs4_unlockdata *calldata = data;
4125         nfs_free_seqid(calldata->arg.seqid);
4126         nfs4_put_lock_state(calldata->lsp);
4127         put_nfs_open_context(calldata->ctx);
4128         kfree(calldata);
4129 }
4130
4131 static void nfs4_locku_done(struct rpc_task *task, void *data)
4132 {
4133         struct nfs4_unlockdata *calldata = data;
4134
4135         if (!nfs4_sequence_done(task, &calldata->res.seq_res))
4136                 return;
4137         switch (task->tk_status) {
4138                 case 0:
4139                         memcpy(calldata->lsp->ls_stateid.data,
4140                                         calldata->res.stateid.data,
4141                                         sizeof(calldata->lsp->ls_stateid.data));
4142                         renew_lease(calldata->server, calldata->timestamp);
4143                         break;
4144                 case -NFS4ERR_BAD_STATEID:
4145                 case -NFS4ERR_OLD_STATEID:
4146                 case -NFS4ERR_STALE_STATEID:
4147                 case -NFS4ERR_EXPIRED:
4148                         break;
4149                 default:
4150                         if (nfs4_async_handle_error(task, calldata->server, NULL) == -EAGAIN)
4151                                 rpc_restart_call_prepare(task);
4152         }
4153         nfs_release_seqid(calldata->arg.seqid);
4154 }
4155
4156 static void nfs4_locku_prepare(struct rpc_task *task, void *data)
4157 {
4158         struct nfs4_unlockdata *calldata = data;
4159
4160         if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
4161                 return;
4162         if ((calldata->lsp->ls_flags & NFS_LOCK_INITIALIZED) == 0) {
4163                 /* Note: exit _without_ running nfs4_locku_done */
4164                 task->tk_action = NULL;
4165                 return;
4166         }
4167         calldata->timestamp = jiffies;
4168         if (nfs4_setup_sequence(calldata->server,
4169                                 &calldata->arg.seq_args,
4170                                 &calldata->res.seq_res,
4171                                 1, task) != 0)
4172                 nfs_release_seqid(calldata->arg.seqid);
4173         else
4174                 rpc_call_start(task);
4175 }
4176
4177 static const struct rpc_call_ops nfs4_locku_ops = {
4178         .rpc_call_prepare = nfs4_locku_prepare,
4179         .rpc_call_done = nfs4_locku_done,
4180         .rpc_release = nfs4_locku_release_calldata,
4181 };
4182
4183 static struct rpc_task *nfs4_do_unlck(struct file_lock *fl,
4184                 struct nfs_open_context *ctx,
4185                 struct nfs4_lock_state *lsp,
4186                 struct nfs_seqid *seqid)
4187 {
4188         struct nfs4_unlockdata *data;
4189         struct rpc_message msg = {
4190                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKU],
4191                 .rpc_cred = ctx->cred,
4192         };
4193         struct rpc_task_setup task_setup_data = {
4194                 .rpc_client = NFS_CLIENT(lsp->ls_state->inode),
4195                 .rpc_message = &msg,
4196                 .callback_ops = &nfs4_locku_ops,
4197                 .workqueue = nfsiod_workqueue,
4198                 .flags = RPC_TASK_ASYNC,
4199         };
4200
4201         /* Ensure this is an unlock - when canceling a lock, the
4202          * canceled lock is passed in, and it won't be an unlock.
4203          */
4204         fl->fl_type = F_UNLCK;
4205
4206         data = nfs4_alloc_unlockdata(fl, ctx, lsp, seqid);
4207         if (data == NULL) {
4208                 nfs_free_seqid(seqid);
4209                 return ERR_PTR(-ENOMEM);
4210         }
4211
4212         msg.rpc_argp = &data->arg;
4213         msg.rpc_resp = &data->res;
4214         task_setup_data.callback_data = data;
4215         return rpc_run_task(&task_setup_data);
4216 }
4217
4218 static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request)
4219 {
4220         struct nfs_inode *nfsi = NFS_I(state->inode);
4221         struct nfs_seqid *seqid;
4222         struct nfs4_lock_state *lsp;
4223         struct rpc_task *task;
4224         int status = 0;
4225         unsigned char fl_flags = request->fl_flags;
4226
4227         status = nfs4_set_lock_state(state, request);
4228         /* Unlock _before_ we do the RPC call */
4229         request->fl_flags |= FL_EXISTS;
4230         down_read(&nfsi->rwsem);
4231         if (do_vfs_lock(request->fl_file, request) == -ENOENT) {
4232                 up_read(&nfsi->rwsem);
4233                 goto out;
4234         }
4235         up_read(&nfsi->rwsem);
4236         if (status != 0)
4237                 goto out;
4238         /* Is this a delegated lock? */
4239         if (test_bit(NFS_DELEGATED_STATE, &state->flags))
4240                 goto out;
4241         lsp = request->fl_u.nfs4_fl.owner;
4242         seqid = nfs_alloc_seqid(&lsp->ls_seqid, GFP_KERNEL);
4243         status = -ENOMEM;
4244         if (seqid == NULL)
4245                 goto out;
4246         task = nfs4_do_unlck(request, nfs_file_open_context(request->fl_file), lsp, seqid);
4247         status = PTR_ERR(task);
4248         if (IS_ERR(task))
4249                 goto out;
4250         status = nfs4_wait_for_completion_rpc_task(task);
4251         rpc_put_task(task);
4252 out:
4253         request->fl_flags = fl_flags;
4254         return status;
4255 }
4256
4257 struct nfs4_lockdata {
4258         struct nfs_lock_args arg;
4259         struct nfs_lock_res res;
4260         struct nfs4_lock_state *lsp;
4261         struct nfs_open_context *ctx;
4262         struct file_lock fl;
4263         unsigned long timestamp;
4264         int rpc_status;
4265         int cancelled;
4266         struct nfs_server *server;
4267 };
4268
4269 static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl,
4270                 struct nfs_open_context *ctx, struct nfs4_lock_state *lsp,
4271                 gfp_t gfp_mask)
4272 {
4273         struct nfs4_lockdata *p;
4274         struct inode *inode = lsp->ls_state->inode;
4275         struct nfs_server *server = NFS_SERVER(inode);
4276
4277         p = kzalloc(sizeof(*p), gfp_mask);
4278         if (p == NULL)
4279                 return NULL;
4280
4281         p->arg.fh = NFS_FH(inode);
4282         p->arg.fl = &p->fl;
4283         p->arg.open_seqid = nfs_alloc_seqid(&lsp->ls_state->owner->so_seqid, gfp_mask);
4284         if (p->arg.open_seqid == NULL)
4285                 goto out_free;
4286         p->arg.lock_seqid = nfs_alloc_seqid(&lsp->ls_seqid, gfp_mask);
4287         if (p->arg.lock_seqid == NULL)
4288                 goto out_free_seqid;
4289         p->arg.lock_stateid = &lsp->ls_stateid;
4290         p->arg.lock_owner.clientid = server->nfs_client->cl_clientid;
4291         p->arg.lock_owner.id = lsp->ls_id.id;
4292         p->arg.lock_owner.s_dev = server->s_dev;
4293         p->res.lock_seqid = p->arg.lock_seqid;
4294         p->lsp = lsp;
4295         p->server = server;
4296         atomic_inc(&lsp->ls_count);
4297         p->ctx = get_nfs_open_context(ctx);
4298         memcpy(&p->fl, fl, sizeof(p->fl));
4299         return p;
4300 out_free_seqid:
4301         nfs_free_seqid(p->arg.open_seqid);
4302 out_free:
4303         kfree(p);
4304         return NULL;
4305 }
4306
4307 static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
4308 {
4309         struct nfs4_lockdata *data = calldata;
4310         struct nfs4_state *state = data->lsp->ls_state;
4311
4312         dprintk("%s: begin!\n", __func__);
4313         if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0)
4314                 return;
4315         /* Do we need to do an open_to_lock_owner? */
4316         if (!(data->arg.lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)) {
4317                 if (nfs_wait_on_sequence(data->arg.open_seqid, task) != 0)
4318                         goto out_release_lock_seqid;
4319                 data->arg.open_stateid = &state->stateid;
4320                 data->arg.new_lock_owner = 1;
4321                 data->res.open_seqid = data->arg.open_seqid;
4322         } else
4323                 data->arg.new_lock_owner = 0;
4324         data->timestamp = jiffies;
4325         if (nfs4_setup_sequence(data->server,
4326                                 &data->arg.seq_args,
4327                                 &data->res.seq_res,
4328                                 1, task) == 0) {
4329                 rpc_call_start(task);
4330                 return;
4331         }
4332         nfs_release_seqid(data->arg.open_seqid);
4333 out_release_lock_seqid:
4334         nfs_release_seqid(data->arg.lock_seqid);
4335         dprintk("%s: done!, ret = %d\n", __func__, task->tk_status);
4336 }
4337
4338 static void nfs4_recover_lock_prepare(struct rpc_task *task, void *calldata)
4339 {
4340         rpc_task_set_priority(task, RPC_PRIORITY_PRIVILEGED);
4341         nfs4_lock_prepare(task, calldata);
4342 }
4343
4344 static void nfs4_lock_done(struct rpc_task *task, void *calldata)
4345 {
4346         struct nfs4_lockdata *data = calldata;
4347
4348         dprintk("%s: begin!\n", __func__);
4349
4350         if (!nfs4_sequence_done(task, &data->res.seq_res))
4351                 return;
4352
4353         data->rpc_status = task->tk_status;
4354         if (data->arg.new_lock_owner != 0) {
4355                 if (data->rpc_status == 0)
4356                         nfs_confirm_seqid(&data->lsp->ls_seqid, 0);
4357                 else
4358                         goto out;
4359         }
4360         if (data->rpc_status == 0) {
4361                 memcpy(data->lsp->ls_stateid.data, data->res.stateid.data,
4362                                         sizeof(data->lsp->ls_stateid.data));
4363                 data->lsp->ls_flags |= NFS_LOCK_INITIALIZED;
4364                 renew_lease(NFS_SERVER(data->ctx->dentry->d_inode), data->timestamp);
4365         }
4366 out:
4367         dprintk("%s: done, ret = %d!\n", __func__, data->rpc_status);
4368 }
4369
4370 static void nfs4_lock_release(void *calldata)
4371 {
4372         struct nfs4_lockdata *data = calldata;
4373
4374         dprintk("%s: begin!\n", __func__);
4375         nfs_free_seqid(data->arg.open_seqid);
4376         if (data->cancelled != 0) {
4377                 struct rpc_task *task;
4378                 task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp,
4379                                 data->arg.lock_seqid);
4380                 if (!IS_ERR(task))
4381                         rpc_put_task_async(task);
4382                 dprintk("%s: cancelling lock!\n", __func__);
4383         } else
4384                 nfs_free_seqid(data->arg.lock_seqid);
4385         nfs4_put_lock_state(data->lsp);
4386         put_nfs_open_context(data->ctx);
4387         kfree(data);
4388         dprintk("%s: done!\n", __func__);
4389 }
4390
4391 static const struct rpc_call_ops nfs4_lock_ops = {
4392         .rpc_call_prepare = nfs4_lock_prepare,
4393         .rpc_call_done = nfs4_lock_done,
4394         .rpc_release = nfs4_lock_release,
4395 };
4396
4397 static const struct rpc_call_ops nfs4_recover_lock_ops = {
4398         .rpc_call_prepare = nfs4_recover_lock_prepare,
4399         .rpc_call_done = nfs4_lock_done,
4400         .rpc_release = nfs4_lock_release,
4401 };
4402
4403 static void nfs4_handle_setlk_error(struct nfs_server *server, struct nfs4_lock_state *lsp, int new_lock_owner, int error)
4404 {
4405         switch (error) {
4406         case -NFS4ERR_ADMIN_REVOKED:
4407         case -NFS4ERR_BAD_STATEID:
4408                 lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED;
4409                 if (new_lock_owner != 0 ||
4410                    (lsp->ls_flags & NFS_LOCK_INITIALIZED) != 0)
4411                         nfs4_schedule_stateid_recovery(server, lsp->ls_state);
4412                 break;
4413         case -NFS4ERR_STALE_STATEID:
4414                 lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED;
4415         case -NFS4ERR_EXPIRED:
4416                 nfs4_schedule_lease_recovery(server->nfs_client);
4417         };
4418 }
4419
4420 static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int recovery_type)
4421 {
4422         struct nfs4_lockdata *data;
4423         struct rpc_task *task;
4424         struct rpc_message msg = {
4425                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK],
4426                 .rpc_cred = state->owner->so_cred,
4427         };
4428         struct rpc_task_setup task_setup_data = {
4429                 .rpc_client = NFS_CLIENT(state->inode),
4430                 .rpc_message = &msg,
4431                 .callback_ops = &nfs4_lock_ops,
4432                 .workqueue = nfsiod_workqueue,
4433                 .flags = RPC_TASK_ASYNC,
4434         };
4435         int ret;
4436
4437         dprintk("%s: begin!\n", __func__);
4438         data = nfs4_alloc_lockdata(fl, nfs_file_open_context(fl->fl_file),
4439                         fl->fl_u.nfs4_fl.owner,
4440                         recovery_type == NFS_LOCK_NEW ? GFP_KERNEL : GFP_NOFS);
4441         if (data == NULL)
4442                 return -ENOMEM;
4443         if (IS_SETLKW(cmd))
4444                 data->arg.block = 1;
4445         if (recovery_type > NFS_LOCK_NEW) {
4446                 if (recovery_type == NFS_LOCK_RECLAIM)
4447                         data->arg.reclaim = NFS_LOCK_RECLAIM;
4448                 task_setup_data.callback_ops = &nfs4_recover_lock_ops;
4449         }
4450         msg.rpc_argp = &data->arg;
4451         msg.rpc_resp = &data->res;
4452         task_setup_data.callback_data = data;
4453         task = rpc_run_task(&task_setup_data);
4454         if (IS_ERR(task))
4455                 return PTR_ERR(task);
4456         ret = nfs4_wait_for_completion_rpc_task(task);
4457         if (ret == 0) {
4458                 ret = data->rpc_status;
4459                 if (ret)
4460                         nfs4_handle_setlk_error(data->server, data->lsp,
4461                                         data->arg.new_lock_owner, ret);
4462         } else
4463                 data->cancelled = 1;
4464         rpc_put_task(task);
4465         dprintk("%s: done, ret = %d!\n", __func__, ret);
4466         return ret;
4467 }
4468
4469 static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request)
4470 {
4471         struct nfs_server *server = NFS_SERVER(state->inode);
4472         struct nfs4_exception exception = {
4473                 .inode = state->inode,
4474         };
4475         int err;
4476
4477         do {
4478                 /* Cache the lock if possible... */
4479                 if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
4480                         return 0;
4481                 err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_RECLAIM);
4482                 if (err != -NFS4ERR_DELAY)
4483                         break;
4484                 nfs4_handle_exception(server, err, &exception);
4485         } while (exception.retry);
4486         return err;
4487 }
4488
4489 static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request)
4490 {
4491         struct nfs_server *server = NFS_SERVER(state->inode);
4492         struct nfs4_exception exception = {
4493                 .inode = state->inode,
4494         };
4495         int err;
4496
4497         err = nfs4_set_lock_state(state, request);
4498         if (err != 0)
4499                 return err;
4500         do {
4501                 if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
4502                         return 0;
4503                 err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_EXPIRED);
4504                 switch (err) {
4505                 default:
4506                         goto out;
4507                 case -NFS4ERR_GRACE:
4508                 case -NFS4ERR_DELAY:
4509                         nfs4_handle_exception(server, err, &exception);
4510                         err = 0;
4511                 }
4512         } while (exception.retry);
4513 out:
4514         return err;
4515 }
4516
4517 #if defined(CONFIG_NFS_V4_1)
4518 static int nfs41_lock_expired(struct nfs4_state *state, struct file_lock *request)
4519 {
4520         int status;
4521         struct nfs_server *server = NFS_SERVER(state->inode);
4522
4523         status = nfs41_test_stateid(server, state);
4524         if (status == NFS_OK)
4525                 return 0;
4526         nfs41_free_stateid(server, state);
4527         return nfs4_lock_expired(state, request);
4528 }
4529 #endif
4530
4531 static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
4532 {
4533         struct nfs_inode *nfsi = NFS_I(state->inode);
4534         unsigned char fl_flags = request->fl_flags;
4535         int status = -ENOLCK;
4536
4537         if ((fl_flags & FL_POSIX) &&
4538                         !test_bit(NFS_STATE_POSIX_LOCKS, &state->flags))
4539                 goto out;
4540         /* Is this a delegated open? */
4541         status = nfs4_set_lock_state(state, request);
4542         if (status != 0)
4543                 goto out;
4544         request->fl_flags |= FL_ACCESS;
4545         status = do_vfs_lock(request->fl_file, request);
4546         if (status < 0)
4547                 goto out;
4548         down_read(&nfsi->rwsem);
4549         if (test_bit(NFS_DELEGATED_STATE, &state->flags)) {
4550                 /* Yes: cache locks! */
4551                 /* ...but avoid races with delegation recall... */
4552                 request->fl_flags = fl_flags & ~FL_SLEEP;
4553                 status = do_vfs_lock(request->fl_file, request);
4554                 goto out_unlock;
4555         }
4556         status = _nfs4_do_setlk(state, cmd, request, NFS_LOCK_NEW);
4557         if (status != 0)
4558                 goto out_unlock;
4559         /* Note: we always want to sleep here! */
4560         request->fl_flags = fl_flags | FL_SLEEP;
4561         if (do_vfs_lock(request->fl_file, request) < 0)
4562                 printk(KERN_WARNING "%s: VFS is out of sync with lock manager!\n", __func__);
4563 out_unlock:
4564         up_read(&nfsi->rwsem);
4565 out:
4566         request->fl_flags = fl_flags;
4567         return status;
4568 }
4569
4570 static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
4571 {
4572         struct nfs4_exception exception = {
4573                 .state = state,
4574                 .inode = state->inode,
4575         };
4576         int err;
4577
4578         do {
4579                 err = _nfs4_proc_setlk(state, cmd, request);
4580                 if (err == -NFS4ERR_DENIED)
4581                         err = -EAGAIN;
4582                 err = nfs4_handle_exception(NFS_SERVER(state->inode),
4583                                 err, &exception);
4584         } while (exception.retry);
4585         return err;
4586 }
4587
4588 static int
4589 nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request)
4590 {
4591         struct nfs_open_context *ctx;
4592         struct nfs4_state *state;
4593         unsigned long timeout = NFS4_LOCK_MINTIMEOUT;
4594         int status;
4595
4596         /* verify open state */
4597         ctx = nfs_file_open_context(filp);
4598         state = ctx->state;
4599
4600         if (request->fl_start < 0 || request->fl_end < 0)
4601                 return -EINVAL;
4602
4603         if (IS_GETLK(cmd)) {
4604                 if (state != NULL)
4605                         return nfs4_proc_getlk(state, F_GETLK, request);
4606                 return 0;
4607         }
4608
4609         if (!(IS_SETLK(cmd) || IS_SETLKW(cmd)))
4610                 return -EINVAL;
4611
4612         if (request->fl_type == F_UNLCK) {
4613                 if (state != NULL)
4614                         return nfs4_proc_unlck(state, cmd, request);
4615                 return 0;
4616         }
4617
4618         if (state == NULL)
4619                 return -ENOLCK;
4620         /*
4621          * Don't rely on the VFS having checked the file open mode,
4622          * since it won't do this for flock() locks.
4623          */
4624         switch (request->fl_type & (F_RDLCK|F_WRLCK|F_UNLCK)) {
4625         case F_RDLCK:
4626                 if (!(filp->f_mode & FMODE_READ))
4627                         return -EBADF;
4628                 break;
4629         case F_WRLCK:
4630                 if (!(filp->f_mode & FMODE_WRITE))
4631                         return -EBADF;
4632         }
4633
4634         do {
4635                 status = nfs4_proc_setlk(state, cmd, request);
4636                 if ((status != -EAGAIN) || IS_SETLK(cmd))
4637                         break;
4638                 timeout = nfs4_set_lock_task_retry(timeout);
4639                 status = -ERESTARTSYS;
4640                 if (signalled())
4641                         break;
4642         } while(status < 0);
4643         return status;
4644 }
4645
4646 int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl)
4647 {
4648         struct nfs_server *server = NFS_SERVER(state->inode);
4649         struct nfs4_exception exception = { };
4650         int err;
4651
4652         err = nfs4_set_lock_state(state, fl);
4653         if (err != 0)
4654                 goto out;
4655         do {
4656                 err = _nfs4_do_setlk(state, F_SETLK, fl, NFS_LOCK_NEW);
4657                 switch (err) {
4658                         default:
4659                                 printk(KERN_ERR "%s: unhandled error %d.\n",
4660                                                 __func__, err);
4661                         case 0:
4662                         case -ESTALE:
4663                                 goto out;
4664                         case -NFS4ERR_EXPIRED:
4665                                 nfs4_schedule_stateid_recovery(server, state);
4666                         case -NFS4ERR_STALE_CLIENTID:
4667                         case -NFS4ERR_STALE_STATEID:
4668                                 nfs4_schedule_lease_recovery(server->nfs_client);
4669                                 goto out;
4670                         case -NFS4ERR_BADSESSION:
4671                         case -NFS4ERR_BADSLOT:
4672                         case -NFS4ERR_BAD_HIGH_SLOT:
4673                         case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
4674                         case -NFS4ERR_DEADSESSION:
4675                                 nfs4_schedule_session_recovery(server->nfs_client->cl_session);
4676                                 goto out;
4677                         case -ERESTARTSYS:
4678                                 /*
4679                                  * The show must go on: exit, but mark the
4680                                  * stateid as needing recovery.
4681                                  */
4682                         case -NFS4ERR_DELEG_REVOKED:
4683                         case -NFS4ERR_ADMIN_REVOKED:
4684                         case -NFS4ERR_BAD_STATEID:
4685                         case -NFS4ERR_OPENMODE:
4686                                 nfs4_schedule_stateid_recovery(server, state);
4687                                 err = 0;
4688                                 goto out;
4689                         case -EKEYEXPIRED:
4690                                 /*
4691                                  * User RPCSEC_GSS context has expired.
4692                                  * We cannot recover this stateid now, so
4693                                  * skip it and allow recovery thread to
4694                                  * proceed.
4695                                  */
4696                                 err = 0;
4697                                 goto out;
4698                         case -ENOMEM:
4699                         case -NFS4ERR_DENIED:
4700                                 /* kill_proc(fl->fl_pid, SIGLOST, 1); */
4701                                 err = 0;
4702                                 goto out;
4703                         case -NFS4ERR_DELAY:
4704                                 break;
4705                 }
4706                 err = nfs4_handle_exception(server, err, &exception);
4707         } while (exception.retry);
4708 out:
4709         return err;
4710 }
4711
4712 static void nfs4_release_lockowner_release(void *calldata)
4713 {
4714         kfree(calldata);
4715 }
4716
4717 const struct rpc_call_ops nfs4_release_lockowner_ops = {
4718         .rpc_release = nfs4_release_lockowner_release,
4719 };
4720
4721 void nfs4_release_lockowner(const struct nfs4_lock_state *lsp)
4722 {
4723         struct nfs_server *server = lsp->ls_state->owner->so_server;
4724         struct nfs_release_lockowner_args *args;
4725         struct rpc_message msg = {
4726                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RELEASE_LOCKOWNER],
4727         };
4728
4729         if (server->nfs_client->cl_mvops->minor_version != 0)
4730                 return;
4731         args = kmalloc(sizeof(*args), GFP_NOFS);
4732         if (!args)
4733                 return;
4734         args->lock_owner.clientid = server->nfs_client->cl_clientid;
4735         args->lock_owner.id = lsp->ls_id.id;
4736         args->lock_owner.s_dev = server->s_dev;
4737         msg.rpc_argp = args;
4738         rpc_call_async(server->client, &msg, 0, &nfs4_release_lockowner_ops, args);
4739 }
4740
4741 #define XATTR_NAME_NFSV4_ACL "system.nfs4_acl"
4742
4743 static int nfs4_xattr_set_nfs4_acl(struct dentry *dentry, const char *key,
4744                                    const void *buf, size_t buflen,
4745                                    int flags, int type)
4746 {
4747         if (strcmp(key, "") != 0)
4748                 return -EINVAL;
4749
4750         return nfs4_proc_set_acl(dentry->d_inode, buf, buflen);
4751 }
4752
4753 static int nfs4_xattr_get_nfs4_acl(struct dentry *dentry, const char *key,
4754                                    void *buf, size_t buflen, int type)
4755 {
4756         if (strcmp(key, "") != 0)
4757                 return -EINVAL;
4758
4759         return nfs4_proc_get_acl(dentry->d_inode, buf, buflen);
4760 }
4761
4762 static size_t nfs4_xattr_list_nfs4_acl(struct dentry *dentry, char *list,
4763                                        size_t list_len, const char *name,
4764                                        size_t name_len, int type)
4765 {
4766         size_t len = sizeof(XATTR_NAME_NFSV4_ACL);
4767
4768         if (!nfs4_server_supports_acls(NFS_SERVER(dentry->d_inode)))
4769                 return 0;
4770
4771         if (list && len <= list_len)
4772                 memcpy(list, XATTR_NAME_NFSV4_ACL, len);
4773         return len;
4774 }
4775
4776 /*
4777  * nfs_fhget will use either the mounted_on_fileid or the fileid
4778  */
4779 static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr)
4780 {
4781         if (!(((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) ||
4782                (fattr->valid & NFS_ATTR_FATTR_FILEID)) &&
4783               (fattr->valid & NFS_ATTR_FATTR_FSID) &&
4784               (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL)))
4785                 return;
4786
4787         fattr->valid |= NFS_ATTR_FATTR_TYPE | NFS_ATTR_FATTR_MODE |
4788                 NFS_ATTR_FATTR_NLINK;
4789         fattr->mode = S_IFDIR | S_IRUGO | S_IXUGO;
4790         fattr->nlink = 2;
4791 }
4792
4793 int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,
4794                 struct nfs4_fs_locations *fs_locations, struct page *page)
4795 {
4796         struct nfs_server *server = NFS_SERVER(dir);
4797         u32 bitmask[2] = {
4798                 [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS,
4799         };
4800         struct nfs4_fs_locations_arg args = {
4801                 .dir_fh = NFS_FH(dir),
4802                 .name = name,
4803                 .page = page,
4804                 .bitmask = bitmask,
4805         };
4806         struct nfs4_fs_locations_res res = {
4807                 .fs_locations = fs_locations,
4808         };
4809         struct rpc_message msg = {
4810                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS],
4811                 .rpc_argp = &args,
4812                 .rpc_resp = &res,
4813         };
4814         int status;
4815
4816         dprintk("%s: start\n", __func__);
4817
4818         /* Ask for the fileid of the absent filesystem if mounted_on_fileid
4819          * is not supported */
4820         if (NFS_SERVER(dir)->attr_bitmask[1] & FATTR4_WORD1_MOUNTED_ON_FILEID)
4821                 bitmask[1] |= FATTR4_WORD1_MOUNTED_ON_FILEID;
4822         else
4823                 bitmask[0] |= FATTR4_WORD0_FILEID;
4824
4825         nfs_fattr_init(&fs_locations->fattr);
4826         fs_locations->server = server;
4827         fs_locations->nlocations = 0;
4828         status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
4829         dprintk("%s: returned status = %d\n", __func__, status);
4830         return status;
4831 }
4832
4833 static int _nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct nfs4_secinfo_flavors *flavors)
4834 {
4835         int status;
4836         struct nfs4_secinfo_arg args = {
4837                 .dir_fh = NFS_FH(dir),
4838                 .name   = name,
4839         };
4840         struct nfs4_secinfo_res res = {
4841                 .flavors     = flavors,
4842         };
4843         struct rpc_message msg = {
4844                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SECINFO],
4845                 .rpc_argp = &args,
4846                 .rpc_resp = &res,
4847         };
4848
4849         dprintk("NFS call  secinfo %s\n", name->name);
4850         status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0);
4851         dprintk("NFS reply  secinfo: %d\n", status);
4852         return status;
4853 }
4854
4855 int nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct nfs4_secinfo_flavors *flavors)
4856 {
4857         struct nfs4_exception exception = { };
4858         int err;
4859         do {
4860                 err = nfs4_handle_exception(NFS_SERVER(dir),
4861                                 _nfs4_proc_secinfo(dir, name, flavors),
4862                                 &exception);
4863         } while (exception.retry);
4864         return err;
4865 }
4866
4867 #ifdef CONFIG_NFS_V4_1
4868 /*
4869  * Check the exchange flags returned by the server for invalid flags, having
4870  * both PNFS and NON_PNFS flags set, and not having one of NON_PNFS, PNFS, or
4871  * DS flags set.
4872  */
4873 static int nfs4_check_cl_exchange_flags(u32 flags)
4874 {
4875         if (flags & ~EXCHGID4_FLAG_MASK_R)
4876                 goto out_inval;
4877         if ((flags & EXCHGID4_FLAG_USE_PNFS_MDS) &&
4878             (flags & EXCHGID4_FLAG_USE_NON_PNFS))
4879                 goto out_inval;
4880         if (!(flags & (EXCHGID4_FLAG_MASK_PNFS)))
4881                 goto out_inval;
4882         return NFS_OK;
4883 out_inval:
4884         return -NFS4ERR_INVAL;
4885 }
4886
4887 static bool
4888 nfs41_same_server_scope(struct server_scope *a, struct server_scope *b)
4889 {
4890         if (a->server_scope_sz == b->server_scope_sz &&
4891             memcmp(a->server_scope, b->server_scope, a->server_scope_sz) == 0)
4892                 return true;
4893
4894         return false;
4895 }
4896
4897 /*
4898  * nfs4_proc_exchange_id()
4899  *
4900  * Since the clientid has expired, all compounds using sessions
4901  * associated with the stale clientid will be returning
4902  * NFS4ERR_BADSESSION in the sequence operation, and will therefore
4903  * be in some phase of session reset.
4904  */
4905 int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
4906 {
4907         nfs4_verifier verifier;
4908         struct nfs41_exchange_id_args args = {
4909                 .client = clp,
4910                 .flags = EXCHGID4_FLAG_SUPP_MOVED_REFER,
4911         };
4912         struct nfs41_exchange_id_res res = {
4913                 .client = clp,
4914         };
4915         int status;
4916         struct rpc_message msg = {
4917                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_EXCHANGE_ID],
4918                 .rpc_argp = &args,
4919                 .rpc_resp = &res,
4920                 .rpc_cred = cred,
4921         };
4922         __be32 *p;
4923
4924         dprintk("--> %s\n", __func__);
4925         BUG_ON(clp == NULL);
4926
4927         p = (u32 *)verifier.data;
4928         *p++ = htonl((u32)clp->cl_boot_time.tv_sec);
4929         *p = htonl((u32)clp->cl_boot_time.tv_nsec);
4930         args.verifier = &verifier;
4931
4932         args.id_len = scnprintf(args.id, sizeof(args.id),
4933                                 "%s/%s.%s/%u",
4934                                 clp->cl_ipaddr,
4935                                 init_utsname()->nodename,
4936                                 init_utsname()->domainname,
4937                                 clp->cl_rpcclient->cl_auth->au_flavor);
4938
4939         res.server_scope = kzalloc(sizeof(struct server_scope), GFP_KERNEL);
4940         if (unlikely(!res.server_scope)) {
4941                 status = -ENOMEM;
4942                 goto out;
4943         }
4944
4945         status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
4946         if (!status)
4947                 status = nfs4_check_cl_exchange_flags(clp->cl_exchange_flags);
4948
4949         if (!status) {
4950                 if (clp->server_scope &&
4951                     !nfs41_same_server_scope(clp->server_scope,
4952                                              res.server_scope)) {
4953                         dprintk("%s: server_scope mismatch detected\n",
4954                                 __func__);
4955                         set_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH, &clp->cl_state);
4956                         kfree(clp->server_scope);
4957                         clp->server_scope = NULL;
4958                 }
4959
4960                 if (!clp->server_scope) {
4961                         clp->server_scope = res.server_scope;
4962                         goto out;
4963                 }
4964         }
4965         kfree(res.server_scope);
4966 out:
4967         dprintk("<-- %s status= %d\n", __func__, status);
4968         return status;
4969 }
4970
4971 struct nfs4_get_lease_time_data {
4972         struct nfs4_get_lease_time_args *args;
4973         struct nfs4_get_lease_time_res *res;
4974         struct nfs_client *clp;
4975 };
4976
4977 static void nfs4_get_lease_time_prepare(struct rpc_task *task,
4978                                         void *calldata)
4979 {
4980         int ret;
4981         struct nfs4_get_lease_time_data *data =
4982                         (struct nfs4_get_lease_time_data *)calldata;
4983
4984         dprintk("--> %s\n", __func__);
4985         rpc_task_set_priority(task, RPC_PRIORITY_PRIVILEGED);
4986         /* just setup sequence, do not trigger session recovery
4987            since we're invoked within one */
4988         ret = nfs41_setup_sequence(data->clp->cl_session,
4989                                    &data->args->la_seq_args,
4990                                    &data->res->lr_seq_res, 0, task);
4991
4992         BUG_ON(ret == -EAGAIN);
4993         rpc_call_start(task);
4994         dprintk("<-- %s\n", __func__);
4995 }
4996
4997 /*
4998  * Called from nfs4_state_manager thread for session setup, so don't recover
4999  * from sequence operation or clientid errors.
5000  */
5001 static void nfs4_get_lease_time_done(struct rpc_task *task, void *calldata)
5002 {
5003         struct nfs4_get_lease_time_data *data =
5004                         (struct nfs4_get_lease_time_data *)calldata;
5005
5006         dprintk("--> %s\n", __func__);
5007         if (!nfs41_sequence_done(task, &data->res->lr_seq_res))
5008                 return;
5009         switch (task->tk_status) {
5010         case -NFS4ERR_DELAY:
5011         case -NFS4ERR_GRACE:
5012                 dprintk("%s Retry: tk_status %d\n", __func__, task->tk_status);
5013                 rpc_delay(task, NFS4_POLL_RETRY_MIN);
5014                 task->tk_status = 0;
5015                 /* fall through */
5016         case -NFS4ERR_RETRY_UNCACHED_REP:
5017                 rpc_restart_call_prepare(task);
5018                 return;
5019         }
5020         dprintk("<-- %s\n", __func__);
5021 }
5022
5023 struct rpc_call_ops nfs4_get_lease_time_ops = {
5024         .rpc_call_prepare = nfs4_get_lease_time_prepare,
5025         .rpc_call_done = nfs4_get_lease_time_done,
5026 };
5027
5028 int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo)
5029 {
5030         struct rpc_task *task;
5031         struct nfs4_get_lease_time_args args;
5032         struct nfs4_get_lease_time_res res = {
5033                 .lr_fsinfo = fsinfo,
5034         };
5035         struct nfs4_get_lease_time_data data = {
5036                 .args = &args,
5037                 .res = &res,
5038                 .clp = clp,
5039         };
5040         struct rpc_message msg = {
5041                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GET_LEASE_TIME],
5042                 .rpc_argp = &args,
5043                 .rpc_resp = &res,
5044         };
5045         struct rpc_task_setup task_setup = {
5046                 .rpc_client = clp->cl_rpcclient,
5047                 .rpc_message = &msg,
5048                 .callback_ops = &nfs4_get_lease_time_ops,
5049                 .callback_data = &data,
5050                 .flags = RPC_TASK_TIMEOUT,
5051         };
5052         int status;
5053
5054         dprintk("--> %s\n", __func__);
5055         task = rpc_run_task(&task_setup);
5056
5057         if (IS_ERR(task))
5058                 status = PTR_ERR(task);
5059         else {
5060                 status = task->tk_status;
5061                 rpc_put_task(task);
5062         }
5063         dprintk("<-- %s return %d\n", __func__, status);
5064
5065         return status;
5066 }
5067
5068 /*
5069  * Reset a slot table
5070  */
5071 static int nfs4_reset_slot_table(struct nfs4_slot_table *tbl, u32 max_reqs,
5072                                  int ivalue)
5073 {
5074         struct nfs4_slot *new = NULL;
5075         int i;
5076         int ret = 0;
5077
5078         dprintk("--> %s: max_reqs=%u, tbl->max_slots %d\n", __func__,
5079                 max_reqs, tbl->max_slots);
5080
5081         /* Does the newly negotiated max_reqs match the existing slot table? */
5082         if (max_reqs != tbl->max_slots) {
5083                 ret = -ENOMEM;
5084                 new = kmalloc(max_reqs * sizeof(struct nfs4_slot),
5085                               GFP_NOFS);
5086                 if (!new)
5087                         goto out;
5088                 ret = 0;
5089                 kfree(tbl->slots);
5090         }
5091         spin_lock(&tbl->slot_tbl_lock);
5092         if (new) {
5093                 tbl->slots = new;
5094                 tbl->max_slots = max_reqs;
5095         }
5096         for (i = 0; i < tbl->max_slots; ++i)
5097                 tbl->slots[i].seq_nr = ivalue;
5098         spin_unlock(&tbl->slot_tbl_lock);
5099         dprintk("%s: tbl=%p slots=%p max_slots=%d\n", __func__,
5100                 tbl, tbl->slots, tbl->max_slots);
5101 out:
5102         dprintk("<-- %s: return %d\n", __func__, ret);
5103         return ret;
5104 }
5105
5106 /*
5107  * Reset the forechannel and backchannel slot tables
5108  */
5109 static int nfs4_reset_slot_tables(struct nfs4_session *session)
5110 {
5111         int status;
5112
5113         status = nfs4_reset_slot_table(&session->fc_slot_table,
5114                         session->fc_attrs.max_reqs, 1);
5115         if (status)
5116                 return status;
5117
5118         status = nfs4_reset_slot_table(&session->bc_slot_table,
5119                         session->bc_attrs.max_reqs, 0);
5120         return status;
5121 }
5122
5123 /* Destroy the slot table */
5124 static void nfs4_destroy_slot_tables(struct nfs4_session *session)
5125 {
5126         if (session->fc_slot_table.slots != NULL) {
5127                 kfree(session->fc_slot_table.slots);
5128                 session->fc_slot_table.slots = NULL;
5129         }
5130         if (session->bc_slot_table.slots != NULL) {
5131                 kfree(session->bc_slot_table.slots);
5132                 session->bc_slot_table.slots = NULL;
5133         }
5134         return;
5135 }
5136
5137 /*
5138  * Initialize slot table
5139  */
5140 static int nfs4_init_slot_table(struct nfs4_slot_table *tbl,
5141                 int max_slots, int ivalue)
5142 {
5143         struct nfs4_slot *slot;
5144         int ret = -ENOMEM;
5145
5146         BUG_ON(max_slots > NFS4_MAX_SLOT_TABLE);
5147
5148         dprintk("--> %s: max_reqs=%u\n", __func__, max_slots);
5149
5150         slot = kcalloc(max_slots, sizeof(struct nfs4_slot), GFP_NOFS);
5151         if (!slot)
5152                 goto out;
5153         ret = 0;
5154
5155         spin_lock(&tbl->slot_tbl_lock);
5156         tbl->max_slots = max_slots;
5157         tbl->slots = slot;
5158         tbl->highest_used_slotid = -1;  /* no slot is currently used */
5159         spin_unlock(&tbl->slot_tbl_lock);
5160         dprintk("%s: tbl=%p slots=%p max_slots=%d\n", __func__,
5161                 tbl, tbl->slots, tbl->max_slots);
5162 out:
5163         dprintk("<-- %s: return %d\n", __func__, ret);
5164         return ret;
5165 }
5166
5167 /*
5168  * Initialize the forechannel and backchannel tables
5169  */
5170 static int nfs4_init_slot_tables(struct nfs4_session *session)
5171 {
5172         struct nfs4_slot_table *tbl;
5173         int status = 0;
5174
5175         tbl = &session->fc_slot_table;
5176         if (tbl->slots == NULL) {
5177                 status = nfs4_init_slot_table(tbl,
5178                                 session->fc_attrs.max_reqs, 1);
5179                 if (status)
5180                         return status;
5181         }
5182
5183         tbl = &session->bc_slot_table;
5184         if (tbl->slots == NULL) {
5185                 status = nfs4_init_slot_table(tbl,
5186                                 session->bc_attrs.max_reqs, 0);
5187                 if (status)
5188                         nfs4_destroy_slot_tables(session);
5189         }
5190
5191         return status;
5192 }
5193
5194 struct nfs4_session *nfs4_alloc_session(struct nfs_client *clp)
5195 {
5196         struct nfs4_session *session;
5197         struct nfs4_slot_table *tbl;
5198
5199         session = kzalloc(sizeof(struct nfs4_session), GFP_NOFS);
5200         if (!session)
5201                 return NULL;
5202
5203         tbl = &session->fc_slot_table;
5204         tbl->highest_used_slotid = -1;
5205         spin_lock_init(&tbl->slot_tbl_lock);
5206         rpc_init_priority_wait_queue(&tbl->slot_tbl_waitq, "ForeChannel Slot table");
5207         init_completion(&tbl->complete);
5208
5209         tbl = &session->bc_slot_table;
5210         tbl->highest_used_slotid = -1;
5211         spin_lock_init(&tbl->slot_tbl_lock);
5212         rpc_init_wait_queue(&tbl->slot_tbl_waitq, "BackChannel Slot table");
5213         init_completion(&tbl->complete);
5214
5215         session->session_state = 1<<NFS4_SESSION_INITING;
5216
5217         session->clp = clp;
5218         return session;
5219 }
5220
5221 void nfs4_destroy_session(struct nfs4_session *session)
5222 {
5223         nfs4_proc_destroy_session(session);
5224         dprintk("%s Destroy backchannel for xprt %p\n",
5225                 __func__, session->clp->cl_rpcclient->cl_xprt);
5226         xprt_destroy_backchannel(session->clp->cl_rpcclient->cl_xprt,
5227                                 NFS41_BC_MIN_CALLBACKS);
5228         nfs4_destroy_slot_tables(session);
5229         kfree(session);
5230 }
5231
5232 /*
5233  * Initialize the values to be used by the client in CREATE_SESSION
5234  * If nfs4_init_session set the fore channel request and response sizes,
5235  * use them.
5236  *
5237  * Set the back channel max_resp_sz_cached to zero to force the client to
5238  * always set csa_cachethis to FALSE because the current implementation
5239  * of the back channel DRC only supports caching the CB_SEQUENCE operation.
5240  */
5241 static void nfs4_init_channel_attrs(struct nfs41_create_session_args *args)
5242 {
5243         struct nfs4_session *session = args->client->cl_session;
5244         unsigned int mxrqst_sz = session->fc_attrs.max_rqst_sz,
5245                      mxresp_sz = session->fc_attrs.max_resp_sz;
5246
5247         if (mxrqst_sz == 0)
5248                 mxrqst_sz = NFS_MAX_FILE_IO_SIZE;
5249         if (mxresp_sz == 0)
5250                 mxresp_sz = NFS_MAX_FILE_IO_SIZE;
5251         /* Fore channel attributes */
5252         args->fc_attrs.max_rqst_sz = mxrqst_sz;
5253         args->fc_attrs.max_resp_sz = mxresp_sz;
5254         args->fc_attrs.max_ops = NFS4_MAX_OPS;
5255         args->fc_attrs.max_reqs = session->clp->cl_rpcclient->cl_xprt->max_reqs;
5256
5257         dprintk("%s: Fore Channel : max_rqst_sz=%u max_resp_sz=%u "
5258                 "max_ops=%u max_reqs=%u\n",
5259                 __func__,
5260                 args->fc_attrs.max_rqst_sz, args->fc_attrs.max_resp_sz,
5261                 args->fc_attrs.max_ops, args->fc_attrs.max_reqs);
5262
5263         /* Back channel attributes */
5264         args->bc_attrs.max_rqst_sz = PAGE_SIZE;
5265         args->bc_attrs.max_resp_sz = PAGE_SIZE;
5266         args->bc_attrs.max_resp_sz_cached = 0;
5267         args->bc_attrs.max_ops = NFS4_MAX_BACK_CHANNEL_OPS;
5268         args->bc_attrs.max_reqs = 1;
5269
5270         dprintk("%s: Back Channel : max_rqst_sz=%u max_resp_sz=%u "
5271                 "max_resp_sz_cached=%u max_ops=%u max_reqs=%u\n",
5272                 __func__,
5273                 args->bc_attrs.max_rqst_sz, args->bc_attrs.max_resp_sz,
5274                 args->bc_attrs.max_resp_sz_cached, args->bc_attrs.max_ops,
5275                 args->bc_attrs.max_reqs);
5276 }
5277
5278 static int nfs4_verify_fore_channel_attrs(struct nfs41_create_session_args *args, struct nfs4_session *session)
5279 {
5280         struct nfs4_channel_attrs *sent = &args->fc_attrs;
5281         struct nfs4_channel_attrs *rcvd = &session->fc_attrs;
5282
5283         if (rcvd->max_resp_sz > sent->max_resp_sz)
5284                 return -EINVAL;
5285         /*
5286          * Our requested max_ops is the minimum we need; we're not
5287          * prepared to break up compounds into smaller pieces than that.
5288          * So, no point even trying to continue if the server won't
5289          * cooperate:
5290          */
5291         if (rcvd->max_ops < sent->max_ops)
5292                 return -EINVAL;
5293         if (rcvd->max_reqs == 0)
5294                 return -EINVAL;
5295         return 0;
5296 }
5297
5298 static int nfs4_verify_back_channel_attrs(struct nfs41_create_session_args *args, struct nfs4_session *session)
5299 {
5300         struct nfs4_channel_attrs *sent = &args->bc_attrs;
5301         struct nfs4_channel_attrs *rcvd = &session->bc_attrs;
5302
5303         if (rcvd->max_rqst_sz > sent->max_rqst_sz)
5304                 return -EINVAL;
5305         if (rcvd->max_resp_sz < sent->max_resp_sz)
5306                 return -EINVAL;
5307         if (rcvd->max_resp_sz_cached > sent->max_resp_sz_cached)
5308                 return -EINVAL;
5309         /* These would render the backchannel useless: */
5310         if (rcvd->max_ops  == 0)
5311                 return -EINVAL;
5312         if (rcvd->max_reqs == 0)
5313                 return -EINVAL;
5314         return 0;
5315 }
5316
5317 static int nfs4_verify_channel_attrs(struct nfs41_create_session_args *args,
5318                                      struct nfs4_session *session)
5319 {
5320         int ret;
5321
5322         ret = nfs4_verify_fore_channel_attrs(args, session);
5323         if (ret)
5324                 return ret;
5325         return nfs4_verify_back_channel_attrs(args, session);
5326 }
5327
5328 static int _nfs4_proc_create_session(struct nfs_client *clp)
5329 {
5330         struct nfs4_session *session = clp->cl_session;
5331         struct nfs41_create_session_args args = {
5332                 .client = clp,
5333                 .cb_program = NFS4_CALLBACK,
5334         };
5335         struct nfs41_create_session_res res = {
5336                 .client = clp,
5337         };
5338         struct rpc_message msg = {
5339                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE_SESSION],
5340                 .rpc_argp = &args,
5341                 .rpc_resp = &res,
5342         };
5343         int status;
5344
5345         nfs4_init_channel_attrs(&args);
5346         args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN);
5347
5348         status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
5349
5350         if (!status)
5351                 /* Verify the session's negotiated channel_attrs values */
5352                 status = nfs4_verify_channel_attrs(&args, session);
5353         if (!status) {
5354                 /* Increment the clientid slot sequence id */
5355                 clp->cl_seqid++;
5356         }
5357
5358         return status;
5359 }
5360
5361 /*
5362  * Issues a CREATE_SESSION operation to the server.
5363  * It is the responsibility of the caller to verify the session is
5364  * expired before calling this routine.
5365  */
5366 int nfs4_proc_create_session(struct nfs_client *clp)
5367 {
5368         int status;
5369         unsigned *ptr;
5370         struct nfs4_session *session = clp->cl_session;
5371
5372         dprintk("--> %s clp=%p session=%p\n", __func__, clp, session);
5373
5374         status = _nfs4_proc_create_session(clp);
5375         if (status)
5376                 goto out;
5377
5378         /* Init and reset the fore channel */
5379         status = nfs4_init_slot_tables(session);
5380         dprintk("slot table initialization returned %d\n", status);
5381         if (status)
5382                 goto out;
5383         status = nfs4_reset_slot_tables(session);
5384         dprintk("slot table reset returned %d\n", status);
5385         if (status)
5386                 goto out;
5387
5388         ptr = (unsigned *)&session->sess_id.data[0];
5389         dprintk("%s client>seqid %d sessionid %u:%u:%u:%u\n", __func__,
5390                 clp->cl_seqid, ptr[0], ptr[1], ptr[2], ptr[3]);
5391 out:
5392         dprintk("<-- %s\n", __func__);
5393         return status;
5394 }
5395
5396 /*
5397  * Issue the over-the-wire RPC DESTROY_SESSION.
5398  * The caller must serialize access to this routine.
5399  */
5400 int nfs4_proc_destroy_session(struct nfs4_session *session)
5401 {
5402         int status = 0;
5403         struct rpc_message msg;
5404
5405         dprintk("--> nfs4_proc_destroy_session\n");
5406
5407         /* session is still being setup */
5408         if (session->clp->cl_cons_state != NFS_CS_READY)
5409                 return status;
5410
5411         msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DESTROY_SESSION];
5412         msg.rpc_argp = session;
5413         msg.rpc_resp = NULL;
5414         msg.rpc_cred = NULL;
5415         status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
5416
5417         if (status)
5418                 printk(KERN_WARNING
5419                         "Got error %d from the server on DESTROY_SESSION. "
5420                         "Session has been destroyed regardless...\n", status);
5421
5422         dprintk("<-- nfs4_proc_destroy_session\n");
5423         return status;
5424 }
5425
5426 int nfs4_init_session(struct nfs_server *server)
5427 {
5428         struct nfs_client *clp = server->nfs_client;
5429         struct nfs4_session *session;
5430         unsigned int rsize, wsize;
5431         int ret;
5432
5433         if (!nfs4_has_session(clp))
5434                 return 0;
5435
5436         session = clp->cl_session;
5437         if (!test_and_clear_bit(NFS4_SESSION_INITING, &session->session_state))
5438                 return 0;
5439
5440         rsize = server->rsize;
5441         if (rsize == 0)
5442                 rsize = NFS_MAX_FILE_IO_SIZE;
5443         wsize = server->wsize;
5444         if (wsize == 0)
5445                 wsize = NFS_MAX_FILE_IO_SIZE;
5446
5447         session->fc_attrs.max_rqst_sz = wsize + nfs41_maxwrite_overhead;
5448         session->fc_attrs.max_resp_sz = rsize + nfs41_maxread_overhead;
5449
5450         ret = nfs4_recover_expired_lease(server);
5451         if (!ret)
5452                 ret = nfs4_check_client_ready(clp);
5453         return ret;
5454 }
5455
5456 int nfs4_init_ds_session(struct nfs_client *clp)
5457 {
5458         struct nfs4_session *session = clp->cl_session;
5459         int ret;
5460
5461         if (!test_and_clear_bit(NFS4_SESSION_INITING, &session->session_state))
5462                 return 0;
5463
5464         ret = nfs4_client_recover_expired_lease(clp);
5465         if (!ret)
5466                 /* Test for the DS role */
5467                 if (!is_ds_client(clp))
5468                         ret = -ENODEV;
5469         if (!ret)
5470                 ret = nfs4_check_client_ready(clp);
5471         return ret;
5472
5473 }
5474 EXPORT_SYMBOL_GPL(nfs4_init_ds_session);
5475
5476
5477 /*
5478  * Renew the cl_session lease.
5479  */
5480 struct nfs4_sequence_data {
5481         struct nfs_client *clp;
5482         struct nfs4_sequence_args args;
5483         struct nfs4_sequence_res res;
5484 };
5485
5486 static void nfs41_sequence_release(void *data)
5487 {
5488         struct nfs4_sequence_data *calldata = data;
5489         struct nfs_client *clp = calldata->clp;
5490
5491         if (atomic_read(&clp->cl_count) > 1)
5492                 nfs4_schedule_state_renewal(clp);
5493         nfs_put_client(clp);
5494         kfree(calldata);
5495 }
5496
5497 static int nfs41_sequence_handle_errors(struct rpc_task *task, struct nfs_client *clp)
5498 {
5499         switch(task->tk_status) {
5500         case -NFS4ERR_DELAY:
5501                 rpc_delay(task, NFS4_POLL_RETRY_MAX);
5502                 return -EAGAIN;
5503         default:
5504                 nfs4_schedule_lease_recovery(clp);
5505         }
5506         return 0;
5507 }
5508
5509 static void nfs41_sequence_call_done(struct rpc_task *task, void *data)
5510 {
5511         struct nfs4_sequence_data *calldata = data;
5512         struct nfs_client *clp = calldata->clp;
5513
5514         if (!nfs41_sequence_done(task, task->tk_msg.rpc_resp))
5515                 return;
5516
5517         if (task->tk_status < 0) {
5518                 dprintk("%s ERROR %d\n", __func__, task->tk_status);
5519                 if (atomic_read(&clp->cl_count) == 1)
5520                         goto out;
5521
5522                 if (nfs41_sequence_handle_errors(task, clp) == -EAGAIN) {
5523                         rpc_restart_call_prepare(task);
5524                         return;
5525                 }
5526         }
5527         dprintk("%s rpc_cred %p\n", __func__, task->tk_msg.rpc_cred);
5528 out:
5529         dprintk("<-- %s\n", __func__);
5530 }
5531
5532 static void nfs41_sequence_prepare(struct rpc_task *task, void *data)
5533 {
5534         struct nfs4_sequence_data *calldata = data;
5535         struct nfs_client *clp = calldata->clp;
5536         struct nfs4_sequence_args *args;
5537         struct nfs4_sequence_res *res;
5538
5539         args = task->tk_msg.rpc_argp;
5540         res = task->tk_msg.rpc_resp;
5541
5542         if (nfs41_setup_sequence(clp->cl_session, args, res, 0, task))
5543                 return;
5544         rpc_call_start(task);
5545 }
5546
5547 static void nfs41_sequence_prepare_privileged(struct rpc_task *task, void *data)
5548 {
5549         rpc_task_set_priority(task, RPC_PRIORITY_PRIVILEGED);
5550         nfs41_sequence_prepare(task, data);
5551 }
5552
5553 static const struct rpc_call_ops nfs41_sequence_ops = {
5554         .rpc_call_done = nfs41_sequence_call_done,
5555         .rpc_call_prepare = nfs41_sequence_prepare,
5556         .rpc_release = nfs41_sequence_release,
5557 };
5558
5559 static const struct rpc_call_ops nfs41_sequence_privileged_ops = {
5560         .rpc_call_done = nfs41_sequence_call_done,
5561         .rpc_call_prepare = nfs41_sequence_prepare_privileged,
5562         .rpc_release = nfs41_sequence_release,
5563 };
5564
5565 static struct rpc_task *_nfs41_proc_sequence(struct nfs_client *clp, struct rpc_cred *cred,
5566                                              const struct rpc_call_ops *seq_ops)
5567 {
5568         struct nfs4_sequence_data *calldata;
5569         struct rpc_message msg = {
5570                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SEQUENCE],
5571                 .rpc_cred = cred,
5572         };
5573         struct rpc_task_setup task_setup_data = {
5574                 .rpc_client = clp->cl_rpcclient,
5575                 .rpc_message = &msg,
5576                 .callback_ops = seq_ops,
5577                 .flags = RPC_TASK_ASYNC | RPC_TASK_SOFT,
5578         };
5579
5580         if (!atomic_inc_not_zero(&clp->cl_count))
5581                 return ERR_PTR(-EIO);
5582         calldata = kzalloc(sizeof(*calldata), GFP_NOFS);
5583         if (calldata == NULL) {
5584                 nfs_put_client(clp);
5585                 return ERR_PTR(-ENOMEM);
5586         }
5587         msg.rpc_argp = &calldata->args;
5588         msg.rpc_resp = &calldata->res;
5589         calldata->clp = clp;
5590         task_setup_data.callback_data = calldata;
5591
5592         return rpc_run_task(&task_setup_data);
5593 }
5594
5595 static int nfs41_proc_async_sequence(struct nfs_client *clp, struct rpc_cred *cred, unsigned renew_flags)
5596 {
5597         struct rpc_task *task;
5598         int ret = 0;
5599
5600         if ((renew_flags & NFS4_RENEW_TIMEOUT) == 0)
5601                 return 0;
5602         task = _nfs41_proc_sequence(clp, cred, &nfs41_sequence_ops);
5603         if (IS_ERR(task))
5604                 ret = PTR_ERR(task);
5605         else
5606                 rpc_put_task_async(task);
5607         dprintk("<-- %s status=%d\n", __func__, ret);
5608         return ret;
5609 }
5610
5611 static int nfs4_proc_sequence(struct nfs_client *clp, struct rpc_cred *cred)
5612 {
5613         struct rpc_task *task;
5614         int ret;
5615
5616         task = _nfs41_proc_sequence(clp, cred, &nfs41_sequence_privileged_ops);
5617         if (IS_ERR(task)) {
5618                 ret = PTR_ERR(task);
5619                 goto out;
5620         }
5621         ret = rpc_wait_for_completion_task(task);
5622         if (!ret) {
5623                 struct nfs4_sequence_res *res = task->tk_msg.rpc_resp;
5624
5625                 if (task->tk_status == 0)
5626                         nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags);
5627                 ret = task->tk_status;
5628         }
5629         rpc_put_task(task);
5630 out:
5631         dprintk("<-- %s status=%d\n", __func__, ret);
5632         return ret;
5633 }
5634
5635 struct nfs4_reclaim_complete_data {
5636         struct nfs_client *clp;
5637         struct nfs41_reclaim_complete_args arg;
5638         struct nfs41_reclaim_complete_res res;
5639 };
5640
5641 static void nfs4_reclaim_complete_prepare(struct rpc_task *task, void *data)
5642 {
5643         struct nfs4_reclaim_complete_data *calldata = data;
5644
5645         rpc_task_set_priority(task, RPC_PRIORITY_PRIVILEGED);
5646         if (nfs41_setup_sequence(calldata->clp->cl_session,
5647                                 &calldata->arg.seq_args,
5648                                 &calldata->res.seq_res, 0, task))
5649                 return;
5650
5651         rpc_call_start(task);
5652 }
5653
5654 static int nfs41_reclaim_complete_handle_errors(struct rpc_task *task, struct nfs_client *clp)
5655 {
5656         switch(task->tk_status) {
5657         case 0:
5658         case -NFS4ERR_COMPLETE_ALREADY:
5659         case -NFS4ERR_WRONG_CRED: /* What to do here? */
5660                 break;
5661         case -NFS4ERR_DELAY:
5662                 rpc_delay(task, NFS4_POLL_RETRY_MAX);
5663                 /* fall through */
5664         case -NFS4ERR_RETRY_UNCACHED_REP:
5665                 return -EAGAIN;
5666         default:
5667                 nfs4_schedule_lease_recovery(clp);
5668         }
5669         return 0;
5670 }
5671
5672 static void nfs4_reclaim_complete_done(struct rpc_task *task, void *data)
5673 {
5674         struct nfs4_reclaim_complete_data *calldata = data;
5675         struct nfs_client *clp = calldata->clp;
5676         struct nfs4_sequence_res *res = &calldata->res.seq_res;
5677
5678         dprintk("--> %s\n", __func__);
5679         if (!nfs41_sequence_done(task, res))
5680                 return;
5681
5682         if (nfs41_reclaim_complete_handle_errors(task, clp) == -EAGAIN) {
5683                 rpc_restart_call_prepare(task);
5684                 return;
5685         }
5686         dprintk("<-- %s\n", __func__);
5687 }
5688
5689 static void nfs4_free_reclaim_complete_data(void *data)
5690 {
5691         struct nfs4_reclaim_complete_data *calldata = data;
5692
5693         kfree(calldata);
5694 }
5695
5696 static const struct rpc_call_ops nfs4_reclaim_complete_call_ops = {
5697         .rpc_call_prepare = nfs4_reclaim_complete_prepare,
5698         .rpc_call_done = nfs4_reclaim_complete_done,
5699         .rpc_release = nfs4_free_reclaim_complete_data,
5700 };
5701
5702 /*
5703  * Issue a global reclaim complete.
5704  */
5705 static int nfs41_proc_reclaim_complete(struct nfs_client *clp)
5706 {
5707         struct nfs4_reclaim_complete_data *calldata;
5708         struct rpc_task *task;
5709         struct rpc_message msg = {
5710                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RECLAIM_COMPLETE],
5711         };
5712         struct rpc_task_setup task_setup_data = {
5713                 .rpc_client = clp->cl_rpcclient,
5714                 .rpc_message = &msg,
5715                 .callback_ops = &nfs4_reclaim_complete_call_ops,
5716                 .flags = RPC_TASK_ASYNC,
5717         };
5718         int status = -ENOMEM;
5719
5720         dprintk("--> %s\n", __func__);
5721         calldata = kzalloc(sizeof(*calldata), GFP_NOFS);
5722         if (calldata == NULL)
5723                 goto out;
5724         calldata->clp = clp;
5725         calldata->arg.one_fs = 0;
5726
5727         msg.rpc_argp = &calldata->arg;
5728         msg.rpc_resp = &calldata->res;
5729         task_setup_data.callback_data = calldata;
5730         task = rpc_run_task(&task_setup_data);
5731         if (IS_ERR(task)) {
5732                 status = PTR_ERR(task);
5733                 goto out;
5734         }
5735         status = nfs4_wait_for_completion_rpc_task(task);
5736         if (status == 0)
5737                 status = task->tk_status;
5738         rpc_put_task(task);
5739         return 0;
5740 out:
5741         dprintk("<-- %s status=%d\n", __func__, status);
5742         return status;
5743 }
5744
5745 static void
5746 nfs4_layoutget_prepare(struct rpc_task *task, void *calldata)
5747 {
5748         struct nfs4_layoutget *lgp = calldata;
5749         struct nfs_server *server = NFS_SERVER(lgp->args.inode);
5750
5751         dprintk("--> %s\n", __func__);
5752         /* Note the is a race here, where a CB_LAYOUTRECALL can come in
5753          * right now covering the LAYOUTGET we are about to send.
5754          * However, that is not so catastrophic, and there seems
5755          * to be no way to prevent it completely.
5756          */
5757         if (nfs4_setup_sequence(server, &lgp->args.seq_args,
5758                                 &lgp->res.seq_res, 0, task))
5759                 return;
5760         if (pnfs_choose_layoutget_stateid(&lgp->args.stateid,
5761                                           NFS_I(lgp->args.inode)->layout,
5762                                           lgp->args.ctx->state)) {
5763                 rpc_exit(task, NFS4_OK);
5764                 return;
5765         }
5766         rpc_call_start(task);
5767 }
5768
5769 static void nfs4_layoutget_done(struct rpc_task *task, void *calldata)
5770 {
5771         struct nfs4_layoutget *lgp = calldata;
5772         struct nfs_server *server = NFS_SERVER(lgp->args.inode);
5773
5774         dprintk("--> %s\n", __func__);
5775
5776         if (!nfs4_sequence_done(task, &lgp->res.seq_res))
5777                 return;
5778
5779         switch (task->tk_status) {
5780         case 0:
5781                 break;
5782         case -NFS4ERR_LAYOUTTRYLATER:
5783         case -NFS4ERR_RECALLCONFLICT:
5784                 task->tk_status = -NFS4ERR_DELAY;
5785                 /* Fall through */
5786         default:
5787                 if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) {
5788                         rpc_restart_call_prepare(task);
5789                         return;
5790                 }
5791         }
5792         dprintk("<-- %s\n", __func__);
5793 }
5794
5795 static size_t max_response_pages(struct nfs_server *server)
5796 {
5797         u32 max_resp_sz = server->nfs_client->cl_session->fc_attrs.max_resp_sz;
5798         return nfs_page_array_len(0, max_resp_sz);
5799 }
5800
5801 static void nfs4_free_pages(struct page **pages, size_t size)
5802 {
5803         int i;
5804
5805         if (!pages)
5806                 return;
5807
5808         for (i = 0; i < size; i++) {
5809                 if (!pages[i])
5810                         break;
5811                 __free_page(pages[i]);
5812         }
5813         kfree(pages);
5814 }
5815
5816 static struct page **nfs4_alloc_pages(size_t size, gfp_t gfp_flags)
5817 {
5818         struct page **pages;
5819         int i;
5820
5821         pages = kcalloc(size, sizeof(struct page *), gfp_flags);
5822         if (!pages) {
5823                 dprintk("%s: can't alloc array of %zu pages\n", __func__, size);
5824                 return NULL;
5825         }
5826
5827         for (i = 0; i < size; i++) {
5828                 pages[i] = alloc_page(gfp_flags);
5829                 if (!pages[i]) {
5830                         dprintk("%s: failed to allocate page\n", __func__);
5831                         nfs4_free_pages(pages, size);
5832                         return NULL;
5833                 }
5834         }
5835
5836         return pages;
5837 }
5838
5839 static void nfs4_layoutget_release(void *calldata)
5840 {
5841         struct nfs4_layoutget *lgp = calldata;
5842         struct nfs_server *server = NFS_SERVER(lgp->args.inode);
5843         size_t max_pages = max_response_pages(server);
5844
5845         dprintk("--> %s\n", __func__);
5846         nfs4_free_pages(lgp->args.layout.pages, max_pages);
5847         put_nfs_open_context(lgp->args.ctx);
5848         kfree(calldata);
5849         dprintk("<-- %s\n", __func__);
5850 }
5851
5852 static const struct rpc_call_ops nfs4_layoutget_call_ops = {
5853         .rpc_call_prepare = nfs4_layoutget_prepare,
5854         .rpc_call_done = nfs4_layoutget_done,
5855         .rpc_release = nfs4_layoutget_release,
5856 };
5857
5858 int nfs4_proc_layoutget(struct nfs4_layoutget *lgp, gfp_t gfp_flags)
5859 {
5860         struct nfs_server *server = NFS_SERVER(lgp->args.inode);
5861         size_t max_pages = max_response_pages(server);
5862         struct rpc_task *task;
5863         struct rpc_message msg = {
5864                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTGET],
5865                 .rpc_argp = &lgp->args,
5866                 .rpc_resp = &lgp->res,
5867         };
5868         struct rpc_task_setup task_setup_data = {
5869                 .rpc_client = server->client,
5870                 .rpc_message = &msg,
5871                 .callback_ops = &nfs4_layoutget_call_ops,
5872                 .callback_data = lgp,
5873                 .flags = RPC_TASK_ASYNC,
5874         };
5875         int status = 0;
5876
5877         dprintk("--> %s\n", __func__);
5878
5879         lgp->args.layout.pages = nfs4_alloc_pages(max_pages, gfp_flags);
5880         if (!lgp->args.layout.pages) {
5881                 nfs4_layoutget_release(lgp);
5882                 return -ENOMEM;
5883         }
5884         lgp->args.layout.pglen = max_pages * PAGE_SIZE;
5885
5886         lgp->res.layoutp = &lgp->args.layout;
5887         lgp->res.seq_res.sr_slot = NULL;
5888         task = rpc_run_task(&task_setup_data);
5889         if (IS_ERR(task))
5890                 return PTR_ERR(task);
5891         status = nfs4_wait_for_completion_rpc_task(task);
5892         if (status == 0)
5893                 status = task->tk_status;
5894         if (status == 0)
5895                 status = pnfs_layout_process(lgp);
5896         rpc_put_task(task);
5897         dprintk("<-- %s status=%d\n", __func__, status);
5898         return status;
5899 }
5900
5901 static void
5902 nfs4_layoutreturn_prepare(struct rpc_task *task, void *calldata)
5903 {
5904         struct nfs4_layoutreturn *lrp = calldata;
5905
5906         dprintk("--> %s\n", __func__);
5907         if (nfs41_setup_sequence(lrp->clp->cl_session, &lrp->args.seq_args,
5908                                 &lrp->res.seq_res, 0, task))
5909                 return;
5910         rpc_call_start(task);
5911 }
5912
5913 static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata)
5914 {
5915         struct nfs4_layoutreturn *lrp = calldata;
5916         struct nfs_server *server;
5917         struct pnfs_layout_hdr *lo = lrp->args.layout;
5918
5919         dprintk("--> %s\n", __func__);
5920
5921         if (!nfs4_sequence_done(task, &lrp->res.seq_res))
5922                 return;
5923
5924         server = NFS_SERVER(lrp->args.inode);
5925         if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) {
5926                 rpc_restart_call_prepare(task);
5927                 return;
5928         }
5929         spin_lock(&lo->plh_inode->i_lock);
5930         if (task->tk_status == 0) {
5931                 if (lrp->res.lrs_present) {
5932                         pnfs_set_layout_stateid(lo, &lrp->res.stateid, true);
5933                 } else
5934                         BUG_ON(!list_empty(&lo->plh_segs));
5935         }
5936         lo->plh_block_lgets--;
5937         spin_unlock(&lo->plh_inode->i_lock);
5938         dprintk("<-- %s\n", __func__);
5939 }
5940
5941 static void nfs4_layoutreturn_release(void *calldata)
5942 {
5943         struct nfs4_layoutreturn *lrp = calldata;
5944
5945         dprintk("--> %s\n", __func__);
5946         put_layout_hdr(lrp->args.layout);
5947         kfree(calldata);
5948         dprintk("<-- %s\n", __func__);
5949 }
5950
5951 static const struct rpc_call_ops nfs4_layoutreturn_call_ops = {
5952         .rpc_call_prepare = nfs4_layoutreturn_prepare,
5953         .rpc_call_done = nfs4_layoutreturn_done,
5954         .rpc_release = nfs4_layoutreturn_release,
5955 };
5956
5957 int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp)
5958 {
5959         struct rpc_task *task;
5960         struct rpc_message msg = {
5961                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTRETURN],
5962                 .rpc_argp = &lrp->args,
5963                 .rpc_resp = &lrp->res,
5964         };
5965         struct rpc_task_setup task_setup_data = {
5966                 .rpc_client = lrp->clp->cl_rpcclient,
5967                 .rpc_message = &msg,
5968                 .callback_ops = &nfs4_layoutreturn_call_ops,
5969                 .callback_data = lrp,
5970         };
5971         int status;
5972
5973         dprintk("--> %s\n", __func__);
5974         task = rpc_run_task(&task_setup_data);
5975         if (IS_ERR(task))
5976                 return PTR_ERR(task);
5977         status = task->tk_status;
5978         dprintk("<-- %s status=%d\n", __func__, status);
5979         rpc_put_task(task);
5980         return status;
5981 }
5982
5983 /*
5984  * Retrieve the list of Data Server devices from the MDS.
5985  */
5986 static int _nfs4_getdevicelist(struct nfs_server *server,
5987                                     const struct nfs_fh *fh,
5988                                     struct pnfs_devicelist *devlist)
5989 {
5990         struct nfs4_getdevicelist_args args = {
5991                 .fh = fh,
5992                 .layoutclass = server->pnfs_curr_ld->id,
5993         };
5994         struct nfs4_getdevicelist_res res = {
5995                 .devlist = devlist,
5996         };
5997         struct rpc_message msg = {
5998                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETDEVICELIST],
5999                 .rpc_argp = &args,
6000                 .rpc_resp = &res,
6001         };
6002         int status;
6003
6004         dprintk("--> %s\n", __func__);
6005         status = nfs4_call_sync(server->client, server, &msg, &args.seq_args,
6006                                 &res.seq_res, 0);
6007         dprintk("<-- %s status=%d\n", __func__, status);
6008         return status;
6009 }
6010
6011 int nfs4_proc_getdevicelist(struct nfs_server *server,
6012                             const struct nfs_fh *fh,
6013                             struct pnfs_devicelist *devlist)
6014 {
6015         struct nfs4_exception exception = { };
6016         int err;
6017
6018         do {
6019                 err = nfs4_handle_exception(server,
6020                                 _nfs4_getdevicelist(server, fh, devlist),
6021                                 &exception);
6022         } while (exception.retry);
6023
6024         dprintk("%s: err=%d, num_devs=%u\n", __func__,
6025                 err, devlist->num_devs);
6026
6027         return err;
6028 }
6029 EXPORT_SYMBOL_GPL(nfs4_proc_getdevicelist);
6030
6031 static int
6032 _nfs4_proc_getdeviceinfo(struct nfs_server *server, struct pnfs_device *pdev)
6033 {
6034         struct nfs4_getdeviceinfo_args args = {
6035                 .pdev = pdev,
6036         };
6037         struct nfs4_getdeviceinfo_res res = {
6038                 .pdev = pdev,
6039         };
6040         struct rpc_message msg = {
6041                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETDEVICEINFO],
6042                 .rpc_argp = &args,
6043                 .rpc_resp = &res,
6044         };
6045         int status;
6046
6047         dprintk("--> %s\n", __func__);
6048         status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
6049         dprintk("<-- %s status=%d\n", __func__, status);
6050
6051         return status;
6052 }
6053
6054 int nfs4_proc_getdeviceinfo(struct nfs_server *server, struct pnfs_device *pdev)
6055 {
6056         struct nfs4_exception exception = { };
6057         int err;
6058
6059         do {
6060                 err = nfs4_handle_exception(server,
6061                                         _nfs4_proc_getdeviceinfo(server, pdev),
6062                                         &exception);
6063         } while (exception.retry);
6064         return err;
6065 }
6066 EXPORT_SYMBOL_GPL(nfs4_proc_getdeviceinfo);
6067
6068 static void nfs4_layoutcommit_prepare(struct rpc_task *task, void *calldata)
6069 {
6070         struct nfs4_layoutcommit_data *data = calldata;
6071         struct nfs_server *server = NFS_SERVER(data->args.inode);
6072
6073         if (nfs4_setup_sequence(server, &data->args.seq_args,
6074                                 &data->res.seq_res, 1, task))
6075                 return;
6076         rpc_call_start(task);
6077 }
6078
6079 static void
6080 nfs4_layoutcommit_done(struct rpc_task *task, void *calldata)
6081 {
6082         struct nfs4_layoutcommit_data *data = calldata;
6083         struct nfs_server *server = NFS_SERVER(data->args.inode);
6084
6085         if (!nfs4_sequence_done(task, &data->res.seq_res))
6086                 return;
6087
6088         switch (task->tk_status) { /* Just ignore these failures */
6089         case -NFS4ERR_DELEG_REVOKED: /* layout was recalled */
6090         case -NFS4ERR_BADIOMODE:     /* no IOMODE_RW layout for range */
6091         case -NFS4ERR_BADLAYOUT:     /* no layout */
6092         case -NFS4ERR_GRACE:        /* loca_recalim always false */
6093                 task->tk_status = 0;
6094                 break;
6095         case 0:
6096                 nfs_post_op_update_inode_force_wcc(data->args.inode,
6097                                                    data->res.fattr);
6098                 break;
6099         default:
6100                 if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) {
6101                         rpc_restart_call_prepare(task);
6102                         return;
6103                 }
6104         }
6105 }
6106
6107 static void nfs4_layoutcommit_release(void *calldata)
6108 {
6109         struct nfs4_layoutcommit_data *data = calldata;
6110         struct pnfs_layout_segment *lseg, *tmp;
6111         unsigned long *bitlock = &NFS_I(data->args.inode)->flags;
6112
6113         pnfs_cleanup_layoutcommit(data);
6114         /* Matched by references in pnfs_set_layoutcommit */
6115         list_for_each_entry_safe(lseg, tmp, &data->lseg_list, pls_lc_list) {
6116                 list_del_init(&lseg->pls_lc_list);
6117                 if (test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT,
6118                                        &lseg->pls_flags))
6119                         put_lseg(lseg);
6120         }
6121
6122         clear_bit_unlock(NFS_INO_LAYOUTCOMMITTING, bitlock);
6123         smp_mb__after_clear_bit();
6124         wake_up_bit(bitlock, NFS_INO_LAYOUTCOMMITTING);
6125
6126         put_rpccred(data->cred);
6127         kfree(data);
6128 }
6129
6130 static const struct rpc_call_ops nfs4_layoutcommit_ops = {
6131         .rpc_call_prepare = nfs4_layoutcommit_prepare,
6132         .rpc_call_done = nfs4_layoutcommit_done,
6133         .rpc_release = nfs4_layoutcommit_release,
6134 };
6135
6136 int
6137 nfs4_proc_layoutcommit(struct nfs4_layoutcommit_data *data, bool sync)
6138 {
6139         struct rpc_message msg = {
6140                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTCOMMIT],
6141                 .rpc_argp = &data->args,
6142                 .rpc_resp = &data->res,
6143                 .rpc_cred = data->cred,
6144         };
6145         struct rpc_task_setup task_setup_data = {
6146                 .task = &data->task,
6147                 .rpc_client = NFS_CLIENT(data->args.inode),
6148                 .rpc_message = &msg,
6149                 .callback_ops = &nfs4_layoutcommit_ops,
6150                 .callback_data = data,
6151                 .flags = RPC_TASK_ASYNC,
6152         };
6153         struct rpc_task *task;
6154         int status = 0;
6155
6156         dprintk("NFS: %4d initiating layoutcommit call. sync %d "
6157                 "lbw: %llu inode %lu\n",
6158                 data->task.tk_pid, sync,
6159                 data->args.lastbytewritten,
6160                 data->args.inode->i_ino);
6161
6162         task = rpc_run_task(&task_setup_data);
6163         if (IS_ERR(task))
6164                 return PTR_ERR(task);
6165         if (sync == false)
6166                 goto out;
6167         status = nfs4_wait_for_completion_rpc_task(task);
6168         if (status != 0)
6169                 goto out;
6170         status = task->tk_status;
6171 out:
6172         dprintk("%s: status %d\n", __func__, status);
6173         rpc_put_task(task);
6174         return status;
6175 }
6176
6177 static int
6178 _nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle,
6179                     struct nfs_fsinfo *info, struct nfs4_secinfo_flavors *flavors)
6180 {
6181         struct nfs41_secinfo_no_name_args args = {
6182                 .style = SECINFO_STYLE_CURRENT_FH,
6183         };
6184         struct nfs4_secinfo_res res = {
6185                 .flavors = flavors,
6186         };
6187         struct rpc_message msg = {
6188                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SECINFO_NO_NAME],
6189                 .rpc_argp = &args,
6190                 .rpc_resp = &res,
6191         };
6192         return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
6193 }
6194
6195 static int
6196 nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle,
6197                            struct nfs_fsinfo *info, struct nfs4_secinfo_flavors *flavors)
6198 {
6199         struct nfs4_exception exception = { };
6200         int err;
6201         do {
6202                 err = _nfs41_proc_secinfo_no_name(server, fhandle, info, flavors);
6203                 switch (err) {
6204                 case 0:
6205                 case -NFS4ERR_WRONGSEC:
6206                 case -NFS4ERR_NOTSUPP:
6207                         goto out;
6208                 default:
6209                         err = nfs4_handle_exception(server, err, &exception);
6210                 }
6211         } while (exception.retry);
6212 out:
6213         return err;
6214 }
6215
6216 static int
6217 nfs41_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle,
6218                     struct nfs_fsinfo *info)
6219 {
6220         int err;
6221         struct page *page;
6222         rpc_authflavor_t flavor;
6223         struct nfs4_secinfo_flavors *flavors;
6224
6225         page = alloc_page(GFP_KERNEL);
6226         if (!page) {
6227                 err = -ENOMEM;
6228                 goto out;
6229         }
6230
6231         flavors = page_address(page);
6232         err = nfs41_proc_secinfo_no_name(server, fhandle, info, flavors);
6233
6234         /*
6235          * Fall back on "guess and check" method if
6236          * the server doesn't support SECINFO_NO_NAME
6237          */
6238         if (err == -NFS4ERR_WRONGSEC || err == -NFS4ERR_NOTSUPP) {
6239                 err = nfs4_find_root_sec(server, fhandle, info);
6240                 goto out_freepage;
6241         }
6242         if (err)
6243                 goto out_freepage;
6244
6245         flavor = nfs_find_best_sec(flavors);
6246         if (err == 0)
6247                 err = nfs4_lookup_root_sec(server, fhandle, info, flavor);
6248
6249 out_freepage:
6250         put_page(page);
6251         if (err == -EACCES)
6252                 return -EPERM;
6253 out:
6254         return err;
6255 }
6256 static int _nfs41_test_stateid(struct nfs_server *server, struct nfs4_state *state)
6257 {
6258         int status;
6259         struct nfs41_test_stateid_args args = {
6260                 .stateid = &state->stateid,
6261         };
6262         struct nfs41_test_stateid_res res;
6263         struct rpc_message msg = {
6264                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_TEST_STATEID],
6265                 .rpc_argp = &args,
6266                 .rpc_resp = &res,
6267         };
6268         args.seq_args.sa_session = res.seq_res.sr_session = NULL;
6269         status = nfs4_call_sync_sequence(server->client, server, &msg, &args.seq_args, &res.seq_res, 0, 1);
6270         return status;
6271 }
6272
6273 static int nfs41_test_stateid(struct nfs_server *server, struct nfs4_state *state)
6274 {
6275         struct nfs4_exception exception = { };
6276         int err;
6277         do {
6278                 err = nfs4_handle_exception(server,
6279                                 _nfs41_test_stateid(server, state),
6280                                 &exception);
6281         } while (exception.retry);
6282         return err;
6283 }
6284
6285 static int _nfs4_free_stateid(struct nfs_server *server, struct nfs4_state *state)
6286 {
6287         int status;
6288         struct nfs41_free_stateid_args args = {
6289                 .stateid = &state->stateid,
6290         };
6291         struct nfs41_free_stateid_res res;
6292         struct rpc_message msg = {
6293                 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FREE_STATEID],
6294                 .rpc_argp = &args,
6295                 .rpc_resp = &res,
6296         };
6297
6298         args.seq_args.sa_session = res.seq_res.sr_session = NULL;
6299         status = nfs4_call_sync_sequence(server->client, server, &msg, &args.seq_args, &res.seq_res, 0, 1);
6300         return status;
6301 }
6302
6303 static int nfs41_free_stateid(struct nfs_server *server, struct nfs4_state *state)
6304 {
6305         struct nfs4_exception exception = { };
6306         int err;
6307         do {
6308                 err = nfs4_handle_exception(server,
6309                                 _nfs4_free_stateid(server, state),
6310                                 &exception);
6311         } while (exception.retry);
6312         return err;
6313 }
6314 #endif /* CONFIG_NFS_V4_1 */
6315
6316 struct nfs4_state_recovery_ops nfs40_reboot_recovery_ops = {
6317         .owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT,
6318         .state_flag_bit = NFS_STATE_RECLAIM_REBOOT,
6319         .recover_open   = nfs4_open_reclaim,
6320         .recover_lock   = nfs4_lock_reclaim,
6321         .establish_clid = nfs4_init_clientid,
6322         .get_clid_cred  = nfs4_get_setclientid_cred,
6323 };
6324
6325 #if defined(CONFIG_NFS_V4_1)
6326 struct nfs4_state_recovery_ops nfs41_reboot_recovery_ops = {
6327         .owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT,
6328         .state_flag_bit = NFS_STATE_RECLAIM_REBOOT,
6329         .recover_open   = nfs4_open_reclaim,
6330         .recover_lock   = nfs4_lock_reclaim,
6331         .establish_clid = nfs41_init_clientid,
6332         .get_clid_cred  = nfs4_get_exchange_id_cred,
6333         .reclaim_complete = nfs41_proc_reclaim_complete,
6334 };
6335 #endif /* CONFIG_NFS_V4_1 */
6336
6337 struct nfs4_state_recovery_ops nfs40_nograce_recovery_ops = {
6338         .owner_flag_bit = NFS_OWNER_RECLAIM_NOGRACE,
6339         .state_flag_bit = NFS_STATE_RECLAIM_NOGRACE,
6340         .recover_open   = nfs4_open_expired,
6341         .recover_lock   = nfs4_lock_expired,
6342         .establish_clid = nfs4_init_clientid,
6343         .get_clid_cred  = nfs4_get_setclientid_cred,
6344 };
6345
6346 #if defined(CONFIG_NFS_V4_1)
6347 struct nfs4_state_recovery_ops nfs41_nograce_recovery_ops = {
6348         .owner_flag_bit = NFS_OWNER_RECLAIM_NOGRACE,
6349         .state_flag_bit = NFS_STATE_RECLAIM_NOGRACE,
6350         .recover_open   = nfs41_open_expired,
6351         .recover_lock   = nfs41_lock_expired,
6352         .establish_clid = nfs41_init_clientid,
6353         .get_clid_cred  = nfs4_get_exchange_id_cred,
6354 };
6355 #endif /* CONFIG_NFS_V4_1 */
6356
6357 struct nfs4_state_maintenance_ops nfs40_state_renewal_ops = {
6358         .sched_state_renewal = nfs4_proc_async_renew,
6359         .get_state_renewal_cred_locked = nfs4_get_renew_cred_locked,
6360         .renew_lease = nfs4_proc_renew,
6361 };
6362
6363 #if defined(CONFIG_NFS_V4_1)
6364 struct nfs4_state_maintenance_ops nfs41_state_renewal_ops = {
6365         .sched_state_renewal = nfs41_proc_async_sequence,
6366         .get_state_renewal_cred_locked = nfs4_get_machine_cred_locked,
6367         .renew_lease = nfs4_proc_sequence,
6368 };
6369 #endif
6370
6371 static const struct nfs4_minor_version_ops nfs_v4_0_minor_ops = {
6372         .minor_version = 0,
6373         .call_sync = _nfs4_call_sync,
6374         .validate_stateid = nfs4_validate_delegation_stateid,
6375         .find_root_sec = nfs4_find_root_sec,
6376         .reboot_recovery_ops = &nfs40_reboot_recovery_ops,
6377         .nograce_recovery_ops = &nfs40_nograce_recovery_ops,
6378         .state_renewal_ops = &nfs40_state_renewal_ops,
6379 };
6380
6381 #if defined(CONFIG_NFS_V4_1)
6382 static const struct nfs4_minor_version_ops nfs_v4_1_minor_ops = {
6383         .minor_version = 1,
6384         .call_sync = _nfs4_call_sync_session,
6385         .validate_stateid = nfs41_validate_delegation_stateid,
6386         .find_root_sec = nfs41_find_root_sec,
6387         .reboot_recovery_ops = &nfs41_reboot_recovery_ops,
6388         .nograce_recovery_ops = &nfs41_nograce_recovery_ops,
6389         .state_renewal_ops = &nfs41_state_renewal_ops,
6390 };
6391 #endif
6392
6393 const struct nfs4_minor_version_ops *nfs_v4_minor_ops[] = {
6394         [0] = &nfs_v4_0_minor_ops,
6395 #if defined(CONFIG_NFS_V4_1)
6396         [1] = &nfs_v4_1_minor_ops,
6397 #endif
6398 };
6399
6400 static const struct inode_operations nfs4_file_inode_operations = {
6401         .permission     = nfs_permission,
6402         .getattr        = nfs_getattr,
6403         .setattr        = nfs_setattr,
6404         .getxattr       = generic_getxattr,
6405         .setxattr       = generic_setxattr,
6406         .listxattr      = generic_listxattr,
6407         .removexattr    = generic_removexattr,
6408 };
6409
6410 const struct nfs_rpc_ops nfs_v4_clientops = {
6411         .version        = 4,                    /* protocol version */
6412         .dentry_ops     = &nfs4_dentry_operations,
6413         .dir_inode_ops  = &nfs4_dir_inode_operations,
6414         .file_inode_ops = &nfs4_file_inode_operations,
6415         .file_ops       = &nfs4_file_operations,
6416         .getroot        = nfs4_proc_get_root,
6417         .getattr        = nfs4_proc_getattr,
6418         .setattr        = nfs4_proc_setattr,
6419         .lookup         = nfs4_proc_lookup,
6420         .access         = nfs4_proc_access,
6421         .readlink       = nfs4_proc_readlink,
6422         .create         = nfs4_proc_create,
6423         .remove         = nfs4_proc_remove,
6424         .unlink_setup   = nfs4_proc_unlink_setup,
6425         .unlink_done    = nfs4_proc_unlink_done,
6426         .rename         = nfs4_proc_rename,
6427         .rename_setup   = nfs4_proc_rename_setup,
6428         .rename_done    = nfs4_proc_rename_done,
6429         .link           = nfs4_proc_link,
6430         .symlink        = nfs4_proc_symlink,
6431         .mkdir          = nfs4_proc_mkdir,
6432         .rmdir          = nfs4_proc_remove,
6433         .readdir        = nfs4_proc_readdir,
6434         .mknod          = nfs4_proc_mknod,
6435         .statfs         = nfs4_proc_statfs,
6436         .fsinfo         = nfs4_proc_fsinfo,
6437         .pathconf       = nfs4_proc_pathconf,
6438         .set_capabilities = nfs4_server_capabilities,
6439         .decode_dirent  = nfs4_decode_dirent,
6440         .read_setup     = nfs4_proc_read_setup,
6441         .read_done      = nfs4_read_done,
6442         .write_setup    = nfs4_proc_write_setup,
6443         .write_done     = nfs4_write_done,
6444         .commit_setup   = nfs4_proc_commit_setup,
6445         .commit_done    = nfs4_commit_done,
6446         .lock           = nfs4_proc_lock,
6447         .clear_acl_cache = nfs4_zap_acl_attr,
6448         .close_context  = nfs4_close_context,
6449         .open_context   = nfs4_atomic_open,
6450         .init_client    = nfs4_init_client,
6451         .secinfo        = nfs4_proc_secinfo,
6452 };
6453
6454 static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = {
6455         .prefix = XATTR_NAME_NFSV4_ACL,
6456         .list   = nfs4_xattr_list_nfs4_acl,
6457         .get    = nfs4_xattr_get_nfs4_acl,
6458         .set    = nfs4_xattr_set_nfs4_acl,
6459 };
6460
6461 const struct xattr_handler *nfs4_xattr_handlers[] = {
6462         &nfs4_xattr_nfs4_acl_handler,
6463         NULL
6464 };
6465
6466 /*
6467  * Local variables:
6468  *  c-basic-offset: 8
6469  * End:
6470  */