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