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