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