1 /*
2 * fs/nfs/nfs4proc.c
3 *
4 * Client-side procedure declarations for NFSv4.
5 *
6 * Copyright (c) 2002 The Regents of the University of Michigan.
7 * All rights reserved.
8 *
9 * Kendrick Smith <kmsmith@umich.edu>
10 * Andy Adamson <andros@umich.edu>
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 *
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
21 * 3. Neither the name of the University nor the names of its
22 * contributors may be used to endorse or promote products derived
23 * from this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
26 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
27 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
32 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38 #include <linux/mm.h>
39 #include <linux/delay.h>
40 #include <linux/errno.h>
41 #include <linux/string.h>
42 #include <linux/ratelimit.h>
43 #include <linux/printk.h>
44 #include <linux/slab.h>
45 #include <linux/sunrpc/clnt.h>
46 #include <linux/nfs.h>
47 #include <linux/nfs4.h>
48 #include <linux/nfs_fs.h>
49 #include <linux/nfs_page.h>
50 #include <linux/nfs_mount.h>
51 #include <linux/namei.h>
52 #include <linux/mount.h>
53 #include <linux/module.h>
54 #include <linux/xattr.h>
55 #include <linux/utsname.h>
56 #include <linux/freezer.h>
57
58 #include "nfs4_fs.h"
59 #include "delegation.h"
60 #include "internal.h"
61 #include "iostat.h"
62 #include "callback.h"
63 #include "pnfs.h"
64 #include "netns.h"
65 #include "nfs4idmap.h"
66 #include "nfs4session.h"
67 #include "fscache.h"
68
69 #include "nfs4trace.h"
70
71 #define NFSDBG_FACILITY NFSDBG_PROC
72
73 #define NFS4_POLL_RETRY_MIN (HZ/10)
74 #define NFS4_POLL_RETRY_MAX (15*HZ)
75
76 /* file attributes which can be mapped to nfs attributes */
77 #define NFS4_VALID_ATTRS (ATTR_MODE \
78 | ATTR_UID \
79 | ATTR_GID \
80 | ATTR_SIZE \
81 | ATTR_ATIME \
82 | ATTR_MTIME \
83 | ATTR_CTIME \
84 | ATTR_ATIME_SET \
85 | ATTR_MTIME_SET)
86
87 struct nfs4_opendata;
88 static int _nfs4_proc_open(struct nfs4_opendata *data);
89 static int _nfs4_recover_proc_open(struct nfs4_opendata *data);
90 static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
91 static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr);
92 static int nfs4_proc_getattr(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *, struct nfs4_label *label);
93 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr, struct nfs4_label *label);
94 static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
95 struct nfs_fattr *fattr, struct iattr *sattr,
96 struct nfs4_state *state, struct nfs4_label *ilabel,
97 struct nfs4_label *olabel);
98 #ifdef CONFIG_NFS_V4_1
99 static int nfs41_test_stateid(struct nfs_server *, nfs4_stateid *,
100 struct rpc_cred *);
101 static int nfs41_free_stateid(struct nfs_server *, const nfs4_stateid *,
102 struct rpc_cred *, bool);
103 #endif
104
105 #ifdef CONFIG_NFS_V4_SECURITY_LABEL
106 static inline struct nfs4_label *
nfs4_label_init_security(struct inode * dir,struct dentry * dentry,struct iattr * sattr,struct nfs4_label * label)107 nfs4_label_init_security(struct inode *dir, struct dentry *dentry,
108 struct iattr *sattr, struct nfs4_label *label)
109 {
110 int err;
111
112 if (label == NULL)
113 return NULL;
114
115 if (nfs_server_capable(dir, NFS_CAP_SECURITY_LABEL) == 0)
116 return NULL;
117
118 err = security_dentry_init_security(dentry, sattr->ia_mode,
119 &dentry->d_name, (void **)&label->label, &label->len);
120 if (err == 0)
121 return label;
122
123 return NULL;
124 }
125 static inline void
nfs4_label_release_security(struct nfs4_label * label)126 nfs4_label_release_security(struct nfs4_label *label)
127 {
128 if (label)
129 security_release_secctx(label->label, label->len);
130 }
nfs4_bitmask(struct nfs_server * server,struct nfs4_label * label)131 static inline u32 *nfs4_bitmask(struct nfs_server *server, struct nfs4_label *label)
132 {
133 if (label)
134 return server->attr_bitmask;
135
136 return server->attr_bitmask_nl;
137 }
138 #else
139 static inline struct nfs4_label *
nfs4_label_init_security(struct inode * dir,struct dentry * dentry,struct iattr * sattr,struct nfs4_label * l)140 nfs4_label_init_security(struct inode *dir, struct dentry *dentry,
141 struct iattr *sattr, struct nfs4_label *l)
142 { return NULL; }
143 static inline void
nfs4_label_release_security(struct nfs4_label * label)144 nfs4_label_release_security(struct nfs4_label *label)
145 { return; }
146 static inline u32 *
nfs4_bitmask(struct nfs_server * server,struct nfs4_label * label)147 nfs4_bitmask(struct nfs_server *server, struct nfs4_label *label)
148 { return server->attr_bitmask; }
149 #endif
150
151 /* Prevent leaks of NFSv4 errors into userland */
nfs4_map_errors(int err)152 static int nfs4_map_errors(int err)
153 {
154 if (err >= -1000)
155 return err;
156 switch (err) {
157 case -NFS4ERR_RESOURCE:
158 case -NFS4ERR_LAYOUTTRYLATER:
159 case -NFS4ERR_RECALLCONFLICT:
160 return -EREMOTEIO;
161 case -NFS4ERR_WRONGSEC:
162 case -NFS4ERR_WRONG_CRED:
163 return -EPERM;
164 case -NFS4ERR_BADOWNER:
165 case -NFS4ERR_BADNAME:
166 return -EINVAL;
167 case -NFS4ERR_SHARE_DENIED:
168 return -EACCES;
169 case -NFS4ERR_MINOR_VERS_MISMATCH:
170 return -EPROTONOSUPPORT;
171 case -NFS4ERR_FILE_OPEN:
172 return -EBUSY;
173 default:
174 dprintk("%s could not handle NFSv4 error %d\n",
175 __func__, -err);
176 break;
177 }
178 return -EIO;
179 }
180
181 /*
182 * This is our standard bitmap for GETATTR requests.
183 */
184 const u32 nfs4_fattr_bitmap[3] = {
185 FATTR4_WORD0_TYPE
186 | FATTR4_WORD0_CHANGE
187 | FATTR4_WORD0_SIZE
188 | FATTR4_WORD0_FSID
189 | FATTR4_WORD0_FILEID,
190 FATTR4_WORD1_MODE
191 | FATTR4_WORD1_NUMLINKS
192 | FATTR4_WORD1_OWNER
193 | FATTR4_WORD1_OWNER_GROUP
194 | FATTR4_WORD1_RAWDEV
195 | FATTR4_WORD1_SPACE_USED
196 | FATTR4_WORD1_TIME_ACCESS
197 | FATTR4_WORD1_TIME_METADATA
198 | FATTR4_WORD1_TIME_MODIFY
199 | FATTR4_WORD1_MOUNTED_ON_FILEID,
200 #ifdef CONFIG_NFS_V4_SECURITY_LABEL
201 FATTR4_WORD2_SECURITY_LABEL
202 #endif
203 };
204
205 static const u32 nfs4_pnfs_open_bitmap[3] = {
206 FATTR4_WORD0_TYPE
207 | FATTR4_WORD0_CHANGE
208 | FATTR4_WORD0_SIZE
209 | FATTR4_WORD0_FSID
210 | FATTR4_WORD0_FILEID,
211 FATTR4_WORD1_MODE
212 | FATTR4_WORD1_NUMLINKS
213 | FATTR4_WORD1_OWNER
214 | FATTR4_WORD1_OWNER_GROUP
215 | FATTR4_WORD1_RAWDEV
216 | FATTR4_WORD1_SPACE_USED
217 | FATTR4_WORD1_TIME_ACCESS
218 | FATTR4_WORD1_TIME_METADATA
219 | FATTR4_WORD1_TIME_MODIFY,
220 FATTR4_WORD2_MDSTHRESHOLD
221 #ifdef CONFIG_NFS_V4_SECURITY_LABEL
222 | FATTR4_WORD2_SECURITY_LABEL
223 #endif
224 };
225
226 static const u32 nfs4_open_noattr_bitmap[3] = {
227 FATTR4_WORD0_TYPE
228 | FATTR4_WORD0_CHANGE
229 | FATTR4_WORD0_FILEID,
230 };
231
232 const u32 nfs4_statfs_bitmap[3] = {
233 FATTR4_WORD0_FILES_AVAIL
234 | FATTR4_WORD0_FILES_FREE
235 | FATTR4_WORD0_FILES_TOTAL,
236 FATTR4_WORD1_SPACE_AVAIL
237 | FATTR4_WORD1_SPACE_FREE
238 | FATTR4_WORD1_SPACE_TOTAL
239 };
240
241 const u32 nfs4_pathconf_bitmap[3] = {
242 FATTR4_WORD0_MAXLINK
243 | FATTR4_WORD0_MAXNAME,
244 0
245 };
246
247 const u32 nfs4_fsinfo_bitmap[3] = { FATTR4_WORD0_MAXFILESIZE
248 | FATTR4_WORD0_MAXREAD
249 | FATTR4_WORD0_MAXWRITE
250 | FATTR4_WORD0_LEASE_TIME,
251 FATTR4_WORD1_TIME_DELTA
252 | FATTR4_WORD1_FS_LAYOUT_TYPES,
253 FATTR4_WORD2_LAYOUT_BLKSIZE
254 | FATTR4_WORD2_CLONE_BLKSIZE
255 };
256
257 const u32 nfs4_fs_locations_bitmap[3] = {
258 FATTR4_WORD0_CHANGE
259 | FATTR4_WORD0_SIZE
260 | FATTR4_WORD0_FSID
261 | FATTR4_WORD0_FILEID
262 | FATTR4_WORD0_FS_LOCATIONS,
263 FATTR4_WORD1_OWNER
264 | FATTR4_WORD1_OWNER_GROUP
265 | FATTR4_WORD1_RAWDEV
266 | FATTR4_WORD1_SPACE_USED
267 | FATTR4_WORD1_TIME_ACCESS
268 | FATTR4_WORD1_TIME_METADATA
269 | FATTR4_WORD1_TIME_MODIFY
270 | FATTR4_WORD1_MOUNTED_ON_FILEID,
271 };
272
nfs4_setup_readdir(u64 cookie,__be32 * verifier,struct dentry * dentry,struct nfs4_readdir_arg * readdir)273 static void nfs4_setup_readdir(u64 cookie, __be32 *verifier, struct dentry *dentry,
274 struct nfs4_readdir_arg *readdir)
275 {
276 __be32 *start, *p;
277
278 if (cookie > 2) {
279 readdir->cookie = cookie;
280 memcpy(&readdir->verifier, verifier, sizeof(readdir->verifier));
281 return;
282 }
283
284 readdir->cookie = 0;
285 memset(&readdir->verifier, 0, sizeof(readdir->verifier));
286 if (cookie == 2)
287 return;
288
289 /*
290 * NFSv4 servers do not return entries for '.' and '..'
291 * Therefore, we fake these entries here. We let '.'
292 * have cookie 0 and '..' have cookie 1. Note that
293 * when talking to the server, we always send cookie 0
294 * instead of 1 or 2.
295 */
296 start = p = kmap_atomic(*readdir->pages);
297
298 if (cookie == 0) {
299 *p++ = xdr_one; /* next */
300 *p++ = xdr_zero; /* cookie, first word */
301 *p++ = xdr_one; /* cookie, second word */
302 *p++ = xdr_one; /* entry len */
303 memcpy(p, ".\0\0\0", 4); /* entry */
304 p++;
305 *p++ = xdr_one; /* bitmap length */
306 *p++ = htonl(FATTR4_WORD0_FILEID); /* bitmap */
307 *p++ = htonl(8); /* attribute buffer length */
308 p = xdr_encode_hyper(p, NFS_FILEID(d_inode(dentry)));
309 }
310
311 *p++ = xdr_one; /* next */
312 *p++ = xdr_zero; /* cookie, first word */
313 *p++ = xdr_two; /* cookie, second word */
314 *p++ = xdr_two; /* entry len */
315 memcpy(p, "..\0\0", 4); /* entry */
316 p++;
317 *p++ = xdr_one; /* bitmap length */
318 *p++ = htonl(FATTR4_WORD0_FILEID); /* bitmap */
319 *p++ = htonl(8); /* attribute buffer length */
320 p = xdr_encode_hyper(p, NFS_FILEID(d_inode(dentry->d_parent)));
321
322 readdir->pgbase = (char *)p - (char *)start;
323 readdir->count -= readdir->pgbase;
324 kunmap_atomic(start);
325 }
326
nfs4_test_and_free_stateid(struct nfs_server * server,nfs4_stateid * stateid,struct rpc_cred * cred)327 static void nfs4_test_and_free_stateid(struct nfs_server *server,
328 nfs4_stateid *stateid,
329 struct rpc_cred *cred)
330 {
331 const struct nfs4_minor_version_ops *ops = server->nfs_client->cl_mvops;
332
333 ops->test_and_free_expired(server, stateid, cred);
334 }
335
__nfs4_free_revoked_stateid(struct nfs_server * server,nfs4_stateid * stateid,struct rpc_cred * cred)336 static void __nfs4_free_revoked_stateid(struct nfs_server *server,
337 nfs4_stateid *stateid,
338 struct rpc_cred *cred)
339 {
340 stateid->type = NFS4_REVOKED_STATEID_TYPE;
341 nfs4_test_and_free_stateid(server, stateid, cred);
342 }
343
nfs4_free_revoked_stateid(struct nfs_server * server,const nfs4_stateid * stateid,struct rpc_cred * cred)344 static void nfs4_free_revoked_stateid(struct nfs_server *server,
345 const nfs4_stateid *stateid,
346 struct rpc_cred *cred)
347 {
348 nfs4_stateid tmp;
349
350 nfs4_stateid_copy(&tmp, stateid);
351 __nfs4_free_revoked_stateid(server, &tmp, cred);
352 }
353
nfs4_update_delay(long * timeout)354 static long nfs4_update_delay(long *timeout)
355 {
356 long ret;
357 if (!timeout)
358 return NFS4_POLL_RETRY_MAX;
359 if (*timeout <= 0)
360 *timeout = NFS4_POLL_RETRY_MIN;
361 if (*timeout > NFS4_POLL_RETRY_MAX)
362 *timeout = NFS4_POLL_RETRY_MAX;
363 ret = *timeout;
364 *timeout <<= 1;
365 return ret;
366 }
367
nfs4_delay(struct rpc_clnt * clnt,long * timeout)368 static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
369 {
370 int res = 0;
371
372 might_sleep();
373
374 freezable_schedule_timeout_killable_unsafe(
375 nfs4_update_delay(timeout));
376 if (fatal_signal_pending(current))
377 res = -ERESTARTSYS;
378 return res;
379 }
380
381 /* This is the error handling routine for processes that are allowed
382 * to sleep.
383 */
nfs4_do_handle_exception(struct nfs_server * server,int errorcode,struct nfs4_exception * exception)384 static int nfs4_do_handle_exception(struct nfs_server *server,
385 int errorcode, struct nfs4_exception *exception)
386 {
387 struct nfs_client *clp = server->nfs_client;
388 struct nfs4_state *state = exception->state;
389 const nfs4_stateid *stateid = exception->stateid;
390 struct inode *inode = exception->inode;
391 int ret = errorcode;
392
393 exception->delay = 0;
394 exception->recovering = 0;
395 exception->retry = 0;
396
397 if (stateid == NULL && state != NULL)
398 stateid = &state->stateid;
399
400 switch(errorcode) {
401 case 0:
402 return 0;
403 case -NFS4ERR_DELEG_REVOKED:
404 case -NFS4ERR_ADMIN_REVOKED:
405 case -NFS4ERR_EXPIRED:
406 case -NFS4ERR_BAD_STATEID:
407 if (inode != NULL && stateid != NULL) {
408 nfs_inode_find_state_and_recover(inode,
409 stateid);
410 goto wait_on_recovery;
411 }
412 case -NFS4ERR_OPENMODE:
413 if (inode) {
414 int err;
415
416 err = nfs_async_inode_return_delegation(inode,
417 stateid);
418 if (err == 0)
419 goto wait_on_recovery;
420 if (stateid != NULL && stateid->type == NFS4_DELEGATION_STATEID_TYPE) {
421 exception->retry = 1;
422 break;
423 }
424 }
425 if (state == NULL)
426 break;
427 ret = nfs4_schedule_stateid_recovery(server, state);
428 if (ret < 0)
429 break;
430 goto wait_on_recovery;
431 case -NFS4ERR_STALE_STATEID:
432 case -NFS4ERR_STALE_CLIENTID:
433 nfs4_schedule_lease_recovery(clp);
434 goto wait_on_recovery;
435 case -NFS4ERR_MOVED:
436 ret = nfs4_schedule_migration_recovery(server);
437 if (ret < 0)
438 break;
439 goto wait_on_recovery;
440 case -NFS4ERR_LEASE_MOVED:
441 nfs4_schedule_lease_moved_recovery(clp);
442 goto wait_on_recovery;
443 #if defined(CONFIG_NFS_V4_1)
444 case -NFS4ERR_BADSESSION:
445 case -NFS4ERR_BADSLOT:
446 case -NFS4ERR_BAD_HIGH_SLOT:
447 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
448 case -NFS4ERR_DEADSESSION:
449 case -NFS4ERR_SEQ_FALSE_RETRY:
450 case -NFS4ERR_SEQ_MISORDERED:
451 dprintk("%s ERROR: %d Reset session\n", __func__,
452 errorcode);
453 nfs4_schedule_session_recovery(clp->cl_session, errorcode);
454 goto wait_on_recovery;
455 #endif /* defined(CONFIG_NFS_V4_1) */
456 case -NFS4ERR_FILE_OPEN:
457 if (exception->timeout > HZ) {
458 /* We have retried a decent amount, time to
459 * fail
460 */
461 ret = -EBUSY;
462 break;
463 }
464 case -NFS4ERR_DELAY:
465 nfs_inc_server_stats(server, NFSIOS_DELAY);
466 case -NFS4ERR_GRACE:
467 case -NFS4ERR_LAYOUTTRYLATER:
468 case -NFS4ERR_RECALLCONFLICT:
469 exception->delay = 1;
470 return 0;
471
472 case -NFS4ERR_RETRY_UNCACHED_REP:
473 case -NFS4ERR_OLD_STATEID:
474 exception->retry = 1;
475 break;
476 case -NFS4ERR_BADOWNER:
477 /* The following works around a Linux server bug! */
478 case -NFS4ERR_BADNAME:
479 if (server->caps & NFS_CAP_UIDGID_NOMAP) {
480 server->caps &= ~NFS_CAP_UIDGID_NOMAP;
481 exception->retry = 1;
482 printk(KERN_WARNING "NFS: v4 server %s "
483 "does not accept raw "
484 "uid/gids. "
485 "Reenabling the idmapper.\n",
486 server->nfs_client->cl_hostname);
487 }
488 }
489 /* We failed to handle the error */
490 return nfs4_map_errors(ret);
491 wait_on_recovery:
492 exception->recovering = 1;
493 return 0;
494 }
495
496 /* This is the error handling routine for processes that are allowed
497 * to sleep.
498 */
nfs4_handle_exception(struct nfs_server * server,int errorcode,struct nfs4_exception * exception)499 int nfs4_handle_exception(struct nfs_server *server, int errorcode, struct nfs4_exception *exception)
500 {
501 struct nfs_client *clp = server->nfs_client;
502 int ret;
503
504 ret = nfs4_do_handle_exception(server, errorcode, exception);
505 if (exception->delay) {
506 ret = nfs4_delay(server->client, &exception->timeout);
507 goto out_retry;
508 }
509 if (exception->recovering) {
510 ret = nfs4_wait_clnt_recover(clp);
511 if (test_bit(NFS_MIG_FAILED, &server->mig_status))
512 return -EIO;
513 goto out_retry;
514 }
515 return ret;
516 out_retry:
517 if (ret == 0)
518 exception->retry = 1;
519 return ret;
520 }
521
522 static int
nfs4_async_handle_exception(struct rpc_task * task,struct nfs_server * server,int errorcode,struct nfs4_exception * exception)523 nfs4_async_handle_exception(struct rpc_task *task, struct nfs_server *server,
524 int errorcode, struct nfs4_exception *exception)
525 {
526 struct nfs_client *clp = server->nfs_client;
527 int ret;
528
529 ret = nfs4_do_handle_exception(server, errorcode, exception);
530 if (exception->delay) {
531 rpc_delay(task, nfs4_update_delay(&exception->timeout));
532 goto out_retry;
533 }
534 if (exception->recovering) {
535 rpc_sleep_on(&clp->cl_rpcwaitq, task, NULL);
536 if (test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) == 0)
537 rpc_wake_up_queued_task(&clp->cl_rpcwaitq, task);
538 goto out_retry;
539 }
540 if (test_bit(NFS_MIG_FAILED, &server->mig_status))
541 ret = -EIO;
542 return ret;
543 out_retry:
544 if (ret == 0)
545 exception->retry = 1;
546 return ret;
547 }
548
549 static int
nfs4_async_handle_error(struct rpc_task * task,struct nfs_server * server,struct nfs4_state * state,long * timeout)550 nfs4_async_handle_error(struct rpc_task *task, struct nfs_server *server,
551 struct nfs4_state *state, long *timeout)
552 {
553 struct nfs4_exception exception = {
554 .state = state,
555 };
556
557 if (task->tk_status >= 0)
558 return 0;
559 if (timeout)
560 exception.timeout = *timeout;
561 task->tk_status = nfs4_async_handle_exception(task, server,
562 task->tk_status,
563 &exception);
564 if (exception.delay && timeout)
565 *timeout = exception.timeout;
566 if (exception.retry)
567 return -EAGAIN;
568 return 0;
569 }
570
571 /*
572 * Return 'true' if 'clp' is using an rpc_client that is integrity protected
573 * or 'false' otherwise.
574 */
_nfs4_is_integrity_protected(struct nfs_client * clp)575 static bool _nfs4_is_integrity_protected(struct nfs_client *clp)
576 {
577 rpc_authflavor_t flavor = clp->cl_rpcclient->cl_auth->au_flavor;
578
579 if (flavor == RPC_AUTH_GSS_KRB5I ||
580 flavor == RPC_AUTH_GSS_KRB5P)
581 return true;
582
583 return false;
584 }
585
do_renew_lease(struct nfs_client * clp,unsigned long timestamp)586 static void do_renew_lease(struct nfs_client *clp, unsigned long timestamp)
587 {
588 spin_lock(&clp->cl_lock);
589 if (time_before(clp->cl_last_renewal,timestamp))
590 clp->cl_last_renewal = timestamp;
591 spin_unlock(&clp->cl_lock);
592 }
593
renew_lease(const struct nfs_server * server,unsigned long timestamp)594 static void renew_lease(const struct nfs_server *server, unsigned long timestamp)
595 {
596 struct nfs_client *clp = server->nfs_client;
597
598 if (!nfs4_has_session(clp))
599 do_renew_lease(clp, timestamp);
600 }
601
602 struct nfs4_call_sync_data {
603 const struct nfs_server *seq_server;
604 struct nfs4_sequence_args *seq_args;
605 struct nfs4_sequence_res *seq_res;
606 };
607
nfs4_init_sequence(struct nfs4_sequence_args * args,struct nfs4_sequence_res * res,int cache_reply)608 void nfs4_init_sequence(struct nfs4_sequence_args *args,
609 struct nfs4_sequence_res *res, int cache_reply)
610 {
611 args->sa_slot = NULL;
612 args->sa_cache_this = cache_reply;
613 args->sa_privileged = 0;
614
615 res->sr_slot = NULL;
616 }
617
nfs4_set_sequence_privileged(struct nfs4_sequence_args * args)618 static void nfs4_set_sequence_privileged(struct nfs4_sequence_args *args)
619 {
620 args->sa_privileged = 1;
621 }
622
nfs40_setup_sequence(struct nfs4_slot_table * tbl,struct nfs4_sequence_args * args,struct nfs4_sequence_res * res,struct rpc_task * task)623 int nfs40_setup_sequence(struct nfs4_slot_table *tbl,
624 struct nfs4_sequence_args *args,
625 struct nfs4_sequence_res *res,
626 struct rpc_task *task)
627 {
628 struct nfs4_slot *slot;
629
630 /* slot already allocated? */
631 if (res->sr_slot != NULL)
632 goto out_start;
633
634 spin_lock(&tbl->slot_tbl_lock);
635 if (nfs4_slot_tbl_draining(tbl) && !args->sa_privileged)
636 goto out_sleep;
637
638 slot = nfs4_alloc_slot(tbl);
639 if (IS_ERR(slot)) {
640 if (slot == ERR_PTR(-ENOMEM))
641 task->tk_timeout = HZ >> 2;
642 goto out_sleep;
643 }
644 spin_unlock(&tbl->slot_tbl_lock);
645
646 slot->privileged = args->sa_privileged ? 1 : 0;
647 args->sa_slot = slot;
648 res->sr_slot = slot;
649
650 out_start:
651 rpc_call_start(task);
652 return 0;
653
654 out_sleep:
655 if (args->sa_privileged)
656 rpc_sleep_on_priority(&tbl->slot_tbl_waitq, task,
657 NULL, RPC_PRIORITY_PRIVILEGED);
658 else
659 rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL);
660 spin_unlock(&tbl->slot_tbl_lock);
661 return -EAGAIN;
662 }
663 EXPORT_SYMBOL_GPL(nfs40_setup_sequence);
664
nfs40_sequence_free_slot(struct nfs4_sequence_res * res)665 static void nfs40_sequence_free_slot(struct nfs4_sequence_res *res)
666 {
667 struct nfs4_slot *slot = res->sr_slot;
668 struct nfs4_slot_table *tbl;
669
670 tbl = slot->table;
671 spin_lock(&tbl->slot_tbl_lock);
672 if (!nfs41_wake_and_assign_slot(tbl, slot))
673 nfs4_free_slot(tbl, slot);
674 spin_unlock(&tbl->slot_tbl_lock);
675
676 res->sr_slot = NULL;
677 }
678
nfs40_sequence_done(struct rpc_task * task,struct nfs4_sequence_res * res)679 static int nfs40_sequence_done(struct rpc_task *task,
680 struct nfs4_sequence_res *res)
681 {
682 if (res->sr_slot != NULL)
683 nfs40_sequence_free_slot(res);
684 return 1;
685 }
686
687 #if defined(CONFIG_NFS_V4_1)
688
nfs41_sequence_free_slot(struct nfs4_sequence_res * res)689 static void nfs41_sequence_free_slot(struct nfs4_sequence_res *res)
690 {
691 struct nfs4_session *session;
692 struct nfs4_slot_table *tbl;
693 struct nfs4_slot *slot = res->sr_slot;
694 bool send_new_highest_used_slotid = false;
695
696 tbl = slot->table;
697 session = tbl->session;
698
699 /* Bump the slot sequence number */
700 if (slot->seq_done)
701 slot->seq_nr++;
702 slot->seq_done = 0;
703
704 spin_lock(&tbl->slot_tbl_lock);
705 /* Be nice to the server: try to ensure that the last transmitted
706 * value for highest_user_slotid <= target_highest_slotid
707 */
708 if (tbl->highest_used_slotid > tbl->target_highest_slotid)
709 send_new_highest_used_slotid = true;
710
711 if (nfs41_wake_and_assign_slot(tbl, slot)) {
712 send_new_highest_used_slotid = false;
713 goto out_unlock;
714 }
715 nfs4_free_slot(tbl, slot);
716
717 if (tbl->highest_used_slotid != NFS4_NO_SLOT)
718 send_new_highest_used_slotid = false;
719 out_unlock:
720 spin_unlock(&tbl->slot_tbl_lock);
721 res->sr_slot = NULL;
722 if (send_new_highest_used_slotid)
723 nfs41_notify_server(session->clp);
724 if (waitqueue_active(&tbl->slot_waitq))
725 wake_up_all(&tbl->slot_waitq);
726 }
727
nfs41_sequence_process(struct rpc_task * task,struct nfs4_sequence_res * res)728 static int nfs41_sequence_process(struct rpc_task *task,
729 struct nfs4_sequence_res *res)
730 {
731 struct nfs4_session *session;
732 struct nfs4_slot *slot = res->sr_slot;
733 struct nfs_client *clp;
734 bool interrupted = false;
735 int ret = 1;
736
737 if (slot == NULL)
738 goto out_noaction;
739 /* don't increment the sequence number if the task wasn't sent */
740 if (!RPC_WAS_SENT(task))
741 goto out;
742
743 session = slot->table->session;
744
745 if (slot->interrupted) {
746 slot->interrupted = 0;
747 interrupted = true;
748 }
749
750 trace_nfs4_sequence_done(session, res);
751 /* Check the SEQUENCE operation status */
752 switch (res->sr_status) {
753 case 0:
754 /* If previous op on slot was interrupted and we reused
755 * the seq# and got a reply from the cache, then retry
756 */
757 if (task->tk_status == -EREMOTEIO && interrupted) {
758 ++slot->seq_nr;
759 goto retry_nowait;
760 }
761 /* Update the slot's sequence and clientid lease timer */
762 slot->seq_done = 1;
763 clp = session->clp;
764 do_renew_lease(clp, res->sr_timestamp);
765 /* Check sequence flags */
766 nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags,
767 !!slot->privileged);
768 nfs41_update_target_slotid(slot->table, slot, res);
769 break;
770 case 1:
771 /*
772 * sr_status remains 1 if an RPC level error occurred.
773 * The server may or may not have processed the sequence
774 * operation..
775 * Mark the slot as having hosted an interrupted RPC call.
776 */
777 slot->interrupted = 1;
778 goto out;
779 case -NFS4ERR_DELAY:
780 /* The server detected a resend of the RPC call and
781 * returned NFS4ERR_DELAY as per Section 2.10.6.2
782 * of RFC5661.
783 */
784 dprintk("%s: slot=%u seq=%u: Operation in progress\n",
785 __func__,
786 slot->slot_nr,
787 slot->seq_nr);
788 goto out_retry;
789 case -NFS4ERR_BADSLOT:
790 /*
791 * The slot id we used was probably retired. Try again
792 * using a different slot id.
793 */
794 goto retry_nowait;
795 case -NFS4ERR_SEQ_MISORDERED:
796 /*
797 * Was the last operation on this sequence interrupted?
798 * If so, retry after bumping the sequence number.
799 */
800 if (interrupted) {
801 ++slot->seq_nr;
802 goto retry_nowait;
803 }
804 /*
805 * Could this slot have been previously retired?
806 * If so, then the server may be expecting seq_nr = 1!
807 */
808 if (slot->seq_nr != 1) {
809 slot->seq_nr = 1;
810 goto retry_nowait;
811 }
812 break;
813 case -NFS4ERR_SEQ_FALSE_RETRY:
814 ++slot->seq_nr;
815 goto retry_nowait;
816 default:
817 /* Just update the slot sequence no. */
818 slot->seq_done = 1;
819 }
820 out:
821 /* The session may be reset by one of the error handlers. */
822 dprintk("%s: Error %d free the slot \n", __func__, res->sr_status);
823 out_noaction:
824 return ret;
825 retry_nowait:
826 if (rpc_restart_call_prepare(task)) {
827 nfs41_sequence_free_slot(res);
828 task->tk_status = 0;
829 ret = 0;
830 }
831 goto out;
832 out_retry:
833 if (!rpc_restart_call(task))
834 goto out;
835 rpc_delay(task, NFS4_POLL_RETRY_MAX);
836 return 0;
837 }
838
nfs41_sequence_done(struct rpc_task * task,struct nfs4_sequence_res * res)839 int nfs41_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *res)
840 {
841 if (!nfs41_sequence_process(task, res))
842 return 0;
843 if (res->sr_slot != NULL)
844 nfs41_sequence_free_slot(res);
845 return 1;
846
847 }
848 EXPORT_SYMBOL_GPL(nfs41_sequence_done);
849
nfs4_sequence_process(struct rpc_task * task,struct nfs4_sequence_res * res)850 static int nfs4_sequence_process(struct rpc_task *task, struct nfs4_sequence_res *res)
851 {
852 if (res->sr_slot == NULL)
853 return 1;
854 if (res->sr_slot->table->session != NULL)
855 return nfs41_sequence_process(task, res);
856 return nfs40_sequence_done(task, res);
857 }
858
nfs4_sequence_free_slot(struct nfs4_sequence_res * res)859 static void nfs4_sequence_free_slot(struct nfs4_sequence_res *res)
860 {
861 if (res->sr_slot != NULL) {
862 if (res->sr_slot->table->session != NULL)
863 nfs41_sequence_free_slot(res);
864 else
865 nfs40_sequence_free_slot(res);
866 }
867 }
868
nfs4_sequence_done(struct rpc_task * task,struct nfs4_sequence_res * res)869 int nfs4_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *res)
870 {
871 if (res->sr_slot == NULL)
872 return 1;
873 if (!res->sr_slot->table->session)
874 return nfs40_sequence_done(task, res);
875 return nfs41_sequence_done(task, res);
876 }
877 EXPORT_SYMBOL_GPL(nfs4_sequence_done);
878
nfs41_setup_sequence(struct nfs4_session * session,struct nfs4_sequence_args * args,struct nfs4_sequence_res * res,struct rpc_task * task)879 int nfs41_setup_sequence(struct nfs4_session *session,
880 struct nfs4_sequence_args *args,
881 struct nfs4_sequence_res *res,
882 struct rpc_task *task)
883 {
884 struct nfs4_slot *slot;
885 struct nfs4_slot_table *tbl;
886
887 dprintk("--> %s\n", __func__);
888 /* slot already allocated? */
889 if (res->sr_slot != NULL)
890 goto out_success;
891
892 tbl = &session->fc_slot_table;
893
894 task->tk_timeout = 0;
895
896 spin_lock(&tbl->slot_tbl_lock);
897 if (test_bit(NFS4_SLOT_TBL_DRAINING, &tbl->slot_tbl_state) &&
898 !args->sa_privileged) {
899 /* The state manager will wait until the slot table is empty */
900 dprintk("%s session is draining\n", __func__);
901 goto out_sleep;
902 }
903
904 slot = nfs4_alloc_slot(tbl);
905 if (IS_ERR(slot)) {
906 /* If out of memory, try again in 1/4 second */
907 if (slot == ERR_PTR(-ENOMEM))
908 task->tk_timeout = HZ >> 2;
909 dprintk("<-- %s: no free slots\n", __func__);
910 goto out_sleep;
911 }
912 spin_unlock(&tbl->slot_tbl_lock);
913
914 slot->privileged = args->sa_privileged ? 1 : 0;
915 args->sa_slot = slot;
916
917 dprintk("<-- %s slotid=%u seqid=%u\n", __func__,
918 slot->slot_nr, slot->seq_nr);
919
920 res->sr_slot = slot;
921 res->sr_timestamp = jiffies;
922 res->sr_status_flags = 0;
923 /*
924 * sr_status is only set in decode_sequence, and so will remain
925 * set to 1 if an rpc level failure occurs.
926 */
927 res->sr_status = 1;
928 trace_nfs4_setup_sequence(session, args);
929 out_success:
930 rpc_call_start(task);
931 return 0;
932 out_sleep:
933 /* Privileged tasks are queued with top priority */
934 if (args->sa_privileged)
935 rpc_sleep_on_priority(&tbl->slot_tbl_waitq, task,
936 NULL, RPC_PRIORITY_PRIVILEGED);
937 else
938 rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL);
939 spin_unlock(&tbl->slot_tbl_lock);
940 return -EAGAIN;
941 }
942 EXPORT_SYMBOL_GPL(nfs41_setup_sequence);
943
nfs4_setup_sequence(const struct nfs_server * server,struct nfs4_sequence_args * args,struct nfs4_sequence_res * res,struct rpc_task * task)944 static int nfs4_setup_sequence(const struct nfs_server *server,
945 struct nfs4_sequence_args *args,
946 struct nfs4_sequence_res *res,
947 struct rpc_task *task)
948 {
949 struct nfs4_session *session = nfs4_get_session(server);
950 int ret = 0;
951
952 if (!session)
953 return nfs40_setup_sequence(server->nfs_client->cl_slot_tbl,
954 args, res, task);
955
956 dprintk("--> %s clp %p session %p sr_slot %u\n",
957 __func__, session->clp, session, res->sr_slot ?
958 res->sr_slot->slot_nr : NFS4_NO_SLOT);
959
960 ret = nfs41_setup_sequence(session, args, res, task);
961
962 dprintk("<-- %s status=%d\n", __func__, ret);
963 return ret;
964 }
965
nfs41_call_sync_prepare(struct rpc_task * task,void * calldata)966 static void nfs41_call_sync_prepare(struct rpc_task *task, void *calldata)
967 {
968 struct nfs4_call_sync_data *data = calldata;
969 struct nfs4_session *session = nfs4_get_session(data->seq_server);
970
971 dprintk("--> %s data->seq_server %p\n", __func__, data->seq_server);
972
973 nfs41_setup_sequence(session, data->seq_args, data->seq_res, task);
974 }
975
nfs41_call_sync_done(struct rpc_task * task,void * calldata)976 static void nfs41_call_sync_done(struct rpc_task *task, void *calldata)
977 {
978 struct nfs4_call_sync_data *data = calldata;
979
980 nfs41_sequence_done(task, data->seq_res);
981 }
982
983 static const struct rpc_call_ops nfs41_call_sync_ops = {
984 .rpc_call_prepare = nfs41_call_sync_prepare,
985 .rpc_call_done = nfs41_call_sync_done,
986 };
987
988 #else /* !CONFIG_NFS_V4_1 */
989
nfs4_setup_sequence(const struct nfs_server * server,struct nfs4_sequence_args * args,struct nfs4_sequence_res * res,struct rpc_task * task)990 static int nfs4_setup_sequence(const struct nfs_server *server,
991 struct nfs4_sequence_args *args,
992 struct nfs4_sequence_res *res,
993 struct rpc_task *task)
994 {
995 return nfs40_setup_sequence(server->nfs_client->cl_slot_tbl,
996 args, res, task);
997 }
998
nfs4_sequence_process(struct rpc_task * task,struct nfs4_sequence_res * res)999 static int nfs4_sequence_process(struct rpc_task *task, struct nfs4_sequence_res *res)
1000 {
1001 return nfs40_sequence_done(task, res);
1002 }
1003
nfs4_sequence_free_slot(struct nfs4_sequence_res * res)1004 static void nfs4_sequence_free_slot(struct nfs4_sequence_res *res)
1005 {
1006 if (res->sr_slot != NULL)
1007 nfs40_sequence_free_slot(res);
1008 }
1009
nfs4_sequence_done(struct rpc_task * task,struct nfs4_sequence_res * res)1010 int nfs4_sequence_done(struct rpc_task *task,
1011 struct nfs4_sequence_res *res)
1012 {
1013 return nfs40_sequence_done(task, res);
1014 }
1015 EXPORT_SYMBOL_GPL(nfs4_sequence_done);
1016
1017 #endif /* !CONFIG_NFS_V4_1 */
1018
nfs40_call_sync_prepare(struct rpc_task * task,void * calldata)1019 static void nfs40_call_sync_prepare(struct rpc_task *task, void *calldata)
1020 {
1021 struct nfs4_call_sync_data *data = calldata;
1022 nfs4_setup_sequence(data->seq_server,
1023 data->seq_args, data->seq_res, task);
1024 }
1025
nfs40_call_sync_done(struct rpc_task * task,void * calldata)1026 static void nfs40_call_sync_done(struct rpc_task *task, void *calldata)
1027 {
1028 struct nfs4_call_sync_data *data = calldata;
1029 nfs4_sequence_done(task, data->seq_res);
1030 }
1031
1032 static const struct rpc_call_ops nfs40_call_sync_ops = {
1033 .rpc_call_prepare = nfs40_call_sync_prepare,
1034 .rpc_call_done = nfs40_call_sync_done,
1035 };
1036
nfs4_call_sync_sequence(struct rpc_clnt * clnt,struct nfs_server * server,struct rpc_message * msg,struct nfs4_sequence_args * args,struct nfs4_sequence_res * res)1037 static int nfs4_call_sync_sequence(struct rpc_clnt *clnt,
1038 struct nfs_server *server,
1039 struct rpc_message *msg,
1040 struct nfs4_sequence_args *args,
1041 struct nfs4_sequence_res *res)
1042 {
1043 int ret;
1044 struct rpc_task *task;
1045 struct nfs_client *clp = server->nfs_client;
1046 struct nfs4_call_sync_data data = {
1047 .seq_server = server,
1048 .seq_args = args,
1049 .seq_res = res,
1050 };
1051 struct rpc_task_setup task_setup = {
1052 .rpc_client = clnt,
1053 .rpc_message = msg,
1054 .callback_ops = clp->cl_mvops->call_sync_ops,
1055 .callback_data = &data
1056 };
1057
1058 task = rpc_run_task(&task_setup);
1059 if (IS_ERR(task))
1060 ret = PTR_ERR(task);
1061 else {
1062 ret = task->tk_status;
1063 rpc_put_task(task);
1064 }
1065 return ret;
1066 }
1067
nfs4_call_sync(struct rpc_clnt * clnt,struct nfs_server * server,struct rpc_message * msg,struct nfs4_sequence_args * args,struct nfs4_sequence_res * res,int cache_reply)1068 int nfs4_call_sync(struct rpc_clnt *clnt,
1069 struct nfs_server *server,
1070 struct rpc_message *msg,
1071 struct nfs4_sequence_args *args,
1072 struct nfs4_sequence_res *res,
1073 int cache_reply)
1074 {
1075 nfs4_init_sequence(args, res, cache_reply);
1076 return nfs4_call_sync_sequence(clnt, server, msg, args, res);
1077 }
1078
update_changeattr(struct inode * dir,struct nfs4_change_info * cinfo)1079 static void update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo)
1080 {
1081 struct nfs_inode *nfsi = NFS_I(dir);
1082
1083 spin_lock(&dir->i_lock);
1084 nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA;
1085 if (!cinfo->atomic || cinfo->before != dir->i_version)
1086 nfs_force_lookup_revalidate(dir);
1087 dir->i_version = cinfo->after;
1088 nfsi->attr_gencount = nfs_inc_attr_generation_counter();
1089 nfs_fscache_invalidate(dir);
1090 spin_unlock(&dir->i_lock);
1091 }
1092
1093 struct nfs4_opendata {
1094 struct kref kref;
1095 struct nfs_openargs o_arg;
1096 struct nfs_openres o_res;
1097 struct nfs_open_confirmargs c_arg;
1098 struct nfs_open_confirmres c_res;
1099 struct nfs4_string owner_name;
1100 struct nfs4_string group_name;
1101 struct nfs4_label *a_label;
1102 struct nfs_fattr f_attr;
1103 struct nfs4_label *f_label;
1104 struct dentry *dir;
1105 struct dentry *dentry;
1106 struct nfs4_state_owner *owner;
1107 struct nfs4_state *state;
1108 struct iattr attrs;
1109 unsigned long timestamp;
1110 unsigned int rpc_done : 1;
1111 unsigned int file_created : 1;
1112 unsigned int is_recover : 1;
1113 int rpc_status;
1114 int cancelled;
1115 };
1116
nfs4_clear_cap_atomic_open_v1(struct nfs_server * server,int err,struct nfs4_exception * exception)1117 static bool nfs4_clear_cap_atomic_open_v1(struct nfs_server *server,
1118 int err, struct nfs4_exception *exception)
1119 {
1120 if (err != -EINVAL)
1121 return false;
1122 if (!(server->caps & NFS_CAP_ATOMIC_OPEN_V1))
1123 return false;
1124 server->caps &= ~NFS_CAP_ATOMIC_OPEN_V1;
1125 exception->retry = 1;
1126 return true;
1127 }
1128
1129 static u32
nfs4_map_atomic_open_share(struct nfs_server * server,fmode_t fmode,int openflags)1130 nfs4_map_atomic_open_share(struct nfs_server *server,
1131 fmode_t fmode, int openflags)
1132 {
1133 u32 res = 0;
1134
1135 switch (fmode & (FMODE_READ | FMODE_WRITE)) {
1136 case FMODE_READ:
1137 res = NFS4_SHARE_ACCESS_READ;
1138 break;
1139 case FMODE_WRITE:
1140 res = NFS4_SHARE_ACCESS_WRITE;
1141 break;
1142 case FMODE_READ|FMODE_WRITE:
1143 res = NFS4_SHARE_ACCESS_BOTH;
1144 }
1145 if (!(server->caps & NFS_CAP_ATOMIC_OPEN_V1))
1146 goto out;
1147 /* Want no delegation if we're using O_DIRECT */
1148 if (openflags & O_DIRECT)
1149 res |= NFS4_SHARE_WANT_NO_DELEG;
1150 out:
1151 return res;
1152 }
1153
1154 static enum open_claim_type4
nfs4_map_atomic_open_claim(struct nfs_server * server,enum open_claim_type4 claim)1155 nfs4_map_atomic_open_claim(struct nfs_server *server,
1156 enum open_claim_type4 claim)
1157 {
1158 if (server->caps & NFS_CAP_ATOMIC_OPEN_V1)
1159 return claim;
1160 switch (claim) {
1161 default:
1162 return claim;
1163 case NFS4_OPEN_CLAIM_FH:
1164 return NFS4_OPEN_CLAIM_NULL;
1165 case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
1166 return NFS4_OPEN_CLAIM_DELEGATE_CUR;
1167 case NFS4_OPEN_CLAIM_DELEG_PREV_FH:
1168 return NFS4_OPEN_CLAIM_DELEGATE_PREV;
1169 }
1170 }
1171
nfs4_init_opendata_res(struct nfs4_opendata * p)1172 static void nfs4_init_opendata_res(struct nfs4_opendata *p)
1173 {
1174 p->o_res.f_attr = &p->f_attr;
1175 p->o_res.f_label = p->f_label;
1176 p->o_res.seqid = p->o_arg.seqid;
1177 p->c_res.seqid = p->c_arg.seqid;
1178 p->o_res.server = p->o_arg.server;
1179 p->o_res.access_request = p->o_arg.access;
1180 nfs_fattr_init(&p->f_attr);
1181 nfs_fattr_init_names(&p->f_attr, &p->owner_name, &p->group_name);
1182 }
1183
nfs4_opendata_alloc(struct dentry * dentry,struct nfs4_state_owner * sp,fmode_t fmode,int flags,const struct iattr * attrs,struct nfs4_label * label,enum open_claim_type4 claim,gfp_t gfp_mask)1184 static struct nfs4_opendata *nfs4_opendata_alloc(struct dentry *dentry,
1185 struct nfs4_state_owner *sp, fmode_t fmode, int flags,
1186 const struct iattr *attrs,
1187 struct nfs4_label *label,
1188 enum open_claim_type4 claim,
1189 gfp_t gfp_mask)
1190 {
1191 struct dentry *parent = dget_parent(dentry);
1192 struct inode *dir = d_inode(parent);
1193 struct nfs_server *server = NFS_SERVER(dir);
1194 struct nfs_seqid *(*alloc_seqid)(struct nfs_seqid_counter *, gfp_t);
1195 struct nfs4_opendata *p;
1196
1197 p = kzalloc(sizeof(*p), gfp_mask);
1198 if (p == NULL)
1199 goto err;
1200
1201 p->f_label = nfs4_label_alloc(server, gfp_mask);
1202 if (IS_ERR(p->f_label))
1203 goto err_free_p;
1204
1205 p->a_label = nfs4_label_alloc(server, gfp_mask);
1206 if (IS_ERR(p->a_label))
1207 goto err_free_f;
1208
1209 alloc_seqid = server->nfs_client->cl_mvops->alloc_seqid;
1210 p->o_arg.seqid = alloc_seqid(&sp->so_seqid, gfp_mask);
1211 if (IS_ERR(p->o_arg.seqid))
1212 goto err_free_label;
1213 nfs_sb_active(dentry->d_sb);
1214 p->dentry = dget(dentry);
1215 p->dir = parent;
1216 p->owner = sp;
1217 atomic_inc(&sp->so_count);
1218 p->o_arg.open_flags = flags;
1219 p->o_arg.fmode = fmode & (FMODE_READ|FMODE_WRITE);
1220 p->o_arg.share_access = nfs4_map_atomic_open_share(server,
1221 fmode, flags);
1222 /* don't put an ACCESS op in OPEN compound if O_EXCL, because ACCESS
1223 * will return permission denied for all bits until close */
1224 if (!(flags & O_EXCL)) {
1225 /* ask server to check for all possible rights as results
1226 * are cached */
1227 p->o_arg.access = NFS4_ACCESS_READ | NFS4_ACCESS_MODIFY |
1228 NFS4_ACCESS_EXTEND | NFS4_ACCESS_EXECUTE;
1229 }
1230 p->o_arg.clientid = server->nfs_client->cl_clientid;
1231 p->o_arg.id.create_time = ktime_to_ns(sp->so_seqid.create_time);
1232 p->o_arg.id.uniquifier = sp->so_seqid.owner_id;
1233 p->o_arg.name = &dentry->d_name;
1234 p->o_arg.server = server;
1235 p->o_arg.bitmask = nfs4_bitmask(server, label);
1236 p->o_arg.open_bitmap = &nfs4_fattr_bitmap[0];
1237 p->o_arg.label = nfs4_label_copy(p->a_label, label);
1238 p->o_arg.claim = nfs4_map_atomic_open_claim(server, claim);
1239 switch (p->o_arg.claim) {
1240 case NFS4_OPEN_CLAIM_NULL:
1241 case NFS4_OPEN_CLAIM_DELEGATE_CUR:
1242 case NFS4_OPEN_CLAIM_DELEGATE_PREV:
1243 p->o_arg.fh = NFS_FH(dir);
1244 break;
1245 case NFS4_OPEN_CLAIM_PREVIOUS:
1246 case NFS4_OPEN_CLAIM_FH:
1247 case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
1248 case NFS4_OPEN_CLAIM_DELEG_PREV_FH:
1249 p->o_arg.fh = NFS_FH(d_inode(dentry));
1250 }
1251 if (attrs != NULL && attrs->ia_valid != 0) {
1252 __u32 verf[2];
1253
1254 p->o_arg.u.attrs = &p->attrs;
1255 memcpy(&p->attrs, attrs, sizeof(p->attrs));
1256
1257 verf[0] = jiffies;
1258 verf[1] = current->pid;
1259 memcpy(p->o_arg.u.verifier.data, verf,
1260 sizeof(p->o_arg.u.verifier.data));
1261 }
1262 p->c_arg.fh = &p->o_res.fh;
1263 p->c_arg.stateid = &p->o_res.stateid;
1264 p->c_arg.seqid = p->o_arg.seqid;
1265 nfs4_init_opendata_res(p);
1266 kref_init(&p->kref);
1267 return p;
1268
1269 err_free_label:
1270 nfs4_label_free(p->a_label);
1271 err_free_f:
1272 nfs4_label_free(p->f_label);
1273 err_free_p:
1274 kfree(p);
1275 err:
1276 dput(parent);
1277 return NULL;
1278 }
1279
nfs4_opendata_free(struct kref * kref)1280 static void nfs4_opendata_free(struct kref *kref)
1281 {
1282 struct nfs4_opendata *p = container_of(kref,
1283 struct nfs4_opendata, kref);
1284 struct super_block *sb = p->dentry->d_sb;
1285
1286 nfs_free_seqid(p->o_arg.seqid);
1287 nfs4_sequence_free_slot(&p->o_res.seq_res);
1288 if (p->state != NULL)
1289 nfs4_put_open_state(p->state);
1290 nfs4_put_state_owner(p->owner);
1291
1292 nfs4_label_free(p->a_label);
1293 nfs4_label_free(p->f_label);
1294
1295 dput(p->dir);
1296 dput(p->dentry);
1297 nfs_sb_deactive(sb);
1298 nfs_fattr_free_names(&p->f_attr);
1299 kfree(p->f_attr.mdsthreshold);
1300 kfree(p);
1301 }
1302
nfs4_opendata_put(struct nfs4_opendata * p)1303 static void nfs4_opendata_put(struct nfs4_opendata *p)
1304 {
1305 if (p != NULL)
1306 kref_put(&p->kref, nfs4_opendata_free);
1307 }
1308
nfs4_wait_for_completion_rpc_task(struct rpc_task * task)1309 static int nfs4_wait_for_completion_rpc_task(struct rpc_task *task)
1310 {
1311 int ret;
1312
1313 ret = rpc_wait_for_completion_task(task);
1314 return ret;
1315 }
1316
nfs4_mode_match_open_stateid(struct nfs4_state * state,fmode_t fmode)1317 static bool nfs4_mode_match_open_stateid(struct nfs4_state *state,
1318 fmode_t fmode)
1319 {
1320 switch(fmode & (FMODE_READ|FMODE_WRITE)) {
1321 case FMODE_READ|FMODE_WRITE:
1322 return state->n_rdwr != 0;
1323 case FMODE_WRITE:
1324 return state->n_wronly != 0;
1325 case FMODE_READ:
1326 return state->n_rdonly != 0;
1327 }
1328 WARN_ON_ONCE(1);
1329 return false;
1330 }
1331
can_open_cached(struct nfs4_state * state,fmode_t mode,int open_mode)1332 static int can_open_cached(struct nfs4_state *state, fmode_t mode, int open_mode)
1333 {
1334 int ret = 0;
1335
1336 if (open_mode & (O_EXCL|O_TRUNC))
1337 goto out;
1338 switch (mode & (FMODE_READ|FMODE_WRITE)) {
1339 case FMODE_READ:
1340 ret |= test_bit(NFS_O_RDONLY_STATE, &state->flags) != 0
1341 && state->n_rdonly != 0;
1342 break;
1343 case FMODE_WRITE:
1344 ret |= test_bit(NFS_O_WRONLY_STATE, &state->flags) != 0
1345 && state->n_wronly != 0;
1346 break;
1347 case FMODE_READ|FMODE_WRITE:
1348 ret |= test_bit(NFS_O_RDWR_STATE, &state->flags) != 0
1349 && state->n_rdwr != 0;
1350 }
1351 out:
1352 return ret;
1353 }
1354
can_open_delegated(struct nfs_delegation * delegation,fmode_t fmode,enum open_claim_type4 claim)1355 static int can_open_delegated(struct nfs_delegation *delegation, fmode_t fmode,
1356 enum open_claim_type4 claim)
1357 {
1358 if (delegation == NULL)
1359 return 0;
1360 if ((delegation->type & fmode) != fmode)
1361 return 0;
1362 if (test_bit(NFS_DELEGATION_RETURNING, &delegation->flags))
1363 return 0;
1364 switch (claim) {
1365 case NFS4_OPEN_CLAIM_NULL:
1366 case NFS4_OPEN_CLAIM_FH:
1367 break;
1368 case NFS4_OPEN_CLAIM_PREVIOUS:
1369 if (!test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags))
1370 break;
1371 default:
1372 return 0;
1373 }
1374 nfs_mark_delegation_referenced(delegation);
1375 return 1;
1376 }
1377
update_open_stateflags(struct nfs4_state * state,fmode_t fmode)1378 static void update_open_stateflags(struct nfs4_state *state, fmode_t fmode)
1379 {
1380 switch (fmode) {
1381 case FMODE_WRITE:
1382 state->n_wronly++;
1383 break;
1384 case FMODE_READ:
1385 state->n_rdonly++;
1386 break;
1387 case FMODE_READ|FMODE_WRITE:
1388 state->n_rdwr++;
1389 }
1390 nfs4_state_set_mode_locked(state, state->state | fmode);
1391 }
1392
1393 #ifdef CONFIG_NFS_V4_1
nfs_open_stateid_recover_openmode(struct nfs4_state * state)1394 static bool nfs_open_stateid_recover_openmode(struct nfs4_state *state)
1395 {
1396 if (state->n_rdonly && !test_bit(NFS_O_RDONLY_STATE, &state->flags))
1397 return true;
1398 if (state->n_wronly && !test_bit(NFS_O_WRONLY_STATE, &state->flags))
1399 return true;
1400 if (state->n_rdwr && !test_bit(NFS_O_RDWR_STATE, &state->flags))
1401 return true;
1402 return false;
1403 }
1404 #endif /* CONFIG_NFS_V4_1 */
1405
nfs_test_and_clear_all_open_stateid(struct nfs4_state * state)1406 static void nfs_test_and_clear_all_open_stateid(struct nfs4_state *state)
1407 {
1408 struct nfs_client *clp = state->owner->so_server->nfs_client;
1409 bool need_recover = false;
1410
1411 if (test_and_clear_bit(NFS_O_RDONLY_STATE, &state->flags) && state->n_rdonly)
1412 need_recover = true;
1413 if (test_and_clear_bit(NFS_O_WRONLY_STATE, &state->flags) && state->n_wronly)
1414 need_recover = true;
1415 if (test_and_clear_bit(NFS_O_RDWR_STATE, &state->flags) && state->n_rdwr)
1416 need_recover = true;
1417 if (need_recover)
1418 nfs4_state_mark_reclaim_nograce(clp, state);
1419 }
1420
nfs_need_update_open_stateid(struct nfs4_state * state,const nfs4_stateid * stateid,nfs4_stateid * freeme)1421 static bool nfs_need_update_open_stateid(struct nfs4_state *state,
1422 const nfs4_stateid *stateid, nfs4_stateid *freeme)
1423 {
1424 if (test_and_set_bit(NFS_OPEN_STATE, &state->flags) == 0)
1425 return true;
1426 if (!nfs4_stateid_match_other(stateid, &state->open_stateid)) {
1427 nfs4_stateid_copy(freeme, &state->open_stateid);
1428 nfs_test_and_clear_all_open_stateid(state);
1429 return true;
1430 }
1431 if (nfs4_stateid_is_newer(stateid, &state->open_stateid))
1432 return true;
1433 return false;
1434 }
1435
nfs_resync_open_stateid_locked(struct nfs4_state * state)1436 static void nfs_resync_open_stateid_locked(struct nfs4_state *state)
1437 {
1438 if (!(state->n_wronly || state->n_rdonly || state->n_rdwr))
1439 return;
1440 if (state->n_wronly)
1441 set_bit(NFS_O_WRONLY_STATE, &state->flags);
1442 if (state->n_rdonly)
1443 set_bit(NFS_O_RDONLY_STATE, &state->flags);
1444 if (state->n_rdwr)
1445 set_bit(NFS_O_RDWR_STATE, &state->flags);
1446 set_bit(NFS_OPEN_STATE, &state->flags);
1447 }
1448
nfs_clear_open_stateid_locked(struct nfs4_state * state,nfs4_stateid * stateid,fmode_t fmode)1449 static void nfs_clear_open_stateid_locked(struct nfs4_state *state,
1450 nfs4_stateid *stateid, fmode_t fmode)
1451 {
1452 clear_bit(NFS_O_RDWR_STATE, &state->flags);
1453 switch (fmode & (FMODE_READ|FMODE_WRITE)) {
1454 case FMODE_WRITE:
1455 clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1456 break;
1457 case FMODE_READ:
1458 clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1459 break;
1460 case 0:
1461 clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1462 clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1463 clear_bit(NFS_OPEN_STATE, &state->flags);
1464 }
1465 if (stateid == NULL)
1466 return;
1467 /* Handle OPEN+OPEN_DOWNGRADE races */
1468 if (nfs4_stateid_match_other(stateid, &state->open_stateid) &&
1469 !nfs4_stateid_is_newer(stateid, &state->open_stateid)) {
1470 nfs_resync_open_stateid_locked(state);
1471 return;
1472 }
1473 if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0)
1474 nfs4_stateid_copy(&state->stateid, stateid);
1475 nfs4_stateid_copy(&state->open_stateid, stateid);
1476 }
1477
nfs_clear_open_stateid(struct nfs4_state * state,nfs4_stateid * arg_stateid,nfs4_stateid * stateid,fmode_t fmode)1478 static void nfs_clear_open_stateid(struct nfs4_state *state,
1479 nfs4_stateid *arg_stateid,
1480 nfs4_stateid *stateid, fmode_t fmode)
1481 {
1482 write_seqlock(&state->seqlock);
1483 /* Ignore, if the CLOSE argment doesn't match the current stateid */
1484 if (nfs4_state_match_open_stateid_other(state, arg_stateid))
1485 nfs_clear_open_stateid_locked(state, stateid, fmode);
1486 write_sequnlock(&state->seqlock);
1487 if (test_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags))
1488 nfs4_schedule_state_manager(state->owner->so_server->nfs_client);
1489 }
1490
nfs_set_open_stateid_locked(struct nfs4_state * state,const nfs4_stateid * stateid,fmode_t fmode,nfs4_stateid * freeme)1491 static void nfs_set_open_stateid_locked(struct nfs4_state *state,
1492 const nfs4_stateid *stateid, fmode_t fmode,
1493 nfs4_stateid *freeme)
1494 {
1495 switch (fmode) {
1496 case FMODE_READ:
1497 set_bit(NFS_O_RDONLY_STATE, &state->flags);
1498 break;
1499 case FMODE_WRITE:
1500 set_bit(NFS_O_WRONLY_STATE, &state->flags);
1501 break;
1502 case FMODE_READ|FMODE_WRITE:
1503 set_bit(NFS_O_RDWR_STATE, &state->flags);
1504 }
1505 if (!nfs_need_update_open_stateid(state, stateid, freeme))
1506 return;
1507 if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0)
1508 nfs4_stateid_copy(&state->stateid, stateid);
1509 nfs4_stateid_copy(&state->open_stateid, stateid);
1510 }
1511
__update_open_stateid(struct nfs4_state * state,const nfs4_stateid * open_stateid,const nfs4_stateid * deleg_stateid,fmode_t fmode,nfs4_stateid * freeme)1512 static void __update_open_stateid(struct nfs4_state *state,
1513 const nfs4_stateid *open_stateid,
1514 const nfs4_stateid *deleg_stateid,
1515 fmode_t fmode,
1516 nfs4_stateid *freeme)
1517 {
1518 /*
1519 * Protect the call to nfs4_state_set_mode_locked and
1520 * serialise the stateid update
1521 */
1522 spin_lock(&state->owner->so_lock);
1523 write_seqlock(&state->seqlock);
1524 if (deleg_stateid != NULL) {
1525 nfs4_stateid_copy(&state->stateid, deleg_stateid);
1526 set_bit(NFS_DELEGATED_STATE, &state->flags);
1527 }
1528 if (open_stateid != NULL)
1529 nfs_set_open_stateid_locked(state, open_stateid, fmode, freeme);
1530 write_sequnlock(&state->seqlock);
1531 update_open_stateflags(state, fmode);
1532 spin_unlock(&state->owner->so_lock);
1533 }
1534
update_open_stateid(struct nfs4_state * state,const nfs4_stateid * open_stateid,const nfs4_stateid * delegation,fmode_t fmode)1535 static int update_open_stateid(struct nfs4_state *state,
1536 const nfs4_stateid *open_stateid,
1537 const nfs4_stateid *delegation,
1538 fmode_t fmode)
1539 {
1540 struct nfs_server *server = NFS_SERVER(state->inode);
1541 struct nfs_client *clp = server->nfs_client;
1542 struct nfs_inode *nfsi = NFS_I(state->inode);
1543 struct nfs_delegation *deleg_cur;
1544 nfs4_stateid freeme = { };
1545 int ret = 0;
1546
1547 fmode &= (FMODE_READ|FMODE_WRITE);
1548
1549 rcu_read_lock();
1550 deleg_cur = rcu_dereference(nfsi->delegation);
1551 if (deleg_cur == NULL)
1552 goto no_delegation;
1553
1554 spin_lock(&deleg_cur->lock);
1555 if (rcu_dereference(nfsi->delegation) != deleg_cur ||
1556 test_bit(NFS_DELEGATION_RETURNING, &deleg_cur->flags) ||
1557 (deleg_cur->type & fmode) != fmode)
1558 goto no_delegation_unlock;
1559
1560 if (delegation == NULL)
1561 delegation = &deleg_cur->stateid;
1562 else if (!nfs4_stateid_match(&deleg_cur->stateid, delegation))
1563 goto no_delegation_unlock;
1564
1565 nfs_mark_delegation_referenced(deleg_cur);
1566 __update_open_stateid(state, open_stateid, &deleg_cur->stateid,
1567 fmode, &freeme);
1568 ret = 1;
1569 no_delegation_unlock:
1570 spin_unlock(&deleg_cur->lock);
1571 no_delegation:
1572 rcu_read_unlock();
1573
1574 if (!ret && open_stateid != NULL) {
1575 __update_open_stateid(state, open_stateid, NULL, fmode, &freeme);
1576 ret = 1;
1577 }
1578 if (test_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags))
1579 nfs4_schedule_state_manager(clp);
1580 if (freeme.type != 0)
1581 nfs4_test_and_free_stateid(server, &freeme,
1582 state->owner->so_cred);
1583
1584 return ret;
1585 }
1586
nfs4_update_lock_stateid(struct nfs4_lock_state * lsp,const nfs4_stateid * stateid)1587 static bool nfs4_update_lock_stateid(struct nfs4_lock_state *lsp,
1588 const nfs4_stateid *stateid)
1589 {
1590 struct nfs4_state *state = lsp->ls_state;
1591 bool ret = false;
1592
1593 spin_lock(&state->state_lock);
1594 if (!nfs4_stateid_match_other(stateid, &lsp->ls_stateid))
1595 goto out_noupdate;
1596 if (!nfs4_stateid_is_newer(stateid, &lsp->ls_stateid))
1597 goto out_noupdate;
1598 nfs4_stateid_copy(&lsp->ls_stateid, stateid);
1599 ret = true;
1600 out_noupdate:
1601 spin_unlock(&state->state_lock);
1602 return ret;
1603 }
1604
nfs4_return_incompatible_delegation(struct inode * inode,fmode_t fmode)1605 static void nfs4_return_incompatible_delegation(struct inode *inode, fmode_t fmode)
1606 {
1607 struct nfs_delegation *delegation;
1608
1609 rcu_read_lock();
1610 delegation = rcu_dereference(NFS_I(inode)->delegation);
1611 if (delegation == NULL || (delegation->type & fmode) == fmode) {
1612 rcu_read_unlock();
1613 return;
1614 }
1615 rcu_read_unlock();
1616 nfs4_inode_return_delegation(inode);
1617 }
1618
nfs4_try_open_cached(struct nfs4_opendata * opendata)1619 static struct nfs4_state *nfs4_try_open_cached(struct nfs4_opendata *opendata)
1620 {
1621 struct nfs4_state *state = opendata->state;
1622 struct nfs_inode *nfsi = NFS_I(state->inode);
1623 struct nfs_delegation *delegation;
1624 int open_mode = opendata->o_arg.open_flags;
1625 fmode_t fmode = opendata->o_arg.fmode;
1626 enum open_claim_type4 claim = opendata->o_arg.claim;
1627 nfs4_stateid stateid;
1628 int ret = -EAGAIN;
1629
1630 for (;;) {
1631 spin_lock(&state->owner->so_lock);
1632 if (can_open_cached(state, fmode, open_mode)) {
1633 update_open_stateflags(state, fmode);
1634 spin_unlock(&state->owner->so_lock);
1635 goto out_return_state;
1636 }
1637 spin_unlock(&state->owner->so_lock);
1638 rcu_read_lock();
1639 delegation = rcu_dereference(nfsi->delegation);
1640 if (!can_open_delegated(delegation, fmode, claim)) {
1641 rcu_read_unlock();
1642 break;
1643 }
1644 /* Save the delegation */
1645 nfs4_stateid_copy(&stateid, &delegation->stateid);
1646 rcu_read_unlock();
1647 nfs_release_seqid(opendata->o_arg.seqid);
1648 if (!opendata->is_recover) {
1649 ret = nfs_may_open(state->inode, state->owner->so_cred, open_mode);
1650 if (ret != 0)
1651 goto out;
1652 }
1653 ret = -EAGAIN;
1654
1655 /* Try to update the stateid using the delegation */
1656 if (update_open_stateid(state, NULL, &stateid, fmode))
1657 goto out_return_state;
1658 }
1659 out:
1660 return ERR_PTR(ret);
1661 out_return_state:
1662 atomic_inc(&state->count);
1663 return state;
1664 }
1665
1666 static void
nfs4_opendata_check_deleg(struct nfs4_opendata * data,struct nfs4_state * state)1667 nfs4_opendata_check_deleg(struct nfs4_opendata *data, struct nfs4_state *state)
1668 {
1669 struct nfs_client *clp = NFS_SERVER(state->inode)->nfs_client;
1670 struct nfs_delegation *delegation;
1671 int delegation_flags = 0;
1672
1673 rcu_read_lock();
1674 delegation = rcu_dereference(NFS_I(state->inode)->delegation);
1675 if (delegation)
1676 delegation_flags = delegation->flags;
1677 rcu_read_unlock();
1678 switch (data->o_arg.claim) {
1679 default:
1680 break;
1681 case NFS4_OPEN_CLAIM_DELEGATE_CUR:
1682 case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
1683 pr_err_ratelimited("NFS: Broken NFSv4 server %s is "
1684 "returning a delegation for "
1685 "OPEN(CLAIM_DELEGATE_CUR)\n",
1686 clp->cl_hostname);
1687 return;
1688 }
1689 if ((delegation_flags & 1UL<<NFS_DELEGATION_NEED_RECLAIM) == 0)
1690 nfs_inode_set_delegation(state->inode,
1691 data->owner->so_cred,
1692 &data->o_res);
1693 else
1694 nfs_inode_reclaim_delegation(state->inode,
1695 data->owner->so_cred,
1696 &data->o_res);
1697 }
1698
1699 /*
1700 * Check the inode attributes against the CLAIM_PREVIOUS returned attributes
1701 * and update the nfs4_state.
1702 */
1703 static struct nfs4_state *
_nfs4_opendata_reclaim_to_nfs4_state(struct nfs4_opendata * data)1704 _nfs4_opendata_reclaim_to_nfs4_state(struct nfs4_opendata *data)
1705 {
1706 struct inode *inode = data->state->inode;
1707 struct nfs4_state *state = data->state;
1708 int ret;
1709
1710 if (!data->rpc_done) {
1711 if (data->rpc_status) {
1712 ret = data->rpc_status;
1713 goto err;
1714 }
1715 /* cached opens have already been processed */
1716 goto update;
1717 }
1718
1719 ret = nfs_refresh_inode(inode, &data->f_attr);
1720 if (ret)
1721 goto err;
1722
1723 if (data->o_res.delegation_type != 0)
1724 nfs4_opendata_check_deleg(data, state);
1725 update:
1726 update_open_stateid(state, &data->o_res.stateid, NULL,
1727 data->o_arg.fmode);
1728 atomic_inc(&state->count);
1729
1730 return state;
1731 err:
1732 return ERR_PTR(ret);
1733
1734 }
1735
1736 static struct nfs4_state *
_nfs4_opendata_to_nfs4_state(struct nfs4_opendata * data)1737 _nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data)
1738 {
1739 struct inode *inode;
1740 struct nfs4_state *state = NULL;
1741 int ret;
1742
1743 if (!data->rpc_done) {
1744 state = nfs4_try_open_cached(data);
1745 trace_nfs4_cached_open(data->state);
1746 goto out;
1747 }
1748
1749 ret = -EAGAIN;
1750 if (!(data->f_attr.valid & NFS_ATTR_FATTR))
1751 goto err;
1752 inode = nfs_fhget(data->dir->d_sb, &data->o_res.fh, &data->f_attr, data->f_label);
1753 ret = PTR_ERR(inode);
1754 if (IS_ERR(inode))
1755 goto err;
1756 ret = -ENOMEM;
1757 state = nfs4_get_open_state(inode, data->owner);
1758 if (state == NULL)
1759 goto err_put_inode;
1760 if (data->o_res.delegation_type != 0)
1761 nfs4_opendata_check_deleg(data, state);
1762 update_open_stateid(state, &data->o_res.stateid, NULL,
1763 data->o_arg.fmode);
1764 iput(inode);
1765 out:
1766 nfs_release_seqid(data->o_arg.seqid);
1767 return state;
1768 err_put_inode:
1769 iput(inode);
1770 err:
1771 return ERR_PTR(ret);
1772 }
1773
1774 static struct nfs4_state *
nfs4_opendata_to_nfs4_state(struct nfs4_opendata * data)1775 nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data)
1776 {
1777 struct nfs4_state *ret;
1778
1779 if (data->o_arg.claim == NFS4_OPEN_CLAIM_PREVIOUS)
1780 ret =_nfs4_opendata_reclaim_to_nfs4_state(data);
1781 else
1782 ret = _nfs4_opendata_to_nfs4_state(data);
1783 nfs4_sequence_free_slot(&data->o_res.seq_res);
1784 return ret;
1785 }
1786
nfs4_state_find_open_context(struct nfs4_state * state)1787 static struct nfs_open_context *nfs4_state_find_open_context(struct nfs4_state *state)
1788 {
1789 struct nfs_inode *nfsi = NFS_I(state->inode);
1790 struct nfs_open_context *ctx;
1791
1792 spin_lock(&state->inode->i_lock);
1793 list_for_each_entry(ctx, &nfsi->open_files, list) {
1794 if (ctx->state != state)
1795 continue;
1796 get_nfs_open_context(ctx);
1797 spin_unlock(&state->inode->i_lock);
1798 return ctx;
1799 }
1800 spin_unlock(&state->inode->i_lock);
1801 return ERR_PTR(-ENOENT);
1802 }
1803
nfs4_open_recoverdata_alloc(struct nfs_open_context * ctx,struct nfs4_state * state,enum open_claim_type4 claim)1804 static struct nfs4_opendata *nfs4_open_recoverdata_alloc(struct nfs_open_context *ctx,
1805 struct nfs4_state *state, enum open_claim_type4 claim)
1806 {
1807 struct nfs4_opendata *opendata;
1808
1809 opendata = nfs4_opendata_alloc(ctx->dentry, state->owner, 0, 0,
1810 NULL, NULL, claim, GFP_NOFS);
1811 if (opendata == NULL)
1812 return ERR_PTR(-ENOMEM);
1813 opendata->state = state;
1814 atomic_inc(&state->count);
1815 return opendata;
1816 }
1817
nfs4_open_recover_helper(struct nfs4_opendata * opendata,fmode_t fmode)1818 static int nfs4_open_recover_helper(struct nfs4_opendata *opendata,
1819 fmode_t fmode)
1820 {
1821 struct nfs4_state *newstate;
1822 int ret;
1823
1824 if (!nfs4_mode_match_open_stateid(opendata->state, fmode))
1825 return 0;
1826 opendata->o_arg.open_flags = 0;
1827 opendata->o_arg.fmode = fmode;
1828 opendata->o_arg.share_access = nfs4_map_atomic_open_share(
1829 NFS_SB(opendata->dentry->d_sb),
1830 fmode, 0);
1831 memset(&opendata->o_res, 0, sizeof(opendata->o_res));
1832 memset(&opendata->c_res, 0, sizeof(opendata->c_res));
1833 nfs4_init_opendata_res(opendata);
1834 ret = _nfs4_recover_proc_open(opendata);
1835 if (ret != 0)
1836 return ret;
1837 newstate = nfs4_opendata_to_nfs4_state(opendata);
1838 if (IS_ERR(newstate))
1839 return PTR_ERR(newstate);
1840 if (newstate != opendata->state)
1841 ret = -ESTALE;
1842 nfs4_close_state(newstate, fmode);
1843 return ret;
1844 }
1845
nfs4_open_recover(struct nfs4_opendata * opendata,struct nfs4_state * state)1846 static int nfs4_open_recover(struct nfs4_opendata *opendata, struct nfs4_state *state)
1847 {
1848 int ret;
1849
1850 /* Don't trigger recovery in nfs_test_and_clear_all_open_stateid */
1851 clear_bit(NFS_O_RDWR_STATE, &state->flags);
1852 clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1853 clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1854 /* memory barrier prior to reading state->n_* */
1855 clear_bit(NFS_DELEGATED_STATE, &state->flags);
1856 clear_bit(NFS_OPEN_STATE, &state->flags);
1857 smp_rmb();
1858 ret = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE);
1859 if (ret != 0)
1860 return ret;
1861 ret = nfs4_open_recover_helper(opendata, FMODE_WRITE);
1862 if (ret != 0)
1863 return ret;
1864 ret = nfs4_open_recover_helper(opendata, FMODE_READ);
1865 if (ret != 0)
1866 return ret;
1867 /*
1868 * We may have performed cached opens for all three recoveries.
1869 * Check if we need to update the current stateid.
1870 */
1871 if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0 &&
1872 !nfs4_stateid_match(&state->stateid, &state->open_stateid)) {
1873 write_seqlock(&state->seqlock);
1874 if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0)
1875 nfs4_stateid_copy(&state->stateid, &state->open_stateid);
1876 write_sequnlock(&state->seqlock);
1877 }
1878 return 0;
1879 }
1880
1881 /*
1882 * OPEN_RECLAIM:
1883 * reclaim state on the server after a reboot.
1884 */
_nfs4_do_open_reclaim(struct nfs_open_context * ctx,struct nfs4_state * state)1885 static int _nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state)
1886 {
1887 struct nfs_delegation *delegation;
1888 struct nfs4_opendata *opendata;
1889 fmode_t delegation_type = 0;
1890 int status;
1891
1892 opendata = nfs4_open_recoverdata_alloc(ctx, state,
1893 NFS4_OPEN_CLAIM_PREVIOUS);
1894 if (IS_ERR(opendata))
1895 return PTR_ERR(opendata);
1896 rcu_read_lock();
1897 delegation = rcu_dereference(NFS_I(state->inode)->delegation);
1898 if (delegation != NULL && test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags) != 0)
1899 delegation_type = delegation->type;
1900 rcu_read_unlock();
1901 opendata->o_arg.u.delegation_type = delegation_type;
1902 status = nfs4_open_recover(opendata, state);
1903 nfs4_opendata_put(opendata);
1904 return status;
1905 }
1906
nfs4_do_open_reclaim(struct nfs_open_context * ctx,struct nfs4_state * state)1907 static int nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state *state)
1908 {
1909 struct nfs_server *server = NFS_SERVER(state->inode);
1910 struct nfs4_exception exception = { };
1911 int err;
1912 do {
1913 err = _nfs4_do_open_reclaim(ctx, state);
1914 trace_nfs4_open_reclaim(ctx, 0, err);
1915 if (nfs4_clear_cap_atomic_open_v1(server, err, &exception))
1916 continue;
1917 if (err != -NFS4ERR_DELAY)
1918 break;
1919 nfs4_handle_exception(server, err, &exception);
1920 } while (exception.retry);
1921 return err;
1922 }
1923
nfs4_open_reclaim(struct nfs4_state_owner * sp,struct nfs4_state * state)1924 static int nfs4_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *state)
1925 {
1926 struct nfs_open_context *ctx;
1927 int ret;
1928
1929 ctx = nfs4_state_find_open_context(state);
1930 if (IS_ERR(ctx))
1931 return -EAGAIN;
1932 ret = nfs4_do_open_reclaim(ctx, state);
1933 put_nfs_open_context(ctx);
1934 return ret;
1935 }
1936
nfs4_handle_delegation_recall_error(struct nfs_server * server,struct nfs4_state * state,const nfs4_stateid * stateid,int err)1937 static int nfs4_handle_delegation_recall_error(struct nfs_server *server, struct nfs4_state *state, const nfs4_stateid *stateid, int err)
1938 {
1939 switch (err) {
1940 default:
1941 printk(KERN_ERR "NFS: %s: unhandled error "
1942 "%d.\n", __func__, err);
1943 case 0:
1944 case -ENOENT:
1945 case -EAGAIN:
1946 case -ESTALE:
1947 break;
1948 case -NFS4ERR_BADSESSION:
1949 case -NFS4ERR_BADSLOT:
1950 case -NFS4ERR_BAD_HIGH_SLOT:
1951 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
1952 case -NFS4ERR_DEADSESSION:
1953 set_bit(NFS_DELEGATED_STATE, &state->flags);
1954 nfs4_schedule_session_recovery(server->nfs_client->cl_session, err);
1955 return -EAGAIN;
1956 case -NFS4ERR_STALE_CLIENTID:
1957 case -NFS4ERR_STALE_STATEID:
1958 set_bit(NFS_DELEGATED_STATE, &state->flags);
1959 /* Don't recall a delegation if it was lost */
1960 nfs4_schedule_lease_recovery(server->nfs_client);
1961 return -EAGAIN;
1962 case -NFS4ERR_MOVED:
1963 nfs4_schedule_migration_recovery(server);
1964 return -EAGAIN;
1965 case -NFS4ERR_LEASE_MOVED:
1966 nfs4_schedule_lease_moved_recovery(server->nfs_client);
1967 return -EAGAIN;
1968 case -NFS4ERR_DELEG_REVOKED:
1969 case -NFS4ERR_ADMIN_REVOKED:
1970 case -NFS4ERR_EXPIRED:
1971 case -NFS4ERR_BAD_STATEID:
1972 case -NFS4ERR_OPENMODE:
1973 nfs_inode_find_state_and_recover(state->inode,
1974 stateid);
1975 nfs4_schedule_stateid_recovery(server, state);
1976 return -EAGAIN;
1977 case -NFS4ERR_DELAY:
1978 case -NFS4ERR_GRACE:
1979 set_bit(NFS_DELEGATED_STATE, &state->flags);
1980 ssleep(1);
1981 return -EAGAIN;
1982 case -ENOMEM:
1983 case -NFS4ERR_DENIED:
1984 /* kill_proc(fl->fl_pid, SIGLOST, 1); */
1985 return 0;
1986 }
1987 return err;
1988 }
1989
nfs4_open_delegation_recall(struct nfs_open_context * ctx,struct nfs4_state * state,const nfs4_stateid * stateid,fmode_t type)1990 int nfs4_open_delegation_recall(struct nfs_open_context *ctx,
1991 struct nfs4_state *state, const nfs4_stateid *stateid,
1992 fmode_t type)
1993 {
1994 struct nfs_server *server = NFS_SERVER(state->inode);
1995 struct nfs4_opendata *opendata;
1996 int err = 0;
1997
1998 opendata = nfs4_open_recoverdata_alloc(ctx, state,
1999 NFS4_OPEN_CLAIM_DELEG_CUR_FH);
2000 if (IS_ERR(opendata))
2001 return PTR_ERR(opendata);
2002 nfs4_stateid_copy(&opendata->o_arg.u.delegation, stateid);
2003 write_seqlock(&state->seqlock);
2004 nfs4_stateid_copy(&state->stateid, &state->open_stateid);
2005 write_sequnlock(&state->seqlock);
2006 clear_bit(NFS_DELEGATED_STATE, &state->flags);
2007 switch (type & (FMODE_READ|FMODE_WRITE)) {
2008 case FMODE_READ|FMODE_WRITE:
2009 case FMODE_WRITE:
2010 err = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE);
2011 if (err)
2012 break;
2013 err = nfs4_open_recover_helper(opendata, FMODE_WRITE);
2014 if (err)
2015 break;
2016 case FMODE_READ:
2017 err = nfs4_open_recover_helper(opendata, FMODE_READ);
2018 }
2019 nfs4_opendata_put(opendata);
2020 return nfs4_handle_delegation_recall_error(server, state, stateid, err);
2021 }
2022
nfs4_open_confirm_prepare(struct rpc_task * task,void * calldata)2023 static void nfs4_open_confirm_prepare(struct rpc_task *task, void *calldata)
2024 {
2025 struct nfs4_opendata *data = calldata;
2026
2027 nfs40_setup_sequence(data->o_arg.server->nfs_client->cl_slot_tbl,
2028 &data->c_arg.seq_args, &data->c_res.seq_res, task);
2029 }
2030
nfs4_open_confirm_done(struct rpc_task * task,void * calldata)2031 static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata)
2032 {
2033 struct nfs4_opendata *data = calldata;
2034
2035 nfs40_sequence_done(task, &data->c_res.seq_res);
2036
2037 data->rpc_status = task->tk_status;
2038 if (data->rpc_status == 0) {
2039 nfs4_stateid_copy(&data->o_res.stateid, &data->c_res.stateid);
2040 nfs_confirm_seqid(&data->owner->so_seqid, 0);
2041 renew_lease(data->o_res.server, data->timestamp);
2042 data->rpc_done = 1;
2043 }
2044 }
2045
nfs4_open_confirm_release(void * calldata)2046 static void nfs4_open_confirm_release(void *calldata)
2047 {
2048 struct nfs4_opendata *data = calldata;
2049 struct nfs4_state *state = NULL;
2050
2051 /* If this request hasn't been cancelled, do nothing */
2052 if (data->cancelled == 0)
2053 goto out_free;
2054 /* In case of error, no cleanup! */
2055 if (!data->rpc_done)
2056 goto out_free;
2057 state = nfs4_opendata_to_nfs4_state(data);
2058 if (!IS_ERR(state))
2059 nfs4_close_state(state, data->o_arg.fmode);
2060 out_free:
2061 nfs4_opendata_put(data);
2062 }
2063
2064 static const struct rpc_call_ops nfs4_open_confirm_ops = {
2065 .rpc_call_prepare = nfs4_open_confirm_prepare,
2066 .rpc_call_done = nfs4_open_confirm_done,
2067 .rpc_release = nfs4_open_confirm_release,
2068 };
2069
2070 /*
2071 * Note: On error, nfs4_proc_open_confirm will free the struct nfs4_opendata
2072 */
_nfs4_proc_open_confirm(struct nfs4_opendata * data)2073 static int _nfs4_proc_open_confirm(struct nfs4_opendata *data)
2074 {
2075 struct nfs_server *server = NFS_SERVER(d_inode(data->dir));
2076 struct rpc_task *task;
2077 struct rpc_message msg = {
2078 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_CONFIRM],
2079 .rpc_argp = &data->c_arg,
2080 .rpc_resp = &data->c_res,
2081 .rpc_cred = data->owner->so_cred,
2082 };
2083 struct rpc_task_setup task_setup_data = {
2084 .rpc_client = server->client,
2085 .rpc_message = &msg,
2086 .callback_ops = &nfs4_open_confirm_ops,
2087 .callback_data = data,
2088 .workqueue = nfsiod_workqueue,
2089 .flags = RPC_TASK_ASYNC,
2090 };
2091 int status;
2092
2093 nfs4_init_sequence(&data->c_arg.seq_args, &data->c_res.seq_res, 1);
2094 kref_get(&data->kref);
2095 data->rpc_done = 0;
2096 data->rpc_status = 0;
2097 data->timestamp = jiffies;
2098 if (data->is_recover)
2099 nfs4_set_sequence_privileged(&data->c_arg.seq_args);
2100 task = rpc_run_task(&task_setup_data);
2101 if (IS_ERR(task))
2102 return PTR_ERR(task);
2103 status = nfs4_wait_for_completion_rpc_task(task);
2104 if (status != 0) {
2105 data->cancelled = 1;
2106 smp_wmb();
2107 } else
2108 status = data->rpc_status;
2109 rpc_put_task(task);
2110 return status;
2111 }
2112
nfs4_open_prepare(struct rpc_task * task,void * calldata)2113 static void nfs4_open_prepare(struct rpc_task *task, void *calldata)
2114 {
2115 struct nfs4_opendata *data = calldata;
2116 struct nfs4_state_owner *sp = data->owner;
2117 struct nfs_client *clp = sp->so_server->nfs_client;
2118 enum open_claim_type4 claim = data->o_arg.claim;
2119
2120 if (nfs_wait_on_sequence(data->o_arg.seqid, task) != 0)
2121 goto out_wait;
2122 /*
2123 * Check if we still need to send an OPEN call, or if we can use
2124 * a delegation instead.
2125 */
2126 if (data->state != NULL) {
2127 struct nfs_delegation *delegation;
2128
2129 if (can_open_cached(data->state, data->o_arg.fmode, data->o_arg.open_flags))
2130 goto out_no_action;
2131 rcu_read_lock();
2132 delegation = rcu_dereference(NFS_I(data->state->inode)->delegation);
2133 if (can_open_delegated(delegation, data->o_arg.fmode, claim))
2134 goto unlock_no_action;
2135 rcu_read_unlock();
2136 }
2137 /* Update client id. */
2138 data->o_arg.clientid = clp->cl_clientid;
2139 switch (claim) {
2140 default:
2141 break;
2142 case NFS4_OPEN_CLAIM_PREVIOUS:
2143 case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
2144 case NFS4_OPEN_CLAIM_DELEG_PREV_FH:
2145 data->o_arg.open_bitmap = &nfs4_open_noattr_bitmap[0];
2146 case NFS4_OPEN_CLAIM_FH:
2147 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
2148 nfs_copy_fh(&data->o_res.fh, data->o_arg.fh);
2149 }
2150 data->timestamp = jiffies;
2151 if (nfs4_setup_sequence(data->o_arg.server,
2152 &data->o_arg.seq_args,
2153 &data->o_res.seq_res,
2154 task) != 0)
2155 nfs_release_seqid(data->o_arg.seqid);
2156
2157 /* Set the create mode (note dependency on the session type) */
2158 data->o_arg.createmode = NFS4_CREATE_UNCHECKED;
2159 if (data->o_arg.open_flags & O_EXCL) {
2160 data->o_arg.createmode = NFS4_CREATE_EXCLUSIVE;
2161 if (nfs4_has_persistent_session(clp))
2162 data->o_arg.createmode = NFS4_CREATE_GUARDED;
2163 else if (clp->cl_mvops->minor_version > 0)
2164 data->o_arg.createmode = NFS4_CREATE_EXCLUSIVE4_1;
2165 }
2166 return;
2167 unlock_no_action:
2168 trace_nfs4_cached_open(data->state);
2169 rcu_read_unlock();
2170 out_no_action:
2171 task->tk_action = NULL;
2172 out_wait:
2173 nfs4_sequence_done(task, &data->o_res.seq_res);
2174 }
2175
nfs4_open_done(struct rpc_task * task,void * calldata)2176 static void nfs4_open_done(struct rpc_task *task, void *calldata)
2177 {
2178 struct nfs4_opendata *data = calldata;
2179
2180 data->rpc_status = task->tk_status;
2181
2182 if (!nfs4_sequence_process(task, &data->o_res.seq_res))
2183 return;
2184
2185 if (task->tk_status == 0) {
2186 if (data->o_res.f_attr->valid & NFS_ATTR_FATTR_TYPE) {
2187 switch (data->o_res.f_attr->mode & S_IFMT) {
2188 case S_IFREG:
2189 break;
2190 case S_IFLNK:
2191 data->rpc_status = -ELOOP;
2192 break;
2193 case S_IFDIR:
2194 data->rpc_status = -EISDIR;
2195 break;
2196 default:
2197 data->rpc_status = -ENOTDIR;
2198 }
2199 }
2200 renew_lease(data->o_res.server, data->timestamp);
2201 if (!(data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM))
2202 nfs_confirm_seqid(&data->owner->so_seqid, 0);
2203 }
2204 data->rpc_done = 1;
2205 }
2206
nfs4_open_release(void * calldata)2207 static void nfs4_open_release(void *calldata)
2208 {
2209 struct nfs4_opendata *data = calldata;
2210 struct nfs4_state *state = NULL;
2211
2212 /* If this request hasn't been cancelled, do nothing */
2213 if (data->cancelled == 0)
2214 goto out_free;
2215 /* In case of error, no cleanup! */
2216 if (data->rpc_status != 0 || !data->rpc_done)
2217 goto out_free;
2218 /* In case we need an open_confirm, no cleanup! */
2219 if (data->o_res.rflags & NFS4_OPEN_RESULT_CONFIRM)
2220 goto out_free;
2221 state = nfs4_opendata_to_nfs4_state(data);
2222 if (!IS_ERR(state))
2223 nfs4_close_state(state, data->o_arg.fmode);
2224 out_free:
2225 nfs4_opendata_put(data);
2226 }
2227
2228 static const struct rpc_call_ops nfs4_open_ops = {
2229 .rpc_call_prepare = nfs4_open_prepare,
2230 .rpc_call_done = nfs4_open_done,
2231 .rpc_release = nfs4_open_release,
2232 };
2233
nfs4_run_open_task(struct nfs4_opendata * data,int isrecover)2234 static int nfs4_run_open_task(struct nfs4_opendata *data, int isrecover)
2235 {
2236 struct inode *dir = d_inode(data->dir);
2237 struct nfs_server *server = NFS_SERVER(dir);
2238 struct nfs_openargs *o_arg = &data->o_arg;
2239 struct nfs_openres *o_res = &data->o_res;
2240 struct rpc_task *task;
2241 struct rpc_message msg = {
2242 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN],
2243 .rpc_argp = o_arg,
2244 .rpc_resp = o_res,
2245 .rpc_cred = data->owner->so_cred,
2246 };
2247 struct rpc_task_setup task_setup_data = {
2248 .rpc_client = server->client,
2249 .rpc_message = &msg,
2250 .callback_ops = &nfs4_open_ops,
2251 .callback_data = data,
2252 .workqueue = nfsiod_workqueue,
2253 .flags = RPC_TASK_ASYNC,
2254 };
2255 int status;
2256
2257 nfs4_init_sequence(&o_arg->seq_args, &o_res->seq_res, 1);
2258 kref_get(&data->kref);
2259 data->rpc_done = 0;
2260 data->rpc_status = 0;
2261 data->cancelled = 0;
2262 data->is_recover = 0;
2263 if (isrecover) {
2264 nfs4_set_sequence_privileged(&o_arg->seq_args);
2265 data->is_recover = 1;
2266 }
2267 task = rpc_run_task(&task_setup_data);
2268 if (IS_ERR(task))
2269 return PTR_ERR(task);
2270 status = nfs4_wait_for_completion_rpc_task(task);
2271 if (status != 0) {
2272 data->cancelled = 1;
2273 smp_wmb();
2274 } else
2275 status = data->rpc_status;
2276 rpc_put_task(task);
2277
2278 return status;
2279 }
2280
_nfs4_recover_proc_open(struct nfs4_opendata * data)2281 static int _nfs4_recover_proc_open(struct nfs4_opendata *data)
2282 {
2283 struct inode *dir = d_inode(data->dir);
2284 struct nfs_openres *o_res = &data->o_res;
2285 int status;
2286
2287 status = nfs4_run_open_task(data, 1);
2288 if (status != 0 || !data->rpc_done)
2289 return status;
2290
2291 nfs_fattr_map_and_free_names(NFS_SERVER(dir), &data->f_attr);
2292
2293 if (o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) {
2294 status = _nfs4_proc_open_confirm(data);
2295 if (status != 0)
2296 return status;
2297 }
2298
2299 return status;
2300 }
2301
2302 /*
2303 * Additional permission checks in order to distinguish between an
2304 * open for read, and an open for execute. This works around the
2305 * fact that NFSv4 OPEN treats read and execute permissions as being
2306 * the same.
2307 * Note that in the non-execute case, we want to turn off permission
2308 * checking if we just created a new file (POSIX open() semantics).
2309 */
nfs4_opendata_access(struct rpc_cred * cred,struct nfs4_opendata * opendata,struct nfs4_state * state,fmode_t fmode,int openflags)2310 static int nfs4_opendata_access(struct rpc_cred *cred,
2311 struct nfs4_opendata *opendata,
2312 struct nfs4_state *state, fmode_t fmode,
2313 int openflags)
2314 {
2315 struct nfs_access_entry cache;
2316 u32 mask;
2317
2318 /* access call failed or for some reason the server doesn't
2319 * support any access modes -- defer access call until later */
2320 if (opendata->o_res.access_supported == 0)
2321 return 0;
2322
2323 mask = 0;
2324 /*
2325 * Use openflags to check for exec, because fmode won't
2326 * always have FMODE_EXEC set when file open for exec.
2327 */
2328 if (openflags & __FMODE_EXEC) {
2329 /* ONLY check for exec rights */
2330 mask = MAY_EXEC;
2331 } else if ((fmode & FMODE_READ) && !opendata->file_created)
2332 mask = MAY_READ;
2333
2334 cache.cred = cred;
2335 cache.jiffies = jiffies;
2336 nfs_access_set_mask(&cache, opendata->o_res.access_result);
2337 nfs_access_add_cache(state->inode, &cache);
2338
2339 if ((mask & ~cache.mask & (MAY_READ | MAY_EXEC)) == 0)
2340 return 0;
2341
2342 return -EACCES;
2343 }
2344
2345 /*
2346 * Note: On error, nfs4_proc_open will free the struct nfs4_opendata
2347 */
_nfs4_proc_open(struct nfs4_opendata * data)2348 static int _nfs4_proc_open(struct nfs4_opendata *data)
2349 {
2350 struct inode *dir = d_inode(data->dir);
2351 struct nfs_server *server = NFS_SERVER(dir);
2352 struct nfs_openargs *o_arg = &data->o_arg;
2353 struct nfs_openres *o_res = &data->o_res;
2354 int status;
2355
2356 status = nfs4_run_open_task(data, 0);
2357 if (!data->rpc_done)
2358 return status;
2359 if (status != 0) {
2360 if (status == -NFS4ERR_BADNAME &&
2361 !(o_arg->open_flags & O_CREAT))
2362 return -ENOENT;
2363 return status;
2364 }
2365
2366 nfs_fattr_map_and_free_names(server, &data->f_attr);
2367
2368 if (o_arg->open_flags & O_CREAT) {
2369 update_changeattr(dir, &o_res->cinfo);
2370 if (o_arg->open_flags & O_EXCL)
2371 data->file_created = 1;
2372 else if (o_res->cinfo.before != o_res->cinfo.after)
2373 data->file_created = 1;
2374 }
2375 if ((o_res->rflags & NFS4_OPEN_RESULT_LOCKTYPE_POSIX) == 0)
2376 server->caps &= ~NFS_CAP_POSIX_LOCK;
2377 if(o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) {
2378 status = _nfs4_proc_open_confirm(data);
2379 if (status != 0)
2380 return status;
2381 }
2382 if (!(o_res->f_attr->valid & NFS_ATTR_FATTR)) {
2383 nfs4_sequence_free_slot(&o_res->seq_res);
2384 nfs4_proc_getattr(server, &o_res->fh, o_res->f_attr, o_res->f_label);
2385 }
2386 return 0;
2387 }
2388
nfs4_recover_expired_lease(struct nfs_server * server)2389 static int nfs4_recover_expired_lease(struct nfs_server *server)
2390 {
2391 return nfs4_client_recover_expired_lease(server->nfs_client);
2392 }
2393
2394 /*
2395 * OPEN_EXPIRED:
2396 * reclaim state on the server after a network partition.
2397 * Assumes caller holds the appropriate lock
2398 */
_nfs4_open_expired(struct nfs_open_context * ctx,struct nfs4_state * state)2399 static int _nfs4_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state)
2400 {
2401 struct nfs4_opendata *opendata;
2402 int ret;
2403
2404 opendata = nfs4_open_recoverdata_alloc(ctx, state,
2405 NFS4_OPEN_CLAIM_FH);
2406 if (IS_ERR(opendata))
2407 return PTR_ERR(opendata);
2408 ret = nfs4_open_recover(opendata, state);
2409 if (ret == -ESTALE)
2410 d_drop(ctx->dentry);
2411 nfs4_opendata_put(opendata);
2412 return ret;
2413 }
2414
nfs4_do_open_expired(struct nfs_open_context * ctx,struct nfs4_state * state)2415 static int nfs4_do_open_expired(struct nfs_open_context *ctx, struct nfs4_state *state)
2416 {
2417 struct nfs_server *server = NFS_SERVER(state->inode);
2418 struct nfs4_exception exception = { };
2419 int err;
2420
2421 do {
2422 err = _nfs4_open_expired(ctx, state);
2423 trace_nfs4_open_expired(ctx, 0, err);
2424 if (nfs4_clear_cap_atomic_open_v1(server, err, &exception))
2425 continue;
2426 switch (err) {
2427 default:
2428 goto out;
2429 case -NFS4ERR_GRACE:
2430 case -NFS4ERR_DELAY:
2431 nfs4_handle_exception(server, err, &exception);
2432 err = 0;
2433 }
2434 } while (exception.retry);
2435 out:
2436 return err;
2437 }
2438
nfs4_open_expired(struct nfs4_state_owner * sp,struct nfs4_state * state)2439 static int nfs4_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state)
2440 {
2441 struct nfs_open_context *ctx;
2442 int ret;
2443
2444 ctx = nfs4_state_find_open_context(state);
2445 if (IS_ERR(ctx))
2446 return -EAGAIN;
2447 ret = nfs4_do_open_expired(ctx, state);
2448 put_nfs_open_context(ctx);
2449 return ret;
2450 }
2451
nfs_finish_clear_delegation_stateid(struct nfs4_state * state,const nfs4_stateid * stateid)2452 static void nfs_finish_clear_delegation_stateid(struct nfs4_state *state,
2453 const nfs4_stateid *stateid)
2454 {
2455 nfs_remove_bad_delegation(state->inode, stateid);
2456 write_seqlock(&state->seqlock);
2457 nfs4_stateid_copy(&state->stateid, &state->open_stateid);
2458 write_sequnlock(&state->seqlock);
2459 clear_bit(NFS_DELEGATED_STATE, &state->flags);
2460 }
2461
nfs40_clear_delegation_stateid(struct nfs4_state * state)2462 static void nfs40_clear_delegation_stateid(struct nfs4_state *state)
2463 {
2464 if (rcu_access_pointer(NFS_I(state->inode)->delegation) != NULL)
2465 nfs_finish_clear_delegation_stateid(state, NULL);
2466 }
2467
nfs40_open_expired(struct nfs4_state_owner * sp,struct nfs4_state * state)2468 static int nfs40_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state)
2469 {
2470 /* NFSv4.0 doesn't allow for delegation recovery on open expire */
2471 nfs40_clear_delegation_stateid(state);
2472 return nfs4_open_expired(sp, state);
2473 }
2474
nfs40_test_and_free_expired_stateid(struct nfs_server * server,nfs4_stateid * stateid,struct rpc_cred * cred)2475 static int nfs40_test_and_free_expired_stateid(struct nfs_server *server,
2476 nfs4_stateid *stateid,
2477 struct rpc_cred *cred)
2478 {
2479 return -NFS4ERR_BAD_STATEID;
2480 }
2481
2482 #if defined(CONFIG_NFS_V4_1)
nfs41_test_and_free_expired_stateid(struct nfs_server * server,nfs4_stateid * stateid,struct rpc_cred * cred)2483 static int nfs41_test_and_free_expired_stateid(struct nfs_server *server,
2484 nfs4_stateid *stateid,
2485 struct rpc_cred *cred)
2486 {
2487 int status;
2488
2489 switch (stateid->type) {
2490 default:
2491 break;
2492 case NFS4_INVALID_STATEID_TYPE:
2493 case NFS4_SPECIAL_STATEID_TYPE:
2494 return -NFS4ERR_BAD_STATEID;
2495 case NFS4_REVOKED_STATEID_TYPE:
2496 goto out_free;
2497 }
2498
2499 status = nfs41_test_stateid(server, stateid, cred);
2500 switch (status) {
2501 case -NFS4ERR_EXPIRED:
2502 case -NFS4ERR_ADMIN_REVOKED:
2503 case -NFS4ERR_DELEG_REVOKED:
2504 break;
2505 default:
2506 return status;
2507 }
2508 out_free:
2509 /* Ack the revoked state to the server */
2510 nfs41_free_stateid(server, stateid, cred, true);
2511 return -NFS4ERR_EXPIRED;
2512 }
2513
nfs41_check_delegation_stateid(struct nfs4_state * state)2514 static void nfs41_check_delegation_stateid(struct nfs4_state *state)
2515 {
2516 struct nfs_server *server = NFS_SERVER(state->inode);
2517 nfs4_stateid stateid;
2518 struct nfs_delegation *delegation;
2519 struct rpc_cred *cred;
2520 int status;
2521
2522 /* Get the delegation credential for use by test/free_stateid */
2523 rcu_read_lock();
2524 delegation = rcu_dereference(NFS_I(state->inode)->delegation);
2525 if (delegation == NULL) {
2526 rcu_read_unlock();
2527 return;
2528 }
2529
2530 nfs4_stateid_copy(&stateid, &delegation->stateid);
2531 if (test_bit(NFS_DELEGATION_REVOKED, &delegation->flags) ||
2532 !test_and_clear_bit(NFS_DELEGATION_TEST_EXPIRED,
2533 &delegation->flags)) {
2534 rcu_read_unlock();
2535 nfs_finish_clear_delegation_stateid(state, &stateid);
2536 return;
2537 }
2538
2539 cred = get_rpccred(delegation->cred);
2540 rcu_read_unlock();
2541 status = nfs41_test_and_free_expired_stateid(server, &stateid, cred);
2542 trace_nfs4_test_delegation_stateid(state, NULL, status);
2543 if (status == -NFS4ERR_EXPIRED || status == -NFS4ERR_BAD_STATEID)
2544 nfs_finish_clear_delegation_stateid(state, &stateid);
2545
2546 put_rpccred(cred);
2547 }
2548
2549 /**
2550 * nfs41_check_expired_locks - possibly free a lock stateid
2551 *
2552 * @state: NFSv4 state for an inode
2553 *
2554 * Returns NFS_OK if recovery for this stateid is now finished.
2555 * Otherwise a negative NFS4ERR value is returned.
2556 */
nfs41_check_expired_locks(struct nfs4_state * state)2557 static int nfs41_check_expired_locks(struct nfs4_state *state)
2558 {
2559 int status, ret = NFS_OK;
2560 struct nfs4_lock_state *lsp, *prev = NULL;
2561 struct nfs_server *server = NFS_SERVER(state->inode);
2562
2563 if (!test_bit(LK_STATE_IN_USE, &state->flags))
2564 goto out;
2565
2566 spin_lock(&state->state_lock);
2567 list_for_each_entry(lsp, &state->lock_states, ls_locks) {
2568 if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags)) {
2569 struct rpc_cred *cred = lsp->ls_state->owner->so_cred;
2570
2571 atomic_inc(&lsp->ls_count);
2572 spin_unlock(&state->state_lock);
2573
2574 nfs4_put_lock_state(prev);
2575 prev = lsp;
2576
2577 status = nfs41_test_and_free_expired_stateid(server,
2578 &lsp->ls_stateid,
2579 cred);
2580 trace_nfs4_test_lock_stateid(state, lsp, status);
2581 if (status == -NFS4ERR_EXPIRED ||
2582 status == -NFS4ERR_BAD_STATEID) {
2583 clear_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags);
2584 lsp->ls_stateid.type = NFS4_INVALID_STATEID_TYPE;
2585 if (!recover_lost_locks)
2586 set_bit(NFS_LOCK_LOST, &lsp->ls_flags);
2587 } else if (status != NFS_OK) {
2588 ret = status;
2589 nfs4_put_lock_state(prev);
2590 goto out;
2591 }
2592 spin_lock(&state->state_lock);
2593 }
2594 }
2595 spin_unlock(&state->state_lock);
2596 nfs4_put_lock_state(prev);
2597 out:
2598 return ret;
2599 }
2600
2601 /**
2602 * nfs41_check_open_stateid - possibly free an open stateid
2603 *
2604 * @state: NFSv4 state for an inode
2605 *
2606 * Returns NFS_OK if recovery for this stateid is now finished.
2607 * Otherwise a negative NFS4ERR value is returned.
2608 */
nfs41_check_open_stateid(struct nfs4_state * state)2609 static int nfs41_check_open_stateid(struct nfs4_state *state)
2610 {
2611 struct nfs_server *server = NFS_SERVER(state->inode);
2612 nfs4_stateid *stateid = &state->open_stateid;
2613 struct rpc_cred *cred = state->owner->so_cred;
2614 int status;
2615
2616 if (test_bit(NFS_OPEN_STATE, &state->flags) == 0) {
2617 if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0) {
2618 if (nfs4_have_delegation(state->inode, state->state))
2619 return NFS_OK;
2620 return -NFS4ERR_OPENMODE;
2621 }
2622 return -NFS4ERR_BAD_STATEID;
2623 }
2624 status = nfs41_test_and_free_expired_stateid(server, stateid, cred);
2625 trace_nfs4_test_open_stateid(state, NULL, status);
2626 if (status == -NFS4ERR_EXPIRED || status == -NFS4ERR_BAD_STATEID) {
2627 clear_bit(NFS_O_RDONLY_STATE, &state->flags);
2628 clear_bit(NFS_O_WRONLY_STATE, &state->flags);
2629 clear_bit(NFS_O_RDWR_STATE, &state->flags);
2630 clear_bit(NFS_OPEN_STATE, &state->flags);
2631 stateid->type = NFS4_INVALID_STATEID_TYPE;
2632 }
2633 if (status != NFS_OK)
2634 return status;
2635 if (nfs_open_stateid_recover_openmode(state))
2636 return -NFS4ERR_OPENMODE;
2637 return NFS_OK;
2638 }
2639
nfs41_open_expired(struct nfs4_state_owner * sp,struct nfs4_state * state)2640 static int nfs41_open_expired(struct nfs4_state_owner *sp, struct nfs4_state *state)
2641 {
2642 int status;
2643
2644 nfs41_check_delegation_stateid(state);
2645 status = nfs41_check_expired_locks(state);
2646 if (status != NFS_OK)
2647 return status;
2648 status = nfs41_check_open_stateid(state);
2649 if (status != NFS_OK)
2650 status = nfs4_open_expired(sp, state);
2651 return status;
2652 }
2653 #endif
2654
2655 /*
2656 * on an EXCLUSIVE create, the server should send back a bitmask with FATTR4-*
2657 * fields corresponding to attributes that were used to store the verifier.
2658 * Make sure we clobber those fields in the later setattr call
2659 */
nfs4_exclusive_attrset(struct nfs4_opendata * opendata,struct iattr * sattr,struct nfs4_label ** label)2660 static inline void nfs4_exclusive_attrset(struct nfs4_opendata *opendata,
2661 struct iattr *sattr, struct nfs4_label **label)
2662 {
2663 const u32 *attrset = opendata->o_res.attrset;
2664
2665 if ((attrset[1] & FATTR4_WORD1_TIME_ACCESS) &&
2666 !(sattr->ia_valid & ATTR_ATIME_SET))
2667 sattr->ia_valid |= ATTR_ATIME;
2668
2669 if ((attrset[1] & FATTR4_WORD1_TIME_MODIFY) &&
2670 !(sattr->ia_valid & ATTR_MTIME_SET))
2671 sattr->ia_valid |= ATTR_MTIME;
2672
2673 /* Except MODE, it seems harmless of setting twice. */
2674 if (opendata->o_arg.createmode != NFS4_CREATE_EXCLUSIVE &&
2675 attrset[1] & FATTR4_WORD1_MODE)
2676 sattr->ia_valid &= ~ATTR_MODE;
2677
2678 if (attrset[2] & FATTR4_WORD2_SECURITY_LABEL)
2679 *label = NULL;
2680 }
2681
_nfs4_open_and_get_state(struct nfs4_opendata * opendata,fmode_t fmode,int flags,struct nfs_open_context * ctx)2682 static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
2683 fmode_t fmode,
2684 int flags,
2685 struct nfs_open_context *ctx)
2686 {
2687 struct nfs4_state_owner *sp = opendata->owner;
2688 struct nfs_server *server = sp->so_server;
2689 struct dentry *dentry;
2690 struct nfs4_state *state;
2691 unsigned int seq;
2692 int ret;
2693
2694 seq = raw_seqcount_begin(&sp->so_reclaim_seqcount);
2695
2696 ret = _nfs4_proc_open(opendata);
2697 if (ret != 0)
2698 goto out;
2699
2700 state = nfs4_opendata_to_nfs4_state(opendata);
2701 ret = PTR_ERR(state);
2702 if (IS_ERR(state))
2703 goto out;
2704 ctx->state = state;
2705 if (server->caps & NFS_CAP_POSIX_LOCK)
2706 set_bit(NFS_STATE_POSIX_LOCKS, &state->flags);
2707 if (opendata->o_res.rflags & NFS4_OPEN_RESULT_MAY_NOTIFY_LOCK)
2708 set_bit(NFS_STATE_MAY_NOTIFY_LOCK, &state->flags);
2709
2710 dentry = opendata->dentry;
2711 if (d_really_is_negative(dentry)) {
2712 struct dentry *alias;
2713 d_drop(dentry);
2714 alias = d_exact_alias(dentry, state->inode);
2715 if (!alias)
2716 alias = d_splice_alias(igrab(state->inode), dentry);
2717 /* d_splice_alias() can't fail here - it's a non-directory */
2718 if (alias) {
2719 dput(ctx->dentry);
2720 ctx->dentry = dentry = alias;
2721 }
2722 nfs_set_verifier(dentry,
2723 nfs_save_change_attribute(d_inode(opendata->dir)));
2724 }
2725
2726 ret = nfs4_opendata_access(sp->so_cred, opendata, state, fmode, flags);
2727 if (ret != 0)
2728 goto out;
2729
2730 if (d_inode(dentry) == state->inode) {
2731 nfs_inode_attach_open_context(ctx);
2732 if (read_seqcount_retry(&sp->so_reclaim_seqcount, seq))
2733 nfs4_schedule_stateid_recovery(server, state);
2734 }
2735 out:
2736 return ret;
2737 }
2738
2739 /*
2740 * Returns a referenced nfs4_state
2741 */
_nfs4_do_open(struct inode * dir,struct nfs_open_context * ctx,int flags,struct iattr * sattr,struct nfs4_label * label,int * opened)2742 static int _nfs4_do_open(struct inode *dir,
2743 struct nfs_open_context *ctx,
2744 int flags,
2745 struct iattr *sattr,
2746 struct nfs4_label *label,
2747 int *opened)
2748 {
2749 struct nfs4_state_owner *sp;
2750 struct nfs4_state *state = NULL;
2751 struct nfs_server *server = NFS_SERVER(dir);
2752 struct nfs4_opendata *opendata;
2753 struct dentry *dentry = ctx->dentry;
2754 struct rpc_cred *cred = ctx->cred;
2755 struct nfs4_threshold **ctx_th = &ctx->mdsthreshold;
2756 fmode_t fmode = ctx->mode & (FMODE_READ|FMODE_WRITE|FMODE_EXEC);
2757 enum open_claim_type4 claim = NFS4_OPEN_CLAIM_NULL;
2758 struct nfs4_label *olabel = NULL;
2759 int status;
2760
2761 /* Protect against reboot recovery conflicts */
2762 status = -ENOMEM;
2763 sp = nfs4_get_state_owner(server, cred, GFP_KERNEL);
2764 if (sp == NULL) {
2765 dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n");
2766 goto out_err;
2767 }
2768 status = nfs4_recover_expired_lease(server);
2769 if (status != 0)
2770 goto err_put_state_owner;
2771 if (d_really_is_positive(dentry))
2772 nfs4_return_incompatible_delegation(d_inode(dentry), fmode);
2773 status = -ENOMEM;
2774 if (d_really_is_positive(dentry))
2775 claim = NFS4_OPEN_CLAIM_FH;
2776 opendata = nfs4_opendata_alloc(dentry, sp, fmode, flags, sattr,
2777 label, claim, GFP_KERNEL);
2778 if (opendata == NULL)
2779 goto err_put_state_owner;
2780
2781 if (label) {
2782 olabel = nfs4_label_alloc(server, GFP_KERNEL);
2783 if (IS_ERR(olabel)) {
2784 status = PTR_ERR(olabel);
2785 goto err_opendata_put;
2786 }
2787 }
2788
2789 if (server->attr_bitmask[2] & FATTR4_WORD2_MDSTHRESHOLD) {
2790 if (!opendata->f_attr.mdsthreshold) {
2791 opendata->f_attr.mdsthreshold = pnfs_mdsthreshold_alloc();
2792 if (!opendata->f_attr.mdsthreshold)
2793 goto err_free_label;
2794 }
2795 opendata->o_arg.open_bitmap = &nfs4_pnfs_open_bitmap[0];
2796 }
2797 if (d_really_is_positive(dentry))
2798 opendata->state = nfs4_get_open_state(d_inode(dentry), sp);
2799
2800 status = _nfs4_open_and_get_state(opendata, fmode, flags, ctx);
2801 if (status != 0)
2802 goto err_free_label;
2803 state = ctx->state;
2804
2805 if ((opendata->o_arg.open_flags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL) &&
2806 (opendata->o_arg.createmode != NFS4_CREATE_GUARDED)) {
2807 nfs4_exclusive_attrset(opendata, sattr, &label);
2808 /*
2809 * send create attributes which was not set by open
2810 * with an extra setattr.
2811 */
2812 if (sattr->ia_valid & NFS4_VALID_ATTRS) {
2813 nfs_fattr_init(opendata->o_res.f_attr);
2814 status = nfs4_do_setattr(state->inode, cred,
2815 opendata->o_res.f_attr, sattr,
2816 state, label, olabel);
2817 if (status == 0) {
2818 nfs_setattr_update_inode(state->inode, sattr,
2819 opendata->o_res.f_attr);
2820 nfs_setsecurity(state->inode, opendata->o_res.f_attr, olabel);
2821 }
2822 }
2823 }
2824 if (opened && opendata->file_created)
2825 *opened |= FILE_CREATED;
2826
2827 if (pnfs_use_threshold(ctx_th, opendata->f_attr.mdsthreshold, server)) {
2828 *ctx_th = opendata->f_attr.mdsthreshold;
2829 opendata->f_attr.mdsthreshold = NULL;
2830 }
2831
2832 nfs4_label_free(olabel);
2833
2834 nfs4_opendata_put(opendata);
2835 nfs4_put_state_owner(sp);
2836 return 0;
2837 err_free_label:
2838 nfs4_label_free(olabel);
2839 err_opendata_put:
2840 nfs4_opendata_put(opendata);
2841 err_put_state_owner:
2842 nfs4_put_state_owner(sp);
2843 out_err:
2844 return status;
2845 }
2846
2847
nfs4_do_open(struct inode * dir,struct nfs_open_context * ctx,int flags,struct iattr * sattr,struct nfs4_label * label,int * opened)2848 static struct nfs4_state *nfs4_do_open(struct inode *dir,
2849 struct nfs_open_context *ctx,
2850 int flags,
2851 struct iattr *sattr,
2852 struct nfs4_label *label,
2853 int *opened)
2854 {
2855 struct nfs_server *server = NFS_SERVER(dir);
2856 struct nfs4_exception exception = { };
2857 struct nfs4_state *res;
2858 int status;
2859
2860 do {
2861 status = _nfs4_do_open(dir, ctx, flags, sattr, label, opened);
2862 res = ctx->state;
2863 trace_nfs4_open_file(ctx, flags, status);
2864 if (status == 0)
2865 break;
2866 /* NOTE: BAD_SEQID means the server and client disagree about the
2867 * book-keeping w.r.t. state-changing operations
2868 * (OPEN/CLOSE/LOCK/LOCKU...)
2869 * It is actually a sign of a bug on the client or on the server.
2870 *
2871 * If we receive a BAD_SEQID error in the particular case of
2872 * doing an OPEN, we assume that nfs_increment_open_seqid() will
2873 * have unhashed the old state_owner for us, and that we can
2874 * therefore safely retry using a new one. We should still warn
2875 * the user though...
2876 */
2877 if (status == -NFS4ERR_BAD_SEQID) {
2878 pr_warn_ratelimited("NFS: v4 server %s "
2879 " returned a bad sequence-id error!\n",
2880 NFS_SERVER(dir)->nfs_client->cl_hostname);
2881 exception.retry = 1;
2882 continue;
2883 }
2884 /*
2885 * BAD_STATEID on OPEN means that the server cancelled our
2886 * state before it received the OPEN_CONFIRM.
2887 * Recover by retrying the request as per the discussion
2888 * on Page 181 of RFC3530.
2889 */
2890 if (status == -NFS4ERR_BAD_STATEID) {
2891 exception.retry = 1;
2892 continue;
2893 }
2894 if (status == -EAGAIN) {
2895 /* We must have found a delegation */
2896 exception.retry = 1;
2897 continue;
2898 }
2899 if (nfs4_clear_cap_atomic_open_v1(server, status, &exception))
2900 continue;
2901 res = ERR_PTR(nfs4_handle_exception(server,
2902 status, &exception));
2903 } while (exception.retry);
2904 return res;
2905 }
2906
_nfs4_do_setattr(struct inode * inode,struct nfs_setattrargs * arg,struct nfs_setattrres * res,struct rpc_cred * cred,struct nfs4_state * state)2907 static int _nfs4_do_setattr(struct inode *inode,
2908 struct nfs_setattrargs *arg,
2909 struct nfs_setattrres *res,
2910 struct rpc_cred *cred,
2911 struct nfs4_state *state)
2912 {
2913 struct nfs_server *server = NFS_SERVER(inode);
2914 struct rpc_message msg = {
2915 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETATTR],
2916 .rpc_argp = arg,
2917 .rpc_resp = res,
2918 .rpc_cred = cred,
2919 };
2920 struct rpc_cred *delegation_cred = NULL;
2921 unsigned long timestamp = jiffies;
2922 fmode_t fmode;
2923 bool truncate;
2924 int status;
2925
2926 nfs_fattr_init(res->fattr);
2927
2928 /* Servers should only apply open mode checks for file size changes */
2929 truncate = (arg->iap->ia_valid & ATTR_SIZE) ? true : false;
2930 fmode = truncate ? FMODE_WRITE : FMODE_READ;
2931
2932 if (nfs4_copy_delegation_stateid(inode, fmode, &arg->stateid, &delegation_cred)) {
2933 /* Use that stateid */
2934 } else if (truncate && state != NULL) {
2935 struct nfs_lockowner lockowner = {
2936 .l_owner = current->files,
2937 .l_pid = current->tgid,
2938 };
2939 if (!nfs4_valid_open_stateid(state))
2940 return -EBADF;
2941 if (nfs4_select_rw_stateid(state, FMODE_WRITE, &lockowner,
2942 &arg->stateid, &delegation_cred) == -EIO)
2943 return -EBADF;
2944 } else
2945 nfs4_stateid_copy(&arg->stateid, &zero_stateid);
2946 if (delegation_cred)
2947 msg.rpc_cred = delegation_cred;
2948
2949 status = nfs4_call_sync(server->client, server, &msg, &arg->seq_args, &res->seq_res, 1);
2950
2951 put_rpccred(delegation_cred);
2952 if (status == 0 && state != NULL)
2953 renew_lease(server, timestamp);
2954 trace_nfs4_setattr(inode, &arg->stateid, status);
2955 return status;
2956 }
2957
nfs4_do_setattr(struct inode * inode,struct rpc_cred * cred,struct nfs_fattr * fattr,struct iattr * sattr,struct nfs4_state * state,struct nfs4_label * ilabel,struct nfs4_label * olabel)2958 static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
2959 struct nfs_fattr *fattr, struct iattr *sattr,
2960 struct nfs4_state *state, struct nfs4_label *ilabel,
2961 struct nfs4_label *olabel)
2962 {
2963 struct nfs_server *server = NFS_SERVER(inode);
2964 struct nfs_setattrargs arg = {
2965 .fh = NFS_FH(inode),
2966 .iap = sattr,
2967 .server = server,
2968 .bitmask = server->attr_bitmask,
2969 .label = ilabel,
2970 };
2971 struct nfs_setattrres res = {
2972 .fattr = fattr,
2973 .label = olabel,
2974 .server = server,
2975 };
2976 struct nfs4_exception exception = {
2977 .state = state,
2978 .inode = inode,
2979 .stateid = &arg.stateid,
2980 };
2981 int err;
2982
2983 arg.bitmask = nfs4_bitmask(server, ilabel);
2984 if (ilabel)
2985 arg.bitmask = nfs4_bitmask(server, olabel);
2986
2987 do {
2988 err = _nfs4_do_setattr(inode, &arg, &res, cred, state);
2989 switch (err) {
2990 case -NFS4ERR_OPENMODE:
2991 if (!(sattr->ia_valid & ATTR_SIZE)) {
2992 pr_warn_once("NFSv4: server %s is incorrectly "
2993 "applying open mode checks to "
2994 "a SETATTR that is not "
2995 "changing file size.\n",
2996 server->nfs_client->cl_hostname);
2997 }
2998 if (state && !(state->state & FMODE_WRITE)) {
2999 err = -EBADF;
3000 if (sattr->ia_valid & ATTR_OPEN)
3001 err = -EACCES;
3002 goto out;
3003 }
3004 }
3005 err = nfs4_handle_exception(server, err, &exception);
3006 } while (exception.retry);
3007 out:
3008 return err;
3009 }
3010
3011 static bool
nfs4_wait_on_layoutreturn(struct inode * inode,struct rpc_task * task)3012 nfs4_wait_on_layoutreturn(struct inode *inode, struct rpc_task *task)
3013 {
3014 if (inode == NULL || !nfs_have_layout(inode))
3015 return false;
3016
3017 return pnfs_wait_on_layoutreturn(inode, task);
3018 }
3019
3020 struct nfs4_closedata {
3021 struct inode *inode;
3022 struct nfs4_state *state;
3023 struct nfs_closeargs arg;
3024 struct nfs_closeres res;
3025 struct nfs_fattr fattr;
3026 unsigned long timestamp;
3027 bool roc;
3028 u32 roc_barrier;
3029 };
3030
nfs4_free_closedata(void * data)3031 static void nfs4_free_closedata(void *data)
3032 {
3033 struct nfs4_closedata *calldata = data;
3034 struct nfs4_state_owner *sp = calldata->state->owner;
3035 struct super_block *sb = calldata->state->inode->i_sb;
3036
3037 if (calldata->roc)
3038 pnfs_roc_release(calldata->state->inode);
3039 nfs4_put_open_state(calldata->state);
3040 nfs_free_seqid(calldata->arg.seqid);
3041 nfs4_put_state_owner(sp);
3042 nfs_sb_deactive(sb);
3043 kfree(calldata);
3044 }
3045
nfs4_close_done(struct rpc_task * task,void * data)3046 static void nfs4_close_done(struct rpc_task *task, void *data)
3047 {
3048 struct nfs4_closedata *calldata = data;
3049 struct nfs4_state *state = calldata->state;
3050 struct nfs_server *server = NFS_SERVER(calldata->inode);
3051 nfs4_stateid *res_stateid = NULL;
3052
3053 dprintk("%s: begin!\n", __func__);
3054 if (!nfs4_sequence_done(task, &calldata->res.seq_res))
3055 return;
3056 trace_nfs4_close(state, &calldata->arg, &calldata->res, task->tk_status);
3057 /* hmm. we are done with the inode, and in the process of freeing
3058 * the state_owner. we keep this around to process errors
3059 */
3060 switch (task->tk_status) {
3061 case 0:
3062 res_stateid = &calldata->res.stateid;
3063 if (calldata->roc)
3064 pnfs_roc_set_barrier(state->inode,
3065 calldata->roc_barrier);
3066 renew_lease(server, calldata->timestamp);
3067 break;
3068 case -NFS4ERR_ADMIN_REVOKED:
3069 case -NFS4ERR_STALE_STATEID:
3070 case -NFS4ERR_EXPIRED:
3071 nfs4_free_revoked_stateid(server,
3072 &calldata->arg.stateid,
3073 task->tk_msg.rpc_cred);
3074 case -NFS4ERR_OLD_STATEID:
3075 case -NFS4ERR_BAD_STATEID:
3076 if (!nfs4_stateid_match(&calldata->arg.stateid,
3077 &state->open_stateid)) {
3078 rpc_restart_call_prepare(task);
3079 goto out_release;
3080 }
3081 if (calldata->arg.fmode == 0)
3082 break;
3083 default:
3084 if (nfs4_async_handle_error(task, server, state, NULL) == -EAGAIN) {
3085 rpc_restart_call_prepare(task);
3086 goto out_release;
3087 }
3088 }
3089 nfs_clear_open_stateid(state, &calldata->arg.stateid,
3090 res_stateid, calldata->arg.fmode);
3091 out_release:
3092 nfs_release_seqid(calldata->arg.seqid);
3093 nfs_refresh_inode(calldata->inode, calldata->res.fattr);
3094 dprintk("%s: done, ret = %d!\n", __func__, task->tk_status);
3095 }
3096
nfs4_close_prepare(struct rpc_task * task,void * data)3097 static void nfs4_close_prepare(struct rpc_task *task, void *data)
3098 {
3099 struct nfs4_closedata *calldata = data;
3100 struct nfs4_state *state = calldata->state;
3101 struct inode *inode = calldata->inode;
3102 bool is_rdonly, is_wronly, is_rdwr;
3103 int call_close = 0;
3104
3105 dprintk("%s: begin!\n", __func__);
3106 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
3107 goto out_wait;
3108
3109 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_DOWNGRADE];
3110 spin_lock(&state->owner->so_lock);
3111 is_rdwr = test_bit(NFS_O_RDWR_STATE, &state->flags);
3112 is_rdonly = test_bit(NFS_O_RDONLY_STATE, &state->flags);
3113 is_wronly = test_bit(NFS_O_WRONLY_STATE, &state->flags);
3114 nfs4_stateid_copy(&calldata->arg.stateid, &state->open_stateid);
3115 /* Calculate the change in open mode */
3116 calldata->arg.fmode = 0;
3117 if (state->n_rdwr == 0) {
3118 if (state->n_rdonly == 0)
3119 call_close |= is_rdonly;
3120 else if (is_rdonly)
3121 calldata->arg.fmode |= FMODE_READ;
3122 if (state->n_wronly == 0)
3123 call_close |= is_wronly;
3124 else if (is_wronly)
3125 calldata->arg.fmode |= FMODE_WRITE;
3126 if (calldata->arg.fmode != (FMODE_READ|FMODE_WRITE))
3127 call_close |= is_rdwr;
3128 } else if (is_rdwr)
3129 calldata->arg.fmode |= FMODE_READ|FMODE_WRITE;
3130
3131 if (!nfs4_valid_open_stateid(state) ||
3132 test_bit(NFS_OPEN_STATE, &state->flags) == 0)
3133 call_close = 0;
3134 spin_unlock(&state->owner->so_lock);
3135
3136 if (!call_close) {
3137 /* Note: exit _without_ calling nfs4_close_done */
3138 goto out_no_action;
3139 }
3140
3141 if (nfs4_wait_on_layoutreturn(inode, task)) {
3142 nfs_release_seqid(calldata->arg.seqid);
3143 goto out_wait;
3144 }
3145
3146 if (calldata->arg.fmode == 0)
3147 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE];
3148 if (calldata->roc)
3149 pnfs_roc_get_barrier(inode, &calldata->roc_barrier);
3150
3151 calldata->arg.share_access =
3152 nfs4_map_atomic_open_share(NFS_SERVER(inode),
3153 calldata->arg.fmode, 0);
3154
3155 nfs_fattr_init(calldata->res.fattr);
3156 calldata->timestamp = jiffies;
3157 if (nfs4_setup_sequence(NFS_SERVER(inode),
3158 &calldata->arg.seq_args,
3159 &calldata->res.seq_res,
3160 task) != 0)
3161 nfs_release_seqid(calldata->arg.seqid);
3162 dprintk("%s: done!\n", __func__);
3163 return;
3164 out_no_action:
3165 task->tk_action = NULL;
3166 out_wait:
3167 nfs4_sequence_done(task, &calldata->res.seq_res);
3168 }
3169
3170 static const struct rpc_call_ops nfs4_close_ops = {
3171 .rpc_call_prepare = nfs4_close_prepare,
3172 .rpc_call_done = nfs4_close_done,
3173 .rpc_release = nfs4_free_closedata,
3174 };
3175
nfs4_roc(struct inode * inode)3176 static bool nfs4_roc(struct inode *inode)
3177 {
3178 if (!nfs_have_layout(inode))
3179 return false;
3180 return pnfs_roc(inode);
3181 }
3182
3183 /*
3184 * It is possible for data to be read/written from a mem-mapped file
3185 * after the sys_close call (which hits the vfs layer as a flush).
3186 * This means that we can't safely call nfsv4 close on a file until
3187 * the inode is cleared. This in turn means that we are not good
3188 * NFSv4 citizens - we do not indicate to the server to update the file's
3189 * share state even when we are done with one of the three share
3190 * stateid's in the inode.
3191 *
3192 * NOTE: Caller must be holding the sp->so_owner semaphore!
3193 */
nfs4_do_close(struct nfs4_state * state,gfp_t gfp_mask,int wait)3194 int nfs4_do_close(struct nfs4_state *state, gfp_t gfp_mask, int wait)
3195 {
3196 struct nfs_server *server = NFS_SERVER(state->inode);
3197 struct nfs_seqid *(*alloc_seqid)(struct nfs_seqid_counter *, gfp_t);
3198 struct nfs4_closedata *calldata;
3199 struct nfs4_state_owner *sp = state->owner;
3200 struct rpc_task *task;
3201 struct rpc_message msg = {
3202 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE],
3203 .rpc_cred = state->owner->so_cred,
3204 };
3205 struct rpc_task_setup task_setup_data = {
3206 .rpc_client = server->client,
3207 .rpc_message = &msg,
3208 .callback_ops = &nfs4_close_ops,
3209 .workqueue = nfsiod_workqueue,
3210 .flags = RPC_TASK_ASYNC,
3211 };
3212 int status = -ENOMEM;
3213
3214 nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_CLEANUP,
3215 &task_setup_data.rpc_client, &msg);
3216
3217 calldata = kzalloc(sizeof(*calldata), gfp_mask);
3218 if (calldata == NULL)
3219 goto out;
3220 nfs4_init_sequence(&calldata->arg.seq_args, &calldata->res.seq_res, 1);
3221 calldata->inode = state->inode;
3222 calldata->state = state;
3223 calldata->arg.fh = NFS_FH(state->inode);
3224 /* Serialization for the sequence id */
3225 alloc_seqid = server->nfs_client->cl_mvops->alloc_seqid;
3226 calldata->arg.seqid = alloc_seqid(&state->owner->so_seqid, gfp_mask);
3227 if (IS_ERR(calldata->arg.seqid))
3228 goto out_free_calldata;
3229 calldata->arg.fmode = 0;
3230 calldata->arg.bitmask = server->cache_consistency_bitmask;
3231 calldata->res.fattr = &calldata->fattr;
3232 calldata->res.seqid = calldata->arg.seqid;
3233 calldata->res.server = server;
3234 calldata->roc = nfs4_roc(state->inode);
3235 nfs_sb_active(calldata->inode->i_sb);
3236
3237 msg.rpc_argp = &calldata->arg;
3238 msg.rpc_resp = &calldata->res;
3239 task_setup_data.callback_data = calldata;
3240 task = rpc_run_task(&task_setup_data);
3241 if (IS_ERR(task))
3242 return PTR_ERR(task);
3243 status = 0;
3244 if (wait)
3245 status = rpc_wait_for_completion_task(task);
3246 rpc_put_task(task);
3247 return status;
3248 out_free_calldata:
3249 kfree(calldata);
3250 out:
3251 nfs4_put_open_state(state);
3252 nfs4_put_state_owner(sp);
3253 return status;
3254 }
3255
3256 static struct inode *
nfs4_atomic_open(struct inode * dir,struct nfs_open_context * ctx,int open_flags,struct iattr * attr,int * opened)3257 nfs4_atomic_open(struct inode *dir, struct nfs_open_context *ctx,
3258 int open_flags, struct iattr *attr, int *opened)
3259 {
3260 struct nfs4_state *state;
3261 struct nfs4_label l = {0, 0, 0, NULL}, *label = NULL;
3262
3263 label = nfs4_label_init_security(dir, ctx->dentry, attr, &l);
3264
3265 /* Protect against concurrent sillydeletes */
3266 state = nfs4_do_open(dir, ctx, open_flags, attr, label, opened);
3267
3268 nfs4_label_release_security(label);
3269
3270 if (IS_ERR(state))
3271 return ERR_CAST(state);
3272 return state->inode;
3273 }
3274
nfs4_close_context(struct nfs_open_context * ctx,int is_sync)3275 static void nfs4_close_context(struct nfs_open_context *ctx, int is_sync)
3276 {
3277 if (ctx->state == NULL)
3278 return;
3279 if (is_sync)
3280 nfs4_close_sync(ctx->state, ctx->mode);
3281 else
3282 nfs4_close_state(ctx->state, ctx->mode);
3283 }
3284
3285 #define FATTR4_WORD1_NFS40_MASK (2*FATTR4_WORD1_MOUNTED_ON_FILEID - 1UL)
3286 #define FATTR4_WORD2_NFS41_MASK (2*FATTR4_WORD2_SUPPATTR_EXCLCREAT - 1UL)
3287 #define FATTR4_WORD2_NFS42_MASK (2*FATTR4_WORD2_SECURITY_LABEL - 1UL)
3288
_nfs4_server_capabilities(struct nfs_server * server,struct nfs_fh * fhandle)3289 static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
3290 {
3291 u32 bitmask[3] = {}, minorversion = server->nfs_client->cl_minorversion;
3292 struct nfs4_server_caps_arg args = {
3293 .fhandle = fhandle,
3294 .bitmask = bitmask,
3295 };
3296 struct nfs4_server_caps_res res = {};
3297 struct rpc_message msg = {
3298 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SERVER_CAPS],
3299 .rpc_argp = &args,
3300 .rpc_resp = &res,
3301 };
3302 int status;
3303 int i;
3304
3305 bitmask[0] = FATTR4_WORD0_SUPPORTED_ATTRS |
3306 FATTR4_WORD0_FH_EXPIRE_TYPE |
3307 FATTR4_WORD0_LINK_SUPPORT |
3308 FATTR4_WORD0_SYMLINK_SUPPORT |
3309 FATTR4_WORD0_ACLSUPPORT;
3310 if (minorversion)
3311 bitmask[2] = FATTR4_WORD2_SUPPATTR_EXCLCREAT;
3312
3313 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
3314 if (status == 0) {
3315 /* Sanity check the server answers */
3316 switch (minorversion) {
3317 case 0:
3318 res.attr_bitmask[1] &= FATTR4_WORD1_NFS40_MASK;
3319 res.attr_bitmask[2] = 0;
3320 break;
3321 case 1:
3322 res.attr_bitmask[2] &= FATTR4_WORD2_NFS41_MASK;
3323 break;
3324 case 2:
3325 res.attr_bitmask[2] &= FATTR4_WORD2_NFS42_MASK;
3326 }
3327 memcpy(server->attr_bitmask, res.attr_bitmask, sizeof(server->attr_bitmask));
3328 server->caps &= ~(NFS_CAP_ACLS|NFS_CAP_HARDLINKS|
3329 NFS_CAP_SYMLINKS|NFS_CAP_FILEID|
3330 NFS_CAP_MODE|NFS_CAP_NLINK|NFS_CAP_OWNER|
3331 NFS_CAP_OWNER_GROUP|NFS_CAP_ATIME|
3332 NFS_CAP_CTIME|NFS_CAP_MTIME|
3333 NFS_CAP_SECURITY_LABEL);
3334 if (res.attr_bitmask[0] & FATTR4_WORD0_ACL &&
3335 res.acl_bitmask & ACL4_SUPPORT_ALLOW_ACL)
3336 server->caps |= NFS_CAP_ACLS;
3337 if (res.has_links != 0)
3338 server->caps |= NFS_CAP_HARDLINKS;
3339 if (res.has_symlinks != 0)
3340 server->caps |= NFS_CAP_SYMLINKS;
3341 if (res.attr_bitmask[0] & FATTR4_WORD0_FILEID)
3342 server->caps |= NFS_CAP_FILEID;
3343 if (res.attr_bitmask[1] & FATTR4_WORD1_MODE)
3344 server->caps |= NFS_CAP_MODE;
3345 if (res.attr_bitmask[1] & FATTR4_WORD1_NUMLINKS)
3346 server->caps |= NFS_CAP_NLINK;
3347 if (res.attr_bitmask[1] & FATTR4_WORD1_OWNER)
3348 server->caps |= NFS_CAP_OWNER;
3349 if (res.attr_bitmask[1] & FATTR4_WORD1_OWNER_GROUP)
3350 server->caps |= NFS_CAP_OWNER_GROUP;
3351 if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_ACCESS)
3352 server->caps |= NFS_CAP_ATIME;
3353 if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_METADATA)
3354 server->caps |= NFS_CAP_CTIME;
3355 if (res.attr_bitmask[1] & FATTR4_WORD1_TIME_MODIFY)
3356 server->caps |= NFS_CAP_MTIME;
3357 #ifdef CONFIG_NFS_V4_SECURITY_LABEL
3358 if (res.attr_bitmask[2] & FATTR4_WORD2_SECURITY_LABEL)
3359 server->caps |= NFS_CAP_SECURITY_LABEL;
3360 #endif
3361 memcpy(server->attr_bitmask_nl, res.attr_bitmask,
3362 sizeof(server->attr_bitmask));
3363 server->attr_bitmask_nl[2] &= ~FATTR4_WORD2_SECURITY_LABEL;
3364
3365 memcpy(server->cache_consistency_bitmask, res.attr_bitmask, sizeof(server->cache_consistency_bitmask));
3366 server->cache_consistency_bitmask[0] &= FATTR4_WORD0_CHANGE|FATTR4_WORD0_SIZE;
3367 server->cache_consistency_bitmask[1] &= FATTR4_WORD1_TIME_METADATA|FATTR4_WORD1_TIME_MODIFY;
3368 server->cache_consistency_bitmask[2] = 0;
3369
3370 /* Avoid a regression due to buggy server */
3371 for (i = 0; i < ARRAY_SIZE(res.exclcreat_bitmask); i++)
3372 res.exclcreat_bitmask[i] &= res.attr_bitmask[i];
3373 memcpy(server->exclcreat_bitmask, res.exclcreat_bitmask,
3374 sizeof(server->exclcreat_bitmask));
3375
3376 server->acl_bitmask = res.acl_bitmask;
3377 server->fh_expire_type = res.fh_expire_type;
3378 }
3379
3380 return status;
3381 }
3382
nfs4_server_capabilities(struct nfs_server * server,struct nfs_fh * fhandle)3383 int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
3384 {
3385 struct nfs4_exception exception = { };
3386 int err;
3387 do {
3388 err = nfs4_handle_exception(server,
3389 _nfs4_server_capabilities(server, fhandle),
3390 &exception);
3391 } while (exception.retry);
3392 return err;
3393 }
3394
_nfs4_lookup_root(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsinfo * info)3395 static int _nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
3396 struct nfs_fsinfo *info)
3397 {
3398 u32 bitmask[3];
3399 struct nfs4_lookup_root_arg args = {
3400 .bitmask = bitmask,
3401 };
3402 struct nfs4_lookup_res res = {
3403 .server = server,
3404 .fattr = info->fattr,
3405 .fh = fhandle,
3406 };
3407 struct rpc_message msg = {
3408 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP_ROOT],
3409 .rpc_argp = &args,
3410 .rpc_resp = &res,
3411 };
3412
3413 bitmask[0] = nfs4_fattr_bitmap[0];
3414 bitmask[1] = nfs4_fattr_bitmap[1];
3415 /*
3416 * Process the label in the upcoming getfattr
3417 */
3418 bitmask[2] = nfs4_fattr_bitmap[2] & ~FATTR4_WORD2_SECURITY_LABEL;
3419
3420 nfs_fattr_init(info->fattr);
3421 return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
3422 }
3423
nfs4_lookup_root(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsinfo * info)3424 static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
3425 struct nfs_fsinfo *info)
3426 {
3427 struct nfs4_exception exception = { };
3428 int err;
3429 do {
3430 err = _nfs4_lookup_root(server, fhandle, info);
3431 trace_nfs4_lookup_root(server, fhandle, info->fattr, err);
3432 switch (err) {
3433 case 0:
3434 case -NFS4ERR_WRONGSEC:
3435 goto out;
3436 default:
3437 err = nfs4_handle_exception(server, err, &exception);
3438 }
3439 } while (exception.retry);
3440 out:
3441 return err;
3442 }
3443
nfs4_lookup_root_sec(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsinfo * info,rpc_authflavor_t flavor)3444 static int nfs4_lookup_root_sec(struct nfs_server *server, struct nfs_fh *fhandle,
3445 struct nfs_fsinfo *info, rpc_authflavor_t flavor)
3446 {
3447 struct rpc_auth_create_args auth_args = {
3448 .pseudoflavor = flavor,
3449 };
3450 struct rpc_auth *auth;
3451 int ret;
3452
3453 auth = rpcauth_create(&auth_args, server->client);
3454 if (IS_ERR(auth)) {
3455 ret = -EACCES;
3456 goto out;
3457 }
3458 ret = nfs4_lookup_root(server, fhandle, info);
3459 out:
3460 return ret;
3461 }
3462
3463 /*
3464 * Retry pseudoroot lookup with various security flavors. We do this when:
3465 *
3466 * NFSv4.0: the PUTROOTFH operation returns NFS4ERR_WRONGSEC
3467 * NFSv4.1: the server does not support the SECINFO_NO_NAME operation
3468 *
3469 * Returns zero on success, or a negative NFS4ERR value, or a
3470 * negative errno value.
3471 */
nfs4_find_root_sec(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsinfo * info)3472 static int nfs4_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle,
3473 struct nfs_fsinfo *info)
3474 {
3475 /* Per 3530bis 15.33.5 */
3476 static const rpc_authflavor_t flav_array[] = {
3477 RPC_AUTH_GSS_KRB5P,
3478 RPC_AUTH_GSS_KRB5I,
3479 RPC_AUTH_GSS_KRB5,
3480 RPC_AUTH_UNIX, /* courtesy */
3481 RPC_AUTH_NULL,
3482 };
3483 int status = -EPERM;
3484 size_t i;
3485
3486 if (server->auth_info.flavor_len > 0) {
3487 /* try each flavor specified by user */
3488 for (i = 0; i < server->auth_info.flavor_len; i++) {
3489 status = nfs4_lookup_root_sec(server, fhandle, info,
3490 server->auth_info.flavors[i]);
3491 if (status == -NFS4ERR_WRONGSEC || status == -EACCES)
3492 continue;
3493 break;
3494 }
3495 } else {
3496 /* no flavors specified by user, try default list */
3497 for (i = 0; i < ARRAY_SIZE(flav_array); i++) {
3498 status = nfs4_lookup_root_sec(server, fhandle, info,
3499 flav_array[i]);
3500 if (status == -NFS4ERR_WRONGSEC || status == -EACCES)
3501 continue;
3502 break;
3503 }
3504 }
3505
3506 /*
3507 * -EACCESS could mean that the user doesn't have correct permissions
3508 * to access the mount. It could also mean that we tried to mount
3509 * with a gss auth flavor, but rpc.gssd isn't running. Either way,
3510 * existing mount programs don't handle -EACCES very well so it should
3511 * be mapped to -EPERM instead.
3512 */
3513 if (status == -EACCES)
3514 status = -EPERM;
3515 return status;
3516 }
3517
3518 /**
3519 * nfs4_proc_get_rootfh - get file handle for server's pseudoroot
3520 * @server: initialized nfs_server handle
3521 * @fhandle: we fill in the pseudo-fs root file handle
3522 * @info: we fill in an FSINFO struct
3523 * @auth_probe: probe the auth flavours
3524 *
3525 * Returns zero on success, or a negative errno.
3526 */
nfs4_proc_get_rootfh(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsinfo * info,bool auth_probe)3527 int nfs4_proc_get_rootfh(struct nfs_server *server, struct nfs_fh *fhandle,
3528 struct nfs_fsinfo *info,
3529 bool auth_probe)
3530 {
3531 int status = 0;
3532
3533 if (!auth_probe)
3534 status = nfs4_lookup_root(server, fhandle, info);
3535
3536 if (auth_probe || status == NFS4ERR_WRONGSEC)
3537 status = server->nfs_client->cl_mvops->find_root_sec(server,
3538 fhandle, info);
3539
3540 if (status == 0)
3541 status = nfs4_server_capabilities(server, fhandle);
3542 if (status == 0)
3543 status = nfs4_do_fsinfo(server, fhandle, info);
3544
3545 return nfs4_map_errors(status);
3546 }
3547
nfs4_proc_get_root(struct nfs_server * server,struct nfs_fh * mntfh,struct nfs_fsinfo * info)3548 static int nfs4_proc_get_root(struct nfs_server *server, struct nfs_fh *mntfh,
3549 struct nfs_fsinfo *info)
3550 {
3551 int error;
3552 struct nfs_fattr *fattr = info->fattr;
3553 struct nfs4_label *label = NULL;
3554
3555 error = nfs4_server_capabilities(server, mntfh);
3556 if (error < 0) {
3557 dprintk("nfs4_get_root: getcaps error = %d\n", -error);
3558 return error;
3559 }
3560
3561 label = nfs4_label_alloc(server, GFP_KERNEL);
3562 if (IS_ERR(label))
3563 return PTR_ERR(label);
3564
3565 error = nfs4_proc_getattr(server, mntfh, fattr, label);
3566 if (error < 0) {
3567 dprintk("nfs4_get_root: getattr error = %d\n", -error);
3568 goto err_free_label;
3569 }
3570
3571 if (fattr->valid & NFS_ATTR_FATTR_FSID &&
3572 !nfs_fsid_equal(&server->fsid, &fattr->fsid))
3573 memcpy(&server->fsid, &fattr->fsid, sizeof(server->fsid));
3574
3575 err_free_label:
3576 nfs4_label_free(label);
3577
3578 return error;
3579 }
3580
3581 /*
3582 * Get locations and (maybe) other attributes of a referral.
3583 * Note that we'll actually follow the referral later when
3584 * we detect fsid mismatch in inode revalidation
3585 */
nfs4_get_referral(struct rpc_clnt * client,struct inode * dir,const struct qstr * name,struct nfs_fattr * fattr,struct nfs_fh * fhandle)3586 static int nfs4_get_referral(struct rpc_clnt *client, struct inode *dir,
3587 const struct qstr *name, struct nfs_fattr *fattr,
3588 struct nfs_fh *fhandle)
3589 {
3590 int status = -ENOMEM;
3591 struct page *page = NULL;
3592 struct nfs4_fs_locations *locations = NULL;
3593
3594 page = alloc_page(GFP_KERNEL);
3595 if (page == NULL)
3596 goto out;
3597 locations = kmalloc(sizeof(struct nfs4_fs_locations), GFP_KERNEL);
3598 if (locations == NULL)
3599 goto out;
3600
3601 status = nfs4_proc_fs_locations(client, dir, name, locations, page);
3602 if (status != 0)
3603 goto out;
3604
3605 /*
3606 * If the fsid didn't change, this is a migration event, not a
3607 * referral. Cause us to drop into the exception handler, which
3608 * will kick off migration recovery.
3609 */
3610 if (nfs_fsid_equal(&NFS_SERVER(dir)->fsid, &locations->fattr.fsid)) {
3611 dprintk("%s: server did not return a different fsid for"
3612 " a referral at %s\n", __func__, name->name);
3613 status = -NFS4ERR_MOVED;
3614 goto out;
3615 }
3616 /* Fixup attributes for the nfs_lookup() call to nfs_fhget() */
3617 nfs_fixup_referral_attributes(&locations->fattr);
3618
3619 /* replace the lookup nfs_fattr with the locations nfs_fattr */
3620 memcpy(fattr, &locations->fattr, sizeof(struct nfs_fattr));
3621 memset(fhandle, 0, sizeof(struct nfs_fh));
3622 out:
3623 if (page)
3624 __free_page(page);
3625 kfree(locations);
3626 return status;
3627 }
3628
_nfs4_proc_getattr(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fattr * fattr,struct nfs4_label * label)3629 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
3630 struct nfs_fattr *fattr, struct nfs4_label *label)
3631 {
3632 struct nfs4_getattr_arg args = {
3633 .fh = fhandle,
3634 .bitmask = server->attr_bitmask,
3635 };
3636 struct nfs4_getattr_res res = {
3637 .fattr = fattr,
3638 .label = label,
3639 .server = server,
3640 };
3641 struct rpc_message msg = {
3642 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETATTR],
3643 .rpc_argp = &args,
3644 .rpc_resp = &res,
3645 };
3646
3647 args.bitmask = nfs4_bitmask(server, label);
3648
3649 nfs_fattr_init(fattr);
3650 return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
3651 }
3652
nfs4_proc_getattr(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fattr * fattr,struct nfs4_label * label)3653 static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
3654 struct nfs_fattr *fattr, struct nfs4_label *label)
3655 {
3656 struct nfs4_exception exception = { };
3657 int err;
3658 do {
3659 err = _nfs4_proc_getattr(server, fhandle, fattr, label);
3660 trace_nfs4_getattr(server, fhandle, fattr, err);
3661 err = nfs4_handle_exception(server, err,
3662 &exception);
3663 } while (exception.retry);
3664 return err;
3665 }
3666
3667 /*
3668 * The file is not closed if it is opened due to the a request to change
3669 * the size of the file. The open call will not be needed once the
3670 * VFS layer lookup-intents are implemented.
3671 *
3672 * Close is called when the inode is destroyed.
3673 * If we haven't opened the file for O_WRONLY, we
3674 * need to in the size_change case to obtain a stateid.
3675 *
3676 * Got race?
3677 * Because OPEN is always done by name in nfsv4, it is
3678 * possible that we opened a different file by the same
3679 * name. We can recognize this race condition, but we
3680 * can't do anything about it besides returning an error.
3681 *
3682 * This will be fixed with VFS changes (lookup-intent).
3683 */
3684 static int
nfs4_proc_setattr(struct dentry * dentry,struct nfs_fattr * fattr,struct iattr * sattr)3685 nfs4_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,
3686 struct iattr *sattr)
3687 {
3688 struct inode *inode = d_inode(dentry);
3689 struct rpc_cred *cred = NULL;
3690 struct nfs4_state *state = NULL;
3691 struct nfs4_label *label = NULL;
3692 int status;
3693
3694 if (pnfs_ld_layoutret_on_setattr(inode) &&
3695 sattr->ia_valid & ATTR_SIZE &&
3696 sattr->ia_size < i_size_read(inode))
3697 pnfs_commit_and_return_layout(inode);
3698
3699 nfs_fattr_init(fattr);
3700
3701 /* Deal with open(O_TRUNC) */
3702 if (sattr->ia_valid & ATTR_OPEN)
3703 sattr->ia_valid &= ~(ATTR_MTIME|ATTR_CTIME);
3704
3705 /* Optimization: if the end result is no change, don't RPC */
3706 if ((sattr->ia_valid & ~(ATTR_FILE|ATTR_OPEN)) == 0)
3707 return 0;
3708
3709 /* Search for an existing open(O_WRITE) file */
3710 if (sattr->ia_valid & ATTR_FILE) {
3711 struct nfs_open_context *ctx;
3712
3713 ctx = nfs_file_open_context(sattr->ia_file);
3714 if (ctx) {
3715 cred = ctx->cred;
3716 state = ctx->state;
3717 }
3718 }
3719
3720 label = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL);
3721 if (IS_ERR(label))
3722 return PTR_ERR(label);
3723
3724 status = nfs4_do_setattr(inode, cred, fattr, sattr, state, NULL, label);
3725 if (status == 0) {
3726 nfs_setattr_update_inode(inode, sattr, fattr);
3727 nfs_setsecurity(inode, fattr, label);
3728 }
3729 nfs4_label_free(label);
3730 return status;
3731 }
3732
_nfs4_proc_lookup(struct rpc_clnt * clnt,struct inode * dir,const struct qstr * name,struct nfs_fh * fhandle,struct nfs_fattr * fattr,struct nfs4_label * label)3733 static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
3734 const struct qstr *name, struct nfs_fh *fhandle,
3735 struct nfs_fattr *fattr, struct nfs4_label *label)
3736 {
3737 struct nfs_server *server = NFS_SERVER(dir);
3738 int status;
3739 struct nfs4_lookup_arg args = {
3740 .bitmask = server->attr_bitmask,
3741 .dir_fh = NFS_FH(dir),
3742 .name = name,
3743 };
3744 struct nfs4_lookup_res res = {
3745 .server = server,
3746 .fattr = fattr,
3747 .label = label,
3748 .fh = fhandle,
3749 };
3750 struct rpc_message msg = {
3751 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOOKUP],
3752 .rpc_argp = &args,
3753 .rpc_resp = &res,
3754 };
3755
3756 args.bitmask = nfs4_bitmask(server, label);
3757
3758 nfs_fattr_init(fattr);
3759
3760 dprintk("NFS call lookup %s\n", name->name);
3761 status = nfs4_call_sync(clnt, server, &msg, &args.seq_args, &res.seq_res, 0);
3762 dprintk("NFS reply lookup: %d\n", status);
3763 return status;
3764 }
3765
nfs_fixup_secinfo_attributes(struct nfs_fattr * fattr)3766 static void nfs_fixup_secinfo_attributes(struct nfs_fattr *fattr)
3767 {
3768 fattr->valid |= NFS_ATTR_FATTR_TYPE | NFS_ATTR_FATTR_MODE |
3769 NFS_ATTR_FATTR_NLINK | NFS_ATTR_FATTR_MOUNTPOINT;
3770 fattr->mode = S_IFDIR | S_IRUGO | S_IXUGO;
3771 fattr->nlink = 2;
3772 }
3773
nfs4_proc_lookup_common(struct rpc_clnt ** clnt,struct inode * dir,const struct qstr * name,struct nfs_fh * fhandle,struct nfs_fattr * fattr,struct nfs4_label * label)3774 static int nfs4_proc_lookup_common(struct rpc_clnt **clnt, struct inode *dir,
3775 const struct qstr *name, struct nfs_fh *fhandle,
3776 struct nfs_fattr *fattr, struct nfs4_label *label)
3777 {
3778 struct nfs4_exception exception = { };
3779 struct rpc_clnt *client = *clnt;
3780 int err;
3781 do {
3782 err = _nfs4_proc_lookup(client, dir, name, fhandle, fattr, label);
3783 trace_nfs4_lookup(dir, name, err);
3784 switch (err) {
3785 case -NFS4ERR_BADNAME:
3786 err = -ENOENT;
3787 goto out;
3788 case -NFS4ERR_MOVED:
3789 err = nfs4_get_referral(client, dir, name, fattr, fhandle);
3790 if (err == -NFS4ERR_MOVED)
3791 err = nfs4_handle_exception(NFS_SERVER(dir), err, &exception);
3792 goto out;
3793 case -NFS4ERR_WRONGSEC:
3794 err = -EPERM;
3795 if (client != *clnt)
3796 goto out;
3797 client = nfs4_negotiate_security(client, dir, name);
3798 if (IS_ERR(client))
3799 return PTR_ERR(client);
3800
3801 exception.retry = 1;
3802 break;
3803 default:
3804 err = nfs4_handle_exception(NFS_SERVER(dir), err, &exception);
3805 }
3806 } while (exception.retry);
3807
3808 out:
3809 if (err == 0)
3810 *clnt = client;
3811 else if (client != *clnt)
3812 rpc_shutdown_client(client);
3813
3814 return err;
3815 }
3816
nfs4_proc_lookup(struct inode * dir,const struct qstr * name,struct nfs_fh * fhandle,struct nfs_fattr * fattr,struct nfs4_label * label)3817 static int nfs4_proc_lookup(struct inode *dir, const struct qstr *name,
3818 struct nfs_fh *fhandle, struct nfs_fattr *fattr,
3819 struct nfs4_label *label)
3820 {
3821 int status;
3822 struct rpc_clnt *client = NFS_CLIENT(dir);
3823
3824 status = nfs4_proc_lookup_common(&client, dir, name, fhandle, fattr, label);
3825 if (client != NFS_CLIENT(dir)) {
3826 rpc_shutdown_client(client);
3827 nfs_fixup_secinfo_attributes(fattr);
3828 }
3829 return status;
3830 }
3831
3832 struct rpc_clnt *
nfs4_proc_lookup_mountpoint(struct inode * dir,const struct qstr * name,struct nfs_fh * fhandle,struct nfs_fattr * fattr)3833 nfs4_proc_lookup_mountpoint(struct inode *dir, const struct qstr *name,
3834 struct nfs_fh *fhandle, struct nfs_fattr *fattr)
3835 {
3836 struct rpc_clnt *client = NFS_CLIENT(dir);
3837 int status;
3838
3839 status = nfs4_proc_lookup_common(&client, dir, name, fhandle, fattr, NULL);
3840 if (status < 0)
3841 return ERR_PTR(status);
3842 return (client == NFS_CLIENT(dir)) ? rpc_clone_client(client) : client;
3843 }
3844
_nfs4_proc_access(struct inode * inode,struct nfs_access_entry * entry)3845 static int _nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
3846 {
3847 struct nfs_server *server = NFS_SERVER(inode);
3848 struct nfs4_accessargs args = {
3849 .fh = NFS_FH(inode),
3850 .bitmask = server->cache_consistency_bitmask,
3851 };
3852 struct nfs4_accessres res = {
3853 .server = server,
3854 };
3855 struct rpc_message msg = {
3856 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_ACCESS],
3857 .rpc_argp = &args,
3858 .rpc_resp = &res,
3859 .rpc_cred = entry->cred,
3860 };
3861 int mode = entry->mask;
3862 int status = 0;
3863
3864 /*
3865 * Determine which access bits we want to ask for...
3866 */
3867 if (mode & MAY_READ)
3868 args.access |= NFS4_ACCESS_READ;
3869 if (S_ISDIR(inode->i_mode)) {
3870 if (mode & MAY_WRITE)
3871 args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND | NFS4_ACCESS_DELETE;
3872 if (mode & MAY_EXEC)
3873 args.access |= NFS4_ACCESS_LOOKUP;
3874 } else {
3875 if (mode & MAY_WRITE)
3876 args.access |= NFS4_ACCESS_MODIFY | NFS4_ACCESS_EXTEND;
3877 if (mode & MAY_EXEC)
3878 args.access |= NFS4_ACCESS_EXECUTE;
3879 }
3880
3881 res.fattr = nfs_alloc_fattr();
3882 if (res.fattr == NULL)
3883 return -ENOMEM;
3884
3885 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
3886 if (!status) {
3887 nfs_access_set_mask(entry, res.access);
3888 nfs_refresh_inode(inode, res.fattr);
3889 }
3890 nfs_free_fattr(res.fattr);
3891 return status;
3892 }
3893
nfs4_proc_access(struct inode * inode,struct nfs_access_entry * entry)3894 static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
3895 {
3896 struct nfs4_exception exception = { };
3897 int err;
3898 do {
3899 err = _nfs4_proc_access(inode, entry);
3900 trace_nfs4_access(inode, err);
3901 err = nfs4_handle_exception(NFS_SERVER(inode), err,
3902 &exception);
3903 } while (exception.retry);
3904 return err;
3905 }
3906
3907 /*
3908 * TODO: For the time being, we don't try to get any attributes
3909 * along with any of the zero-copy operations READ, READDIR,
3910 * READLINK, WRITE.
3911 *
3912 * In the case of the first three, we want to put the GETATTR
3913 * after the read-type operation -- this is because it is hard
3914 * to predict the length of a GETATTR response in v4, and thus
3915 * align the READ data correctly. This means that the GETATTR
3916 * may end up partially falling into the page cache, and we should
3917 * shift it into the 'tail' of the xdr_buf before processing.
3918 * To do this efficiently, we need to know the total length
3919 * of data received, which doesn't seem to be available outside
3920 * of the RPC layer.
3921 *
3922 * In the case of WRITE, we also want to put the GETATTR after
3923 * the operation -- in this case because we want to make sure
3924 * we get the post-operation mtime and size.
3925 *
3926 * Both of these changes to the XDR layer would in fact be quite
3927 * minor, but I decided to leave them for a subsequent patch.
3928 */
_nfs4_proc_readlink(struct inode * inode,struct page * page,unsigned int pgbase,unsigned int pglen)3929 static int _nfs4_proc_readlink(struct inode *inode, struct page *page,
3930 unsigned int pgbase, unsigned int pglen)
3931 {
3932 struct nfs4_readlink args = {
3933 .fh = NFS_FH(inode),
3934 .pgbase = pgbase,
3935 .pglen = pglen,
3936 .pages = &page,
3937 };
3938 struct nfs4_readlink_res res;
3939 struct rpc_message msg = {
3940 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READLINK],
3941 .rpc_argp = &args,
3942 .rpc_resp = &res,
3943 };
3944
3945 return nfs4_call_sync(NFS_SERVER(inode)->client, NFS_SERVER(inode), &msg, &args.seq_args, &res.seq_res, 0);
3946 }
3947
nfs4_proc_readlink(struct inode * inode,struct page * page,unsigned int pgbase,unsigned int pglen)3948 static int nfs4_proc_readlink(struct inode *inode, struct page *page,
3949 unsigned int pgbase, unsigned int pglen)
3950 {
3951 struct nfs4_exception exception = { };
3952 int err;
3953 do {
3954 err = _nfs4_proc_readlink(inode, page, pgbase, pglen);
3955 trace_nfs4_readlink(inode, err);
3956 err = nfs4_handle_exception(NFS_SERVER(inode), err,
3957 &exception);
3958 } while (exception.retry);
3959 return err;
3960 }
3961
3962 /*
3963 * This is just for mknod. open(O_CREAT) will always do ->open_context().
3964 */
3965 static int
nfs4_proc_create(struct inode * dir,struct dentry * dentry,struct iattr * sattr,int flags)3966 nfs4_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr,
3967 int flags)
3968 {
3969 struct nfs4_label l, *ilabel = NULL;
3970 struct nfs_open_context *ctx;
3971 struct nfs4_state *state;
3972 int status = 0;
3973
3974 ctx = alloc_nfs_open_context(dentry, FMODE_READ);
3975 if (IS_ERR(ctx))
3976 return PTR_ERR(ctx);
3977
3978 ilabel = nfs4_label_init_security(dir, dentry, sattr, &l);
3979
3980 sattr->ia_mode &= ~current_umask();
3981 state = nfs4_do_open(dir, ctx, flags, sattr, ilabel, NULL);
3982 if (IS_ERR(state)) {
3983 status = PTR_ERR(state);
3984 goto out;
3985 }
3986 out:
3987 nfs4_label_release_security(ilabel);
3988 put_nfs_open_context(ctx);
3989 return status;
3990 }
3991
_nfs4_proc_remove(struct inode * dir,const struct qstr * name)3992 static int _nfs4_proc_remove(struct inode *dir, const struct qstr *name)
3993 {
3994 struct nfs_server *server = NFS_SERVER(dir);
3995 struct nfs_removeargs args = {
3996 .fh = NFS_FH(dir),
3997 .name = *name,
3998 };
3999 struct nfs_removeres res = {
4000 .server = server,
4001 };
4002 struct rpc_message msg = {
4003 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE],
4004 .rpc_argp = &args,
4005 .rpc_resp = &res,
4006 };
4007 int status;
4008
4009 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 1);
4010 if (status == 0)
4011 update_changeattr(dir, &res.cinfo);
4012 return status;
4013 }
4014
nfs4_proc_remove(struct inode * dir,const struct qstr * name)4015 static int nfs4_proc_remove(struct inode *dir, const struct qstr *name)
4016 {
4017 struct nfs4_exception exception = { };
4018 int err;
4019 do {
4020 err = _nfs4_proc_remove(dir, name);
4021 trace_nfs4_remove(dir, name, err);
4022 err = nfs4_handle_exception(NFS_SERVER(dir), err,
4023 &exception);
4024 } while (exception.retry);
4025 return err;
4026 }
4027
nfs4_proc_unlink_setup(struct rpc_message * msg,struct inode * dir)4028 static void nfs4_proc_unlink_setup(struct rpc_message *msg, struct inode *dir)
4029 {
4030 struct nfs_server *server = NFS_SERVER(dir);
4031 struct nfs_removeargs *args = msg->rpc_argp;
4032 struct nfs_removeres *res = msg->rpc_resp;
4033
4034 res->server = server;
4035 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_REMOVE];
4036 nfs4_init_sequence(&args->seq_args, &res->seq_res, 1);
4037
4038 nfs_fattr_init(res->dir_attr);
4039 }
4040
nfs4_proc_unlink_rpc_prepare(struct rpc_task * task,struct nfs_unlinkdata * data)4041 static void nfs4_proc_unlink_rpc_prepare(struct rpc_task *task, struct nfs_unlinkdata *data)
4042 {
4043 nfs4_setup_sequence(NFS_SB(data->dentry->d_sb),
4044 &data->args.seq_args,
4045 &data->res.seq_res,
4046 task);
4047 }
4048
nfs4_proc_unlink_done(struct rpc_task * task,struct inode * dir)4049 static int nfs4_proc_unlink_done(struct rpc_task *task, struct inode *dir)
4050 {
4051 struct nfs_unlinkdata *data = task->tk_calldata;
4052 struct nfs_removeres *res = &data->res;
4053
4054 if (!nfs4_sequence_done(task, &res->seq_res))
4055 return 0;
4056 if (nfs4_async_handle_error(task, res->server, NULL,
4057 &data->timeout) == -EAGAIN)
4058 return 0;
4059 update_changeattr(dir, &res->cinfo);
4060 return 1;
4061 }
4062
nfs4_proc_rename_setup(struct rpc_message * msg,struct inode * dir)4063 static void nfs4_proc_rename_setup(struct rpc_message *msg, struct inode *dir)
4064 {
4065 struct nfs_server *server = NFS_SERVER(dir);
4066 struct nfs_renameargs *arg = msg->rpc_argp;
4067 struct nfs_renameres *res = msg->rpc_resp;
4068
4069 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENAME];
4070 res->server = server;
4071 nfs4_init_sequence(&arg->seq_args, &res->seq_res, 1);
4072 }
4073
nfs4_proc_rename_rpc_prepare(struct rpc_task * task,struct nfs_renamedata * data)4074 static void nfs4_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renamedata *data)
4075 {
4076 nfs4_setup_sequence(NFS_SERVER(data->old_dir),
4077 &data->args.seq_args,
4078 &data->res.seq_res,
4079 task);
4080 }
4081
nfs4_proc_rename_done(struct rpc_task * task,struct inode * old_dir,struct inode * new_dir)4082 static int nfs4_proc_rename_done(struct rpc_task *task, struct inode *old_dir,
4083 struct inode *new_dir)
4084 {
4085 struct nfs_renamedata *data = task->tk_calldata;
4086 struct nfs_renameres *res = &data->res;
4087
4088 if (!nfs4_sequence_done(task, &res->seq_res))
4089 return 0;
4090 if (nfs4_async_handle_error(task, res->server, NULL, &data->timeout) == -EAGAIN)
4091 return 0;
4092
4093 update_changeattr(old_dir, &res->old_cinfo);
4094 update_changeattr(new_dir, &res->new_cinfo);
4095 return 1;
4096 }
4097
_nfs4_proc_link(struct inode * inode,struct inode * dir,const struct qstr * name)4098 static int _nfs4_proc_link(struct inode *inode, struct inode *dir, const struct qstr *name)
4099 {
4100 struct nfs_server *server = NFS_SERVER(inode);
4101 struct nfs4_link_arg arg = {
4102 .fh = NFS_FH(inode),
4103 .dir_fh = NFS_FH(dir),
4104 .name = name,
4105 .bitmask = server->attr_bitmask,
4106 };
4107 struct nfs4_link_res res = {
4108 .server = server,
4109 .label = NULL,
4110 };
4111 struct rpc_message msg = {
4112 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LINK],
4113 .rpc_argp = &arg,
4114 .rpc_resp = &res,
4115 };
4116 int status = -ENOMEM;
4117
4118 res.fattr = nfs_alloc_fattr();
4119 if (res.fattr == NULL)
4120 goto out;
4121
4122 res.label = nfs4_label_alloc(server, GFP_KERNEL);
4123 if (IS_ERR(res.label)) {
4124 status = PTR_ERR(res.label);
4125 goto out;
4126 }
4127 arg.bitmask = nfs4_bitmask(server, res.label);
4128
4129 status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
4130 if (!status) {
4131 update_changeattr(dir, &res.cinfo);
4132 status = nfs_post_op_update_inode(inode, res.fattr);
4133 if (!status)
4134 nfs_setsecurity(inode, res.fattr, res.label);
4135 }
4136
4137
4138 nfs4_label_free(res.label);
4139
4140 out:
4141 nfs_free_fattr(res.fattr);
4142 return status;
4143 }
4144
nfs4_proc_link(struct inode * inode,struct inode * dir,const struct qstr * name)4145 static int nfs4_proc_link(struct inode *inode, struct inode *dir, const struct qstr *name)
4146 {
4147 struct nfs4_exception exception = { };
4148 int err;
4149 do {
4150 err = nfs4_handle_exception(NFS_SERVER(inode),
4151 _nfs4_proc_link(inode, dir, name),
4152 &exception);
4153 } while (exception.retry);
4154 return err;
4155 }
4156
4157 struct nfs4_createdata {
4158 struct rpc_message msg;
4159 struct nfs4_create_arg arg;
4160 struct nfs4_create_res res;
4161 struct nfs_fh fh;
4162 struct nfs_fattr fattr;
4163 struct nfs4_label *label;
4164 };
4165
nfs4_alloc_createdata(struct inode * dir,const struct qstr * name,struct iattr * sattr,u32 ftype)4166 static struct nfs4_createdata *nfs4_alloc_createdata(struct inode *dir,
4167 const struct qstr *name, struct iattr *sattr, u32 ftype)
4168 {
4169 struct nfs4_createdata *data;
4170
4171 data = kzalloc(sizeof(*data), GFP_KERNEL);
4172 if (data != NULL) {
4173 struct nfs_server *server = NFS_SERVER(dir);
4174
4175 data->label = nfs4_label_alloc(server, GFP_KERNEL);
4176 if (IS_ERR(data->label))
4177 goto out_free;
4178
4179 data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE];
4180 data->msg.rpc_argp = &data->arg;
4181 data->msg.rpc_resp = &data->res;
4182 data->arg.dir_fh = NFS_FH(dir);
4183 data->arg.server = server;
4184 data->arg.name = name;
4185 data->arg.attrs = sattr;
4186 data->arg.ftype = ftype;
4187 data->arg.bitmask = nfs4_bitmask(server, data->label);
4188 data->res.server = server;
4189 data->res.fh = &data->fh;
4190 data->res.fattr = &data->fattr;
4191 data->res.label = data->label;
4192 nfs_fattr_init(data->res.fattr);
4193 }
4194 return data;
4195 out_free:
4196 kfree(data);
4197 return NULL;
4198 }
4199
nfs4_do_create(struct inode * dir,struct dentry * dentry,struct nfs4_createdata * data)4200 static int nfs4_do_create(struct inode *dir, struct dentry *dentry, struct nfs4_createdata *data)
4201 {
4202 int status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &data->msg,
4203 &data->arg.seq_args, &data->res.seq_res, 1);
4204 if (status == 0) {
4205 update_changeattr(dir, &data->res.dir_cinfo);
4206 status = nfs_instantiate(dentry, data->res.fh, data->res.fattr, data->res.label);
4207 }
4208 return status;
4209 }
4210
nfs4_free_createdata(struct nfs4_createdata * data)4211 static void nfs4_free_createdata(struct nfs4_createdata *data)
4212 {
4213 nfs4_label_free(data->label);
4214 kfree(data);
4215 }
4216
_nfs4_proc_symlink(struct inode * dir,struct dentry * dentry,struct page * page,unsigned int len,struct iattr * sattr,struct nfs4_label * label)4217 static int _nfs4_proc_symlink(struct inode *dir, struct dentry *dentry,
4218 struct page *page, unsigned int len, struct iattr *sattr,
4219 struct nfs4_label *label)
4220 {
4221 struct nfs4_createdata *data;
4222 int status = -ENAMETOOLONG;
4223
4224 if (len > NFS4_MAXPATHLEN)
4225 goto out;
4226
4227 status = -ENOMEM;
4228 data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4LNK);
4229 if (data == NULL)
4230 goto out;
4231
4232 data->msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SYMLINK];
4233 data->arg.u.symlink.pages = &page;
4234 data->arg.u.symlink.len = len;
4235 data->arg.label = label;
4236
4237 status = nfs4_do_create(dir, dentry, data);
4238
4239 nfs4_free_createdata(data);
4240 out:
4241 return status;
4242 }
4243
nfs4_proc_symlink(struct inode * dir,struct dentry * dentry,struct page * page,unsigned int len,struct iattr * sattr)4244 static int nfs4_proc_symlink(struct inode *dir, struct dentry *dentry,
4245 struct page *page, unsigned int len, struct iattr *sattr)
4246 {
4247 struct nfs4_exception exception = { };
4248 struct nfs4_label l, *label = NULL;
4249 int err;
4250
4251 label = nfs4_label_init_security(dir, dentry, sattr, &l);
4252
4253 do {
4254 err = _nfs4_proc_symlink(dir, dentry, page, len, sattr, label);
4255 trace_nfs4_symlink(dir, &dentry->d_name, err);
4256 err = nfs4_handle_exception(NFS_SERVER(dir), err,
4257 &exception);
4258 } while (exception.retry);
4259
4260 nfs4_label_release_security(label);
4261 return err;
4262 }
4263
_nfs4_proc_mkdir(struct inode * dir,struct dentry * dentry,struct iattr * sattr,struct nfs4_label * label)4264 static int _nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
4265 struct iattr *sattr, struct nfs4_label *label)
4266 {
4267 struct nfs4_createdata *data;
4268 int status = -ENOMEM;
4269
4270 data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4DIR);
4271 if (data == NULL)
4272 goto out;
4273
4274 data->arg.label = label;
4275 status = nfs4_do_create(dir, dentry, data);
4276
4277 nfs4_free_createdata(data);
4278 out:
4279 return status;
4280 }
4281
nfs4_proc_mkdir(struct inode * dir,struct dentry * dentry,struct iattr * sattr)4282 static int nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry,
4283 struct iattr *sattr)
4284 {
4285 struct nfs4_exception exception = { };
4286 struct nfs4_label l, *label = NULL;
4287 int err;
4288
4289 label = nfs4_label_init_security(dir, dentry, sattr, &l);
4290
4291 sattr->ia_mode &= ~current_umask();
4292 do {
4293 err = _nfs4_proc_mkdir(dir, dentry, sattr, label);
4294 trace_nfs4_mkdir(dir, &dentry->d_name, err);
4295 err = nfs4_handle_exception(NFS_SERVER(dir), err,
4296 &exception);
4297 } while (exception.retry);
4298 nfs4_label_release_security(label);
4299
4300 return err;
4301 }
4302
_nfs4_proc_readdir(struct dentry * dentry,struct rpc_cred * cred,u64 cookie,struct page ** pages,unsigned int count,int plus)4303 static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
4304 u64 cookie, struct page **pages, unsigned int count, int plus)
4305 {
4306 struct inode *dir = d_inode(dentry);
4307 struct nfs4_readdir_arg args = {
4308 .fh = NFS_FH(dir),
4309 .pages = pages,
4310 .pgbase = 0,
4311 .count = count,
4312 .bitmask = NFS_SERVER(d_inode(dentry))->attr_bitmask,
4313 .plus = plus,
4314 };
4315 struct nfs4_readdir_res res;
4316 struct rpc_message msg = {
4317 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READDIR],
4318 .rpc_argp = &args,
4319 .rpc_resp = &res,
4320 .rpc_cred = cred,
4321 };
4322 int status;
4323
4324 dprintk("%s: dentry = %pd2, cookie = %Lu\n", __func__,
4325 dentry,
4326 (unsigned long long)cookie);
4327 nfs4_setup_readdir(cookie, NFS_I(dir)->cookieverf, dentry, &args);
4328 res.pgbase = args.pgbase;
4329 status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0);
4330 if (status >= 0) {
4331 memcpy(NFS_I(dir)->cookieverf, res.verifier.data, NFS4_VERIFIER_SIZE);
4332 status += args.pgbase;
4333 }
4334
4335 nfs_invalidate_atime(dir);
4336
4337 dprintk("%s: returns %d\n", __func__, status);
4338 return status;
4339 }
4340
nfs4_proc_readdir(struct dentry * dentry,struct rpc_cred * cred,u64 cookie,struct page ** pages,unsigned int count,int plus)4341 static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
4342 u64 cookie, struct page **pages, unsigned int count, int plus)
4343 {
4344 struct nfs4_exception exception = { };
4345 int err;
4346 do {
4347 err = _nfs4_proc_readdir(dentry, cred, cookie,
4348 pages, count, plus);
4349 trace_nfs4_readdir(d_inode(dentry), err);
4350 err = nfs4_handle_exception(NFS_SERVER(d_inode(dentry)), err,
4351 &exception);
4352 } while (exception.retry);
4353 return err;
4354 }
4355
_nfs4_proc_mknod(struct inode * dir,struct dentry * dentry,struct iattr * sattr,struct nfs4_label * label,dev_t rdev)4356 static int _nfs4_proc_mknod(struct inode *dir, struct dentry *dentry,
4357 struct iattr *sattr, struct nfs4_label *label, dev_t rdev)
4358 {
4359 struct nfs4_createdata *data;
4360 int mode = sattr->ia_mode;
4361 int status = -ENOMEM;
4362
4363 data = nfs4_alloc_createdata(dir, &dentry->d_name, sattr, NF4SOCK);
4364 if (data == NULL)
4365 goto out;
4366
4367 if (S_ISFIFO(mode))
4368 data->arg.ftype = NF4FIFO;
4369 else if (S_ISBLK(mode)) {
4370 data->arg.ftype = NF4BLK;
4371 data->arg.u.device.specdata1 = MAJOR(rdev);
4372 data->arg.u.device.specdata2 = MINOR(rdev);
4373 }
4374 else if (S_ISCHR(mode)) {
4375 data->arg.ftype = NF4CHR;
4376 data->arg.u.device.specdata1 = MAJOR(rdev);
4377 data->arg.u.device.specdata2 = MINOR(rdev);
4378 } else if (!S_ISSOCK(mode)) {
4379 status = -EINVAL;
4380 goto out_free;
4381 }
4382
4383 data->arg.label = label;
4384 status = nfs4_do_create(dir, dentry, data);
4385 out_free:
4386 nfs4_free_createdata(data);
4387 out:
4388 return status;
4389 }
4390
nfs4_proc_mknod(struct inode * dir,struct dentry * dentry,struct iattr * sattr,dev_t rdev)4391 static int nfs4_proc_mknod(struct inode *dir, struct dentry *dentry,
4392 struct iattr *sattr, dev_t rdev)
4393 {
4394 struct nfs4_exception exception = { };
4395 struct nfs4_label l, *label = NULL;
4396 int err;
4397
4398 label = nfs4_label_init_security(dir, dentry, sattr, &l);
4399
4400 sattr->ia_mode &= ~current_umask();
4401 do {
4402 err = _nfs4_proc_mknod(dir, dentry, sattr, label, rdev);
4403 trace_nfs4_mknod(dir, &dentry->d_name, err);
4404 err = nfs4_handle_exception(NFS_SERVER(dir), err,
4405 &exception);
4406 } while (exception.retry);
4407
4408 nfs4_label_release_security(label);
4409
4410 return err;
4411 }
4412
_nfs4_proc_statfs(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsstat * fsstat)4413 static int _nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle,
4414 struct nfs_fsstat *fsstat)
4415 {
4416 struct nfs4_statfs_arg args = {
4417 .fh = fhandle,
4418 .bitmask = server->attr_bitmask,
4419 };
4420 struct nfs4_statfs_res res = {
4421 .fsstat = fsstat,
4422 };
4423 struct rpc_message msg = {
4424 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_STATFS],
4425 .rpc_argp = &args,
4426 .rpc_resp = &res,
4427 };
4428
4429 nfs_fattr_init(fsstat->fattr);
4430 return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
4431 }
4432
nfs4_proc_statfs(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsstat * fsstat)4433 static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat)
4434 {
4435 struct nfs4_exception exception = { };
4436 int err;
4437 do {
4438 err = nfs4_handle_exception(server,
4439 _nfs4_proc_statfs(server, fhandle, fsstat),
4440 &exception);
4441 } while (exception.retry);
4442 return err;
4443 }
4444
_nfs4_do_fsinfo(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsinfo * fsinfo)4445 static int _nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle,
4446 struct nfs_fsinfo *fsinfo)
4447 {
4448 struct nfs4_fsinfo_arg args = {
4449 .fh = fhandle,
4450 .bitmask = server->attr_bitmask,
4451 };
4452 struct nfs4_fsinfo_res res = {
4453 .fsinfo = fsinfo,
4454 };
4455 struct rpc_message msg = {
4456 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSINFO],
4457 .rpc_argp = &args,
4458 .rpc_resp = &res,
4459 };
4460
4461 return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
4462 }
4463
nfs4_do_fsinfo(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsinfo * fsinfo)4464 static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
4465 {
4466 struct nfs4_exception exception = { };
4467 unsigned long now = jiffies;
4468 int err;
4469
4470 do {
4471 err = _nfs4_do_fsinfo(server, fhandle, fsinfo);
4472 trace_nfs4_fsinfo(server, fhandle, fsinfo->fattr, err);
4473 if (err == 0) {
4474 nfs4_set_lease_period(server->nfs_client,
4475 fsinfo->lease_time * HZ,
4476 now);
4477 break;
4478 }
4479 err = nfs4_handle_exception(server, err, &exception);
4480 } while (exception.retry);
4481 return err;
4482 }
4483
nfs4_proc_fsinfo(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsinfo * fsinfo)4484 static int nfs4_proc_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
4485 {
4486 int error;
4487
4488 nfs_fattr_init(fsinfo->fattr);
4489 error = nfs4_do_fsinfo(server, fhandle, fsinfo);
4490 if (error == 0) {
4491 /* block layout checks this! */
4492 server->pnfs_blksize = fsinfo->blksize;
4493 set_pnfs_layoutdriver(server, fhandle, fsinfo);
4494 }
4495
4496 return error;
4497 }
4498
_nfs4_proc_pathconf(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_pathconf * pathconf)4499 static int _nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
4500 struct nfs_pathconf *pathconf)
4501 {
4502 struct nfs4_pathconf_arg args = {
4503 .fh = fhandle,
4504 .bitmask = server->attr_bitmask,
4505 };
4506 struct nfs4_pathconf_res res = {
4507 .pathconf = pathconf,
4508 };
4509 struct rpc_message msg = {
4510 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_PATHCONF],
4511 .rpc_argp = &args,
4512 .rpc_resp = &res,
4513 };
4514
4515 /* None of the pathconf attributes are mandatory to implement */
4516 if ((args.bitmask[0] & nfs4_pathconf_bitmap[0]) == 0) {
4517 memset(pathconf, 0, sizeof(*pathconf));
4518 return 0;
4519 }
4520
4521 nfs_fattr_init(pathconf->fattr);
4522 return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
4523 }
4524
nfs4_proc_pathconf(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_pathconf * pathconf)4525 static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
4526 struct nfs_pathconf *pathconf)
4527 {
4528 struct nfs4_exception exception = { };
4529 int err;
4530
4531 do {
4532 err = nfs4_handle_exception(server,
4533 _nfs4_proc_pathconf(server, fhandle, pathconf),
4534 &exception);
4535 } while (exception.retry);
4536 return err;
4537 }
4538
nfs4_set_rw_stateid(nfs4_stateid * stateid,const struct nfs_open_context * ctx,const struct nfs_lock_context * l_ctx,fmode_t fmode)4539 int nfs4_set_rw_stateid(nfs4_stateid *stateid,
4540 const struct nfs_open_context *ctx,
4541 const struct nfs_lock_context *l_ctx,
4542 fmode_t fmode)
4543 {
4544 const struct nfs_lockowner *lockowner = NULL;
4545
4546 if (l_ctx != NULL)
4547 lockowner = &l_ctx->lockowner;
4548 return nfs4_select_rw_stateid(ctx->state, fmode, lockowner, stateid, NULL);
4549 }
4550 EXPORT_SYMBOL_GPL(nfs4_set_rw_stateid);
4551
nfs4_stateid_is_current(nfs4_stateid * stateid,const struct nfs_open_context * ctx,const struct nfs_lock_context * l_ctx,fmode_t fmode)4552 static bool nfs4_stateid_is_current(nfs4_stateid *stateid,
4553 const struct nfs_open_context *ctx,
4554 const struct nfs_lock_context *l_ctx,
4555 fmode_t fmode)
4556 {
4557 nfs4_stateid current_stateid;
4558
4559 /* If the current stateid represents a lost lock, then exit */
4560 if (nfs4_set_rw_stateid(¤t_stateid, ctx, l_ctx, fmode) == -EIO)
4561 return true;
4562 return nfs4_stateid_match(stateid, ¤t_stateid);
4563 }
4564
nfs4_error_stateid_expired(int err)4565 static bool nfs4_error_stateid_expired(int err)
4566 {
4567 switch (err) {
4568 case -NFS4ERR_DELEG_REVOKED:
4569 case -NFS4ERR_ADMIN_REVOKED:
4570 case -NFS4ERR_BAD_STATEID:
4571 case -NFS4ERR_STALE_STATEID:
4572 case -NFS4ERR_OLD_STATEID:
4573 case -NFS4ERR_OPENMODE:
4574 case -NFS4ERR_EXPIRED:
4575 return true;
4576 }
4577 return false;
4578 }
4579
nfs4_read_done_cb(struct rpc_task * task,struct nfs_pgio_header * hdr)4580 static int nfs4_read_done_cb(struct rpc_task *task, struct nfs_pgio_header *hdr)
4581 {
4582 struct nfs_server *server = NFS_SERVER(hdr->inode);
4583
4584 trace_nfs4_read(hdr, task->tk_status);
4585 if (task->tk_status < 0) {
4586 struct nfs4_exception exception = {
4587 .inode = hdr->inode,
4588 .state = hdr->args.context->state,
4589 .stateid = &hdr->args.stateid,
4590 };
4591 task->tk_status = nfs4_async_handle_exception(task,
4592 server, task->tk_status, &exception);
4593 if (exception.retry) {
4594 rpc_restart_call_prepare(task);
4595 return -EAGAIN;
4596 }
4597 }
4598
4599 if (task->tk_status > 0)
4600 renew_lease(server, hdr->timestamp);
4601 return 0;
4602 }
4603
nfs4_read_stateid_changed(struct rpc_task * task,struct nfs_pgio_args * args)4604 static bool nfs4_read_stateid_changed(struct rpc_task *task,
4605 struct nfs_pgio_args *args)
4606 {
4607
4608 if (!nfs4_error_stateid_expired(task->tk_status) ||
4609 nfs4_stateid_is_current(&args->stateid,
4610 args->context,
4611 args->lock_context,
4612 FMODE_READ))
4613 return false;
4614 rpc_restart_call_prepare(task);
4615 return true;
4616 }
4617
nfs4_read_done(struct rpc_task * task,struct nfs_pgio_header * hdr)4618 static int nfs4_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
4619 {
4620
4621 dprintk("--> %s\n", __func__);
4622
4623 if (!nfs4_sequence_done(task, &hdr->res.seq_res))
4624 return -EAGAIN;
4625 if (nfs4_read_stateid_changed(task, &hdr->args))
4626 return -EAGAIN;
4627 if (task->tk_status > 0)
4628 nfs_invalidate_atime(hdr->inode);
4629 return hdr->pgio_done_cb ? hdr->pgio_done_cb(task, hdr) :
4630 nfs4_read_done_cb(task, hdr);
4631 }
4632
nfs4_proc_read_setup(struct nfs_pgio_header * hdr,struct rpc_message * msg)4633 static void nfs4_proc_read_setup(struct nfs_pgio_header *hdr,
4634 struct rpc_message *msg)
4635 {
4636 hdr->timestamp = jiffies;
4637 if (!hdr->pgio_done_cb)
4638 hdr->pgio_done_cb = nfs4_read_done_cb;
4639 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
4640 nfs4_init_sequence(&hdr->args.seq_args, &hdr->res.seq_res, 0);
4641 }
4642
nfs4_proc_pgio_rpc_prepare(struct rpc_task * task,struct nfs_pgio_header * hdr)4643 static int nfs4_proc_pgio_rpc_prepare(struct rpc_task *task,
4644 struct nfs_pgio_header *hdr)
4645 {
4646 if (nfs4_setup_sequence(NFS_SERVER(hdr->inode),
4647 &hdr->args.seq_args,
4648 &hdr->res.seq_res,
4649 task))
4650 return 0;
4651 if (nfs4_set_rw_stateid(&hdr->args.stateid, hdr->args.context,
4652 hdr->args.lock_context,
4653 hdr->rw_ops->rw_mode) == -EIO)
4654 return -EIO;
4655 if (unlikely(test_bit(NFS_CONTEXT_BAD, &hdr->args.context->flags)))
4656 return -EIO;
4657 return 0;
4658 }
4659
nfs4_write_done_cb(struct rpc_task * task,struct nfs_pgio_header * hdr)4660 static int nfs4_write_done_cb(struct rpc_task *task,
4661 struct nfs_pgio_header *hdr)
4662 {
4663 struct inode *inode = hdr->inode;
4664
4665 trace_nfs4_write(hdr, task->tk_status);
4666 if (task->tk_status < 0) {
4667 struct nfs4_exception exception = {
4668 .inode = hdr->inode,
4669 .state = hdr->args.context->state,
4670 .stateid = &hdr->args.stateid,
4671 };
4672 task->tk_status = nfs4_async_handle_exception(task,
4673 NFS_SERVER(inode), task->tk_status,
4674 &exception);
4675 if (exception.retry) {
4676 rpc_restart_call_prepare(task);
4677 return -EAGAIN;
4678 }
4679 }
4680 if (task->tk_status >= 0) {
4681 renew_lease(NFS_SERVER(inode), hdr->timestamp);
4682 nfs_writeback_update_inode(hdr);
4683 }
4684 return 0;
4685 }
4686
nfs4_write_stateid_changed(struct rpc_task * task,struct nfs_pgio_args * args)4687 static bool nfs4_write_stateid_changed(struct rpc_task *task,
4688 struct nfs_pgio_args *args)
4689 {
4690
4691 if (!nfs4_error_stateid_expired(task->tk_status) ||
4692 nfs4_stateid_is_current(&args->stateid,
4693 args->context,
4694 args->lock_context,
4695 FMODE_WRITE))
4696 return false;
4697 rpc_restart_call_prepare(task);
4698 return true;
4699 }
4700
nfs4_write_done(struct rpc_task * task,struct nfs_pgio_header * hdr)4701 static int nfs4_write_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
4702 {
4703 if (!nfs4_sequence_done(task, &hdr->res.seq_res))
4704 return -EAGAIN;
4705 if (nfs4_write_stateid_changed(task, &hdr->args))
4706 return -EAGAIN;
4707 return hdr->pgio_done_cb ? hdr->pgio_done_cb(task, hdr) :
4708 nfs4_write_done_cb(task, hdr);
4709 }
4710
4711 static
nfs4_write_need_cache_consistency_data(struct nfs_pgio_header * hdr)4712 bool nfs4_write_need_cache_consistency_data(struct nfs_pgio_header *hdr)
4713 {
4714 /* Don't request attributes for pNFS or O_DIRECT writes */
4715 if (hdr->ds_clp != NULL || hdr->dreq != NULL)
4716 return false;
4717 /* Otherwise, request attributes if and only if we don't hold
4718 * a delegation
4719 */
4720 return nfs4_have_delegation(hdr->inode, FMODE_READ) == 0;
4721 }
4722
nfs4_proc_write_setup(struct nfs_pgio_header * hdr,struct rpc_message * msg)4723 static void nfs4_proc_write_setup(struct nfs_pgio_header *hdr,
4724 struct rpc_message *msg)
4725 {
4726 struct nfs_server *server = NFS_SERVER(hdr->inode);
4727
4728 if (!nfs4_write_need_cache_consistency_data(hdr)) {
4729 hdr->args.bitmask = NULL;
4730 hdr->res.fattr = NULL;
4731 } else
4732 hdr->args.bitmask = server->cache_consistency_bitmask;
4733
4734 if (!hdr->pgio_done_cb)
4735 hdr->pgio_done_cb = nfs4_write_done_cb;
4736 hdr->res.server = server;
4737 hdr->timestamp = jiffies;
4738
4739 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_WRITE];
4740 nfs4_init_sequence(&hdr->args.seq_args, &hdr->res.seq_res, 1);
4741 }
4742
nfs4_proc_commit_rpc_prepare(struct rpc_task * task,struct nfs_commit_data * data)4743 static void nfs4_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data)
4744 {
4745 nfs4_setup_sequence(NFS_SERVER(data->inode),
4746 &data->args.seq_args,
4747 &data->res.seq_res,
4748 task);
4749 }
4750
nfs4_commit_done_cb(struct rpc_task * task,struct nfs_commit_data * data)4751 static int nfs4_commit_done_cb(struct rpc_task *task, struct nfs_commit_data *data)
4752 {
4753 struct inode *inode = data->inode;
4754
4755 trace_nfs4_commit(data, task->tk_status);
4756 if (nfs4_async_handle_error(task, NFS_SERVER(inode),
4757 NULL, NULL) == -EAGAIN) {
4758 rpc_restart_call_prepare(task);
4759 return -EAGAIN;
4760 }
4761 return 0;
4762 }
4763
nfs4_commit_done(struct rpc_task * task,struct nfs_commit_data * data)4764 static int nfs4_commit_done(struct rpc_task *task, struct nfs_commit_data *data)
4765 {
4766 if (!nfs4_sequence_done(task, &data->res.seq_res))
4767 return -EAGAIN;
4768 return data->commit_done_cb(task, data);
4769 }
4770
nfs4_proc_commit_setup(struct nfs_commit_data * data,struct rpc_message * msg)4771 static void nfs4_proc_commit_setup(struct nfs_commit_data *data, struct rpc_message *msg)
4772 {
4773 struct nfs_server *server = NFS_SERVER(data->inode);
4774
4775 if (data->commit_done_cb == NULL)
4776 data->commit_done_cb = nfs4_commit_done_cb;
4777 data->res.server = server;
4778 msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COMMIT];
4779 nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1);
4780 }
4781
4782 struct nfs4_renewdata {
4783 struct nfs_client *client;
4784 unsigned long timestamp;
4785 };
4786
4787 /*
4788 * nfs4_proc_async_renew(): This is not one of the nfs_rpc_ops; it is a special
4789 * standalone procedure for queueing an asynchronous RENEW.
4790 */
nfs4_renew_release(void * calldata)4791 static void nfs4_renew_release(void *calldata)
4792 {
4793 struct nfs4_renewdata *data = calldata;
4794 struct nfs_client *clp = data->client;
4795
4796 if (atomic_read(&clp->cl_count) > 1)
4797 nfs4_schedule_state_renewal(clp);
4798 nfs_put_client(clp);
4799 kfree(data);
4800 }
4801
nfs4_renew_done(struct rpc_task * task,void * calldata)4802 static void nfs4_renew_done(struct rpc_task *task, void *calldata)
4803 {
4804 struct nfs4_renewdata *data = calldata;
4805 struct nfs_client *clp = data->client;
4806 unsigned long timestamp = data->timestamp;
4807
4808 trace_nfs4_renew_async(clp, task->tk_status);
4809 switch (task->tk_status) {
4810 case 0:
4811 break;
4812 case -NFS4ERR_LEASE_MOVED:
4813 nfs4_schedule_lease_moved_recovery(clp);
4814 break;
4815 default:
4816 /* Unless we're shutting down, schedule state recovery! */
4817 if (test_bit(NFS_CS_RENEWD, &clp->cl_res_state) == 0)
4818 return;
4819 if (task->tk_status != NFS4ERR_CB_PATH_DOWN) {
4820 nfs4_schedule_lease_recovery(clp);
4821 return;
4822 }
4823 nfs4_schedule_path_down_recovery(clp);
4824 }
4825 do_renew_lease(clp, timestamp);
4826 }
4827
4828 static const struct rpc_call_ops nfs4_renew_ops = {
4829 .rpc_call_done = nfs4_renew_done,
4830 .rpc_release = nfs4_renew_release,
4831 };
4832
nfs4_proc_async_renew(struct nfs_client * clp,struct rpc_cred * cred,unsigned renew_flags)4833 static int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred, unsigned renew_flags)
4834 {
4835 struct rpc_message msg = {
4836 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
4837 .rpc_argp = clp,
4838 .rpc_cred = cred,
4839 };
4840 struct nfs4_renewdata *data;
4841
4842 if (renew_flags == 0)
4843 return 0;
4844 if (!atomic_inc_not_zero(&clp->cl_count))
4845 return -EIO;
4846 data = kmalloc(sizeof(*data), GFP_NOFS);
4847 if (data == NULL)
4848 return -ENOMEM;
4849 data->client = clp;
4850 data->timestamp = jiffies;
4851 return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT,
4852 &nfs4_renew_ops, data);
4853 }
4854
nfs4_proc_renew(struct nfs_client * clp,struct rpc_cred * cred)4855 static int nfs4_proc_renew(struct nfs_client *clp, struct rpc_cred *cred)
4856 {
4857 struct rpc_message msg = {
4858 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
4859 .rpc_argp = clp,
4860 .rpc_cred = cred,
4861 };
4862 unsigned long now = jiffies;
4863 int status;
4864
4865 status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
4866 if (status < 0)
4867 return status;
4868 do_renew_lease(clp, now);
4869 return 0;
4870 }
4871
nfs4_server_supports_acls(struct nfs_server * server)4872 static inline int nfs4_server_supports_acls(struct nfs_server *server)
4873 {
4874 return server->caps & NFS_CAP_ACLS;
4875 }
4876
4877 /* Assuming that XATTR_SIZE_MAX is a multiple of PAGE_SIZE, and that
4878 * it's OK to put sizeof(void) * (XATTR_SIZE_MAX/PAGE_SIZE) bytes on
4879 * the stack.
4880 */
4881 #define NFS4ACL_MAXPAGES DIV_ROUND_UP(XATTR_SIZE_MAX, PAGE_SIZE)
4882
buf_to_pages_noslab(const void * buf,size_t buflen,struct page ** pages)4883 static int buf_to_pages_noslab(const void *buf, size_t buflen,
4884 struct page **pages)
4885 {
4886 struct page *newpage, **spages;
4887 int rc = 0;
4888 size_t len;
4889 spages = pages;
4890
4891 do {
4892 len = min_t(size_t, PAGE_SIZE, buflen);
4893 newpage = alloc_page(GFP_KERNEL);
4894
4895 if (newpage == NULL)
4896 goto unwind;
4897 memcpy(page_address(newpage), buf, len);
4898 buf += len;
4899 buflen -= len;
4900 *pages++ = newpage;
4901 rc++;
4902 } while (buflen != 0);
4903
4904 return rc;
4905
4906 unwind:
4907 for(; rc > 0; rc--)
4908 __free_page(spages[rc-1]);
4909 return -ENOMEM;
4910 }
4911
4912 struct nfs4_cached_acl {
4913 int cached;
4914 size_t len;
4915 char data[0];
4916 };
4917
nfs4_set_cached_acl(struct inode * inode,struct nfs4_cached_acl * acl)4918 static void nfs4_set_cached_acl(struct inode *inode, struct nfs4_cached_acl *acl)
4919 {
4920 struct nfs_inode *nfsi = NFS_I(inode);
4921
4922 spin_lock(&inode->i_lock);
4923 kfree(nfsi->nfs4_acl);
4924 nfsi->nfs4_acl = acl;
4925 spin_unlock(&inode->i_lock);
4926 }
4927
nfs4_zap_acl_attr(struct inode * inode)4928 static void nfs4_zap_acl_attr(struct inode *inode)
4929 {
4930 nfs4_set_cached_acl(inode, NULL);
4931 }
4932
nfs4_read_cached_acl(struct inode * inode,char * buf,size_t buflen)4933 static inline ssize_t nfs4_read_cached_acl(struct inode *inode, char *buf, size_t buflen)
4934 {
4935 struct nfs_inode *nfsi = NFS_I(inode);
4936 struct nfs4_cached_acl *acl;
4937 int ret = -ENOENT;
4938
4939 spin_lock(&inode->i_lock);
4940 acl = nfsi->nfs4_acl;
4941 if (acl == NULL)
4942 goto out;
4943 if (buf == NULL) /* user is just asking for length */
4944 goto out_len;
4945 if (acl->cached == 0)
4946 goto out;
4947 ret = -ERANGE; /* see getxattr(2) man page */
4948 if (acl->len > buflen)
4949 goto out;
4950 memcpy(buf, acl->data, acl->len);
4951 out_len:
4952 ret = acl->len;
4953 out:
4954 spin_unlock(&inode->i_lock);
4955 return ret;
4956 }
4957
nfs4_write_cached_acl(struct inode * inode,struct page ** pages,size_t pgbase,size_t acl_len)4958 static void nfs4_write_cached_acl(struct inode *inode, struct page **pages, size_t pgbase, size_t acl_len)
4959 {
4960 struct nfs4_cached_acl *acl;
4961 size_t buflen = sizeof(*acl) + acl_len;
4962
4963 if (buflen <= PAGE_SIZE) {
4964 acl = kmalloc(buflen, GFP_KERNEL);
4965 if (acl == NULL)
4966 goto out;
4967 acl->cached = 1;
4968 _copy_from_pages(acl->data, pages, pgbase, acl_len);
4969 } else {
4970 acl = kmalloc(sizeof(*acl), GFP_KERNEL);
4971 if (acl == NULL)
4972 goto out;
4973 acl->cached = 0;
4974 }
4975 acl->len = acl_len;
4976 out:
4977 nfs4_set_cached_acl(inode, acl);
4978 }
4979
4980 /*
4981 * The getxattr API returns the required buffer length when called with a
4982 * NULL buf. The NFSv4 acl tool then calls getxattr again after allocating
4983 * the required buf. On a NULL buf, we send a page of data to the server
4984 * guessing that the ACL request can be serviced by a page. If so, we cache
4985 * up to the page of ACL data, and the 2nd call to getxattr is serviced by
4986 * the cache. If not so, we throw away the page, and cache the required
4987 * length. The next getxattr call will then produce another round trip to
4988 * the server, this time with the input buf of the required size.
4989 */
__nfs4_get_acl_uncached(struct inode * inode,void * buf,size_t buflen)4990 static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
4991 {
4992 struct page *pages[NFS4ACL_MAXPAGES + 1] = {NULL, };
4993 struct nfs_getaclargs args = {
4994 .fh = NFS_FH(inode),
4995 .acl_pages = pages,
4996 .acl_len = buflen,
4997 };
4998 struct nfs_getaclres res = {
4999 .acl_len = buflen,
5000 };
5001 struct rpc_message msg = {
5002 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETACL],
5003 .rpc_argp = &args,
5004 .rpc_resp = &res,
5005 };
5006 unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE) + 1;
5007 int ret = -ENOMEM, i;
5008
5009 if (npages > ARRAY_SIZE(pages))
5010 return -ERANGE;
5011
5012 for (i = 0; i < npages; i++) {
5013 pages[i] = alloc_page(GFP_KERNEL);
5014 if (!pages[i])
5015 goto out_free;
5016 }
5017
5018 /* for decoding across pages */
5019 res.acl_scratch = alloc_page(GFP_KERNEL);
5020 if (!res.acl_scratch)
5021 goto out_free;
5022
5023 args.acl_len = npages * PAGE_SIZE;
5024
5025 dprintk("%s buf %p buflen %zu npages %d args.acl_len %zu\n",
5026 __func__, buf, buflen, npages, args.acl_len);
5027 ret = nfs4_call_sync(NFS_SERVER(inode)->client, NFS_SERVER(inode),
5028 &msg, &args.seq_args, &res.seq_res, 0);
5029 if (ret)
5030 goto out_free;
5031
5032 /* Handle the case where the passed-in buffer is too short */
5033 if (res.acl_flags & NFS4_ACL_TRUNC) {
5034 /* Did the user only issue a request for the acl length? */
5035 if (buf == NULL)
5036 goto out_ok;
5037 ret = -ERANGE;
5038 goto out_free;
5039 }
5040 nfs4_write_cached_acl(inode, pages, res.acl_data_offset, res.acl_len);
5041 if (buf) {
5042 if (res.acl_len > buflen) {
5043 ret = -ERANGE;
5044 goto out_free;
5045 }
5046 _copy_from_pages(buf, pages, res.acl_data_offset, res.acl_len);
5047 }
5048 out_ok:
5049 ret = res.acl_len;
5050 out_free:
5051 for (i = 0; i < npages; i++)
5052 if (pages[i])
5053 __free_page(pages[i]);
5054 if (res.acl_scratch)
5055 __free_page(res.acl_scratch);
5056 return ret;
5057 }
5058
nfs4_get_acl_uncached(struct inode * inode,void * buf,size_t buflen)5059 static ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
5060 {
5061 struct nfs4_exception exception = { };
5062 ssize_t ret;
5063 do {
5064 ret = __nfs4_get_acl_uncached(inode, buf, buflen);
5065 trace_nfs4_get_acl(inode, ret);
5066 if (ret >= 0)
5067 break;
5068 ret = nfs4_handle_exception(NFS_SERVER(inode), ret, &exception);
5069 } while (exception.retry);
5070 return ret;
5071 }
5072
nfs4_proc_get_acl(struct inode * inode,void * buf,size_t buflen)5073 static ssize_t nfs4_proc_get_acl(struct inode *inode, void *buf, size_t buflen)
5074 {
5075 struct nfs_server *server = NFS_SERVER(inode);
5076 int ret;
5077
5078 if (!nfs4_server_supports_acls(server))
5079 return -EOPNOTSUPP;
5080 ret = nfs_revalidate_inode(server, inode);
5081 if (ret < 0)
5082 return ret;
5083 if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_ACL)
5084 nfs_zap_acl_cache(inode);
5085 ret = nfs4_read_cached_acl(inode, buf, buflen);
5086 if (ret != -ENOENT)
5087 /* -ENOENT is returned if there is no ACL or if there is an ACL
5088 * but no cached acl data, just the acl length */
5089 return ret;
5090 return nfs4_get_acl_uncached(inode, buf, buflen);
5091 }
5092
__nfs4_proc_set_acl(struct inode * inode,const void * buf,size_t buflen)5093 static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen)
5094 {
5095 struct nfs_server *server = NFS_SERVER(inode);
5096 struct page *pages[NFS4ACL_MAXPAGES];
5097 struct nfs_setaclargs arg = {
5098 .fh = NFS_FH(inode),
5099 .acl_pages = pages,
5100 .acl_len = buflen,
5101 };
5102 struct nfs_setaclres res;
5103 struct rpc_message msg = {
5104 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETACL],
5105 .rpc_argp = &arg,
5106 .rpc_resp = &res,
5107 };
5108 unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE);
5109 int ret, i;
5110
5111 if (!nfs4_server_supports_acls(server))
5112 return -EOPNOTSUPP;
5113 if (npages > ARRAY_SIZE(pages))
5114 return -ERANGE;
5115 i = buf_to_pages_noslab(buf, buflen, arg.acl_pages);
5116 if (i < 0)
5117 return i;
5118 nfs4_inode_return_delegation(inode);
5119 ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
5120
5121 /*
5122 * Free each page after tx, so the only ref left is
5123 * held by the network stack
5124 */
5125 for (; i > 0; i--)
5126 put_page(pages[i-1]);
5127
5128 /*
5129 * Acl update can result in inode attribute update.
5130 * so mark the attribute cache invalid.
5131 */
5132 spin_lock(&inode->i_lock);
5133 NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATTR;
5134 spin_unlock(&inode->i_lock);
5135 nfs_access_zap_cache(inode);
5136 nfs_zap_acl_cache(inode);
5137 return ret;
5138 }
5139
nfs4_proc_set_acl(struct inode * inode,const void * buf,size_t buflen)5140 static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen)
5141 {
5142 struct nfs4_exception exception = { };
5143 int err;
5144 do {
5145 err = __nfs4_proc_set_acl(inode, buf, buflen);
5146 trace_nfs4_set_acl(inode, err);
5147 err = nfs4_handle_exception(NFS_SERVER(inode), err,
5148 &exception);
5149 } while (exception.retry);
5150 return err;
5151 }
5152
5153 #ifdef CONFIG_NFS_V4_SECURITY_LABEL
_nfs4_get_security_label(struct inode * inode,void * buf,size_t buflen)5154 static int _nfs4_get_security_label(struct inode *inode, void *buf,
5155 size_t buflen)
5156 {
5157 struct nfs_server *server = NFS_SERVER(inode);
5158 struct nfs_fattr fattr;
5159 struct nfs4_label label = {0, 0, buflen, buf};
5160
5161 u32 bitmask[3] = { 0, 0, FATTR4_WORD2_SECURITY_LABEL };
5162 struct nfs4_getattr_arg arg = {
5163 .fh = NFS_FH(inode),
5164 .bitmask = bitmask,
5165 };
5166 struct nfs4_getattr_res res = {
5167 .fattr = &fattr,
5168 .label = &label,
5169 .server = server,
5170 };
5171 struct rpc_message msg = {
5172 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETATTR],
5173 .rpc_argp = &arg,
5174 .rpc_resp = &res,
5175 };
5176 int ret;
5177
5178 nfs_fattr_init(&fattr);
5179
5180 ret = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 0);
5181 if (ret)
5182 return ret;
5183 if (!(fattr.valid & NFS_ATTR_FATTR_V4_SECURITY_LABEL))
5184 return -ENOENT;
5185 if (buflen < label.len)
5186 return -ERANGE;
5187 return 0;
5188 }
5189
nfs4_get_security_label(struct inode * inode,void * buf,size_t buflen)5190 static int nfs4_get_security_label(struct inode *inode, void *buf,
5191 size_t buflen)
5192 {
5193 struct nfs4_exception exception = { };
5194 int err;
5195
5196 if (!nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL))
5197 return -EOPNOTSUPP;
5198
5199 do {
5200 err = _nfs4_get_security_label(inode, buf, buflen);
5201 trace_nfs4_get_security_label(inode, err);
5202 err = nfs4_handle_exception(NFS_SERVER(inode), err,
5203 &exception);
5204 } while (exception.retry);
5205 return err;
5206 }
5207
_nfs4_do_set_security_label(struct inode * inode,struct nfs4_label * ilabel,struct nfs_fattr * fattr,struct nfs4_label * olabel)5208 static int _nfs4_do_set_security_label(struct inode *inode,
5209 struct nfs4_label *ilabel,
5210 struct nfs_fattr *fattr,
5211 struct nfs4_label *olabel)
5212 {
5213
5214 struct iattr sattr = {0};
5215 struct nfs_server *server = NFS_SERVER(inode);
5216 const u32 bitmask[3] = { 0, 0, FATTR4_WORD2_SECURITY_LABEL };
5217 struct nfs_setattrargs arg = {
5218 .fh = NFS_FH(inode),
5219 .iap = &sattr,
5220 .server = server,
5221 .bitmask = bitmask,
5222 .label = ilabel,
5223 };
5224 struct nfs_setattrres res = {
5225 .fattr = fattr,
5226 .label = olabel,
5227 .server = server,
5228 };
5229 struct rpc_message msg = {
5230 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETATTR],
5231 .rpc_argp = &arg,
5232 .rpc_resp = &res,
5233 };
5234 int status;
5235
5236 nfs4_stateid_copy(&arg.stateid, &zero_stateid);
5237
5238 status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
5239 if (status)
5240 dprintk("%s failed: %d\n", __func__, status);
5241
5242 return status;
5243 }
5244
nfs4_do_set_security_label(struct inode * inode,struct nfs4_label * ilabel,struct nfs_fattr * fattr,struct nfs4_label * olabel)5245 static int nfs4_do_set_security_label(struct inode *inode,
5246 struct nfs4_label *ilabel,
5247 struct nfs_fattr *fattr,
5248 struct nfs4_label *olabel)
5249 {
5250 struct nfs4_exception exception = { };
5251 int err;
5252
5253 do {
5254 err = _nfs4_do_set_security_label(inode, ilabel,
5255 fattr, olabel);
5256 trace_nfs4_set_security_label(inode, err);
5257 err = nfs4_handle_exception(NFS_SERVER(inode), err,
5258 &exception);
5259 } while (exception.retry);
5260 return err;
5261 }
5262
5263 static int
nfs4_set_security_label(struct inode * inode,const void * buf,size_t buflen)5264 nfs4_set_security_label(struct inode *inode, const void *buf, size_t buflen)
5265 {
5266 struct nfs4_label ilabel, *olabel = NULL;
5267 struct nfs_fattr fattr;
5268 struct rpc_cred *cred;
5269 int status;
5270
5271 if (!nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL))
5272 return -EOPNOTSUPP;
5273
5274 nfs_fattr_init(&fattr);
5275
5276 ilabel.pi = 0;
5277 ilabel.lfs = 0;
5278 ilabel.label = (char *)buf;
5279 ilabel.len = buflen;
5280
5281 cred = rpc_lookup_cred();
5282 if (IS_ERR(cred))
5283 return PTR_ERR(cred);
5284
5285 olabel = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL);
5286 if (IS_ERR(olabel)) {
5287 status = -PTR_ERR(olabel);
5288 goto out;
5289 }
5290
5291 status = nfs4_do_set_security_label(inode, &ilabel, &fattr, olabel);
5292 if (status == 0)
5293 nfs_setsecurity(inode, &fattr, olabel);
5294
5295 nfs4_label_free(olabel);
5296 out:
5297 put_rpccred(cred);
5298 return status;
5299 }
5300 #endif /* CONFIG_NFS_V4_SECURITY_LABEL */
5301
5302
nfs4_init_boot_verifier(const struct nfs_client * clp,nfs4_verifier * bootverf)5303 static void nfs4_init_boot_verifier(const struct nfs_client *clp,
5304 nfs4_verifier *bootverf)
5305 {
5306 __be32 verf[2];
5307
5308 if (test_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) {
5309 /* An impossible timestamp guarantees this value
5310 * will never match a generated boot time. */
5311 verf[0] = cpu_to_be32(U32_MAX);
5312 verf[1] = cpu_to_be32(U32_MAX);
5313 } else {
5314 struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id);
5315 u64 ns = ktime_to_ns(nn->boot_time);
5316
5317 verf[0] = cpu_to_be32(ns >> 32);
5318 verf[1] = cpu_to_be32(ns);
5319 }
5320 memcpy(bootverf->data, verf, sizeof(bootverf->data));
5321 }
5322
5323 static int
nfs4_init_nonuniform_client_string(struct nfs_client * clp)5324 nfs4_init_nonuniform_client_string(struct nfs_client *clp)
5325 {
5326 size_t len;
5327 char *str;
5328
5329 if (clp->cl_owner_id != NULL)
5330 return 0;
5331
5332 rcu_read_lock();
5333 len = 14 + strlen(clp->cl_ipaddr) + 1 +
5334 strlen(rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_ADDR)) +
5335 1 +
5336 strlen(rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_PROTO)) +
5337 1;
5338 rcu_read_unlock();
5339
5340 if (len > NFS4_OPAQUE_LIMIT + 1)
5341 return -EINVAL;
5342
5343 /*
5344 * Since this string is allocated at mount time, and held until the
5345 * nfs_client is destroyed, we can use GFP_KERNEL here w/o worrying
5346 * about a memory-reclaim deadlock.
5347 */
5348 str = kmalloc(len, GFP_KERNEL);
5349 if (!str)
5350 return -ENOMEM;
5351
5352 rcu_read_lock();
5353 scnprintf(str, len, "Linux NFSv4.0 %s/%s %s",
5354 clp->cl_ipaddr,
5355 rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_ADDR),
5356 rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_PROTO));
5357 rcu_read_unlock();
5358
5359 clp->cl_owner_id = str;
5360 return 0;
5361 }
5362
5363 static int
nfs4_init_uniquifier_client_string(struct nfs_client * clp)5364 nfs4_init_uniquifier_client_string(struct nfs_client *clp)
5365 {
5366 size_t len;
5367 char *str;
5368
5369 len = 10 + 10 + 1 + 10 + 1 +
5370 strlen(nfs4_client_id_uniquifier) + 1 +
5371 strlen(clp->cl_rpcclient->cl_nodename) + 1;
5372
5373 if (len > NFS4_OPAQUE_LIMIT + 1)
5374 return -EINVAL;
5375
5376 /*
5377 * Since this string is allocated at mount time, and held until the
5378 * nfs_client is destroyed, we can use GFP_KERNEL here w/o worrying
5379 * about a memory-reclaim deadlock.
5380 */
5381 str = kmalloc(len, GFP_KERNEL);
5382 if (!str)
5383 return -ENOMEM;
5384
5385 scnprintf(str, len, "Linux NFSv%u.%u %s/%s",
5386 clp->rpc_ops->version, clp->cl_minorversion,
5387 nfs4_client_id_uniquifier,
5388 clp->cl_rpcclient->cl_nodename);
5389 clp->cl_owner_id = str;
5390 return 0;
5391 }
5392
5393 static int
nfs4_init_uniform_client_string(struct nfs_client * clp)5394 nfs4_init_uniform_client_string(struct nfs_client *clp)
5395 {
5396 size_t len;
5397 char *str;
5398
5399 if (clp->cl_owner_id != NULL)
5400 return 0;
5401
5402 if (nfs4_client_id_uniquifier[0] != '\0')
5403 return nfs4_init_uniquifier_client_string(clp);
5404
5405 len = 10 + 10 + 1 + 10 + 1 +
5406 strlen(clp->cl_rpcclient->cl_nodename) + 1;
5407
5408 if (len > NFS4_OPAQUE_LIMIT + 1)
5409 return -EINVAL;
5410
5411 /*
5412 * Since this string is allocated at mount time, and held until the
5413 * nfs_client is destroyed, we can use GFP_KERNEL here w/o worrying
5414 * about a memory-reclaim deadlock.
5415 */
5416 str = kmalloc(len, GFP_KERNEL);
5417 if (!str)
5418 return -ENOMEM;
5419
5420 scnprintf(str, len, "Linux NFSv%u.%u %s",
5421 clp->rpc_ops->version, clp->cl_minorversion,
5422 clp->cl_rpcclient->cl_nodename);
5423 clp->cl_owner_id = str;
5424 return 0;
5425 }
5426
5427 /*
5428 * nfs4_callback_up_net() starts only "tcp" and "tcp6" callback
5429 * services. Advertise one based on the address family of the
5430 * clientaddr.
5431 */
5432 static unsigned int
nfs4_init_callback_netid(const struct nfs_client * clp,char * buf,size_t len)5433 nfs4_init_callback_netid(const struct nfs_client *clp, char *buf, size_t len)
5434 {
5435 if (strchr(clp->cl_ipaddr, ':') != NULL)
5436 return scnprintf(buf, len, "tcp6");
5437 else
5438 return scnprintf(buf, len, "tcp");
5439 }
5440
nfs4_setclientid_done(struct rpc_task * task,void * calldata)5441 static void nfs4_setclientid_done(struct rpc_task *task, void *calldata)
5442 {
5443 struct nfs4_setclientid *sc = calldata;
5444
5445 if (task->tk_status == 0)
5446 sc->sc_cred = get_rpccred(task->tk_rqstp->rq_cred);
5447 }
5448
5449 static const struct rpc_call_ops nfs4_setclientid_ops = {
5450 .rpc_call_done = nfs4_setclientid_done,
5451 };
5452
5453 /**
5454 * nfs4_proc_setclientid - Negotiate client ID
5455 * @clp: state data structure
5456 * @program: RPC program for NFSv4 callback service
5457 * @port: IP port number for NFS4 callback service
5458 * @cred: RPC credential to use for this call
5459 * @res: where to place the result
5460 *
5461 * Returns zero, a negative errno, or a negative NFS4ERR status code.
5462 */
nfs4_proc_setclientid(struct nfs_client * clp,u32 program,unsigned short port,struct rpc_cred * cred,struct nfs4_setclientid_res * res)5463 int nfs4_proc_setclientid(struct nfs_client *clp, u32 program,
5464 unsigned short port, struct rpc_cred *cred,
5465 struct nfs4_setclientid_res *res)
5466 {
5467 nfs4_verifier sc_verifier;
5468 struct nfs4_setclientid setclientid = {
5469 .sc_verifier = &sc_verifier,
5470 .sc_prog = program,
5471 .sc_clnt = clp,
5472 };
5473 struct rpc_message msg = {
5474 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID],
5475 .rpc_argp = &setclientid,
5476 .rpc_resp = res,
5477 .rpc_cred = cred,
5478 };
5479 struct rpc_task *task;
5480 struct rpc_task_setup task_setup_data = {
5481 .rpc_client = clp->cl_rpcclient,
5482 .rpc_message = &msg,
5483 .callback_ops = &nfs4_setclientid_ops,
5484 .callback_data = &setclientid,
5485 .flags = RPC_TASK_TIMEOUT,
5486 };
5487 int status;
5488
5489 /* nfs_client_id4 */
5490 nfs4_init_boot_verifier(clp, &sc_verifier);
5491
5492 if (test_bit(NFS_CS_MIGRATION, &clp->cl_flags))
5493 status = nfs4_init_uniform_client_string(clp);
5494 else
5495 status = nfs4_init_nonuniform_client_string(clp);
5496
5497 if (status)
5498 goto out;
5499
5500 /* cb_client4 */
5501 setclientid.sc_netid_len =
5502 nfs4_init_callback_netid(clp,
5503 setclientid.sc_netid,
5504 sizeof(setclientid.sc_netid));
5505 setclientid.sc_uaddr_len = scnprintf(setclientid.sc_uaddr,
5506 sizeof(setclientid.sc_uaddr), "%s.%u.%u",
5507 clp->cl_ipaddr, port >> 8, port & 255);
5508
5509 dprintk("NFS call setclientid auth=%s, '%s'\n",
5510 clp->cl_rpcclient->cl_auth->au_ops->au_name,
5511 clp->cl_owner_id);
5512 task = rpc_run_task(&task_setup_data);
5513 if (IS_ERR(task)) {
5514 status = PTR_ERR(task);
5515 goto out;
5516 }
5517 status = task->tk_status;
5518 if (setclientid.sc_cred) {
5519 clp->cl_acceptor = rpcauth_stringify_acceptor(setclientid.sc_cred);
5520 put_rpccred(setclientid.sc_cred);
5521 }
5522 rpc_put_task(task);
5523 out:
5524 trace_nfs4_setclientid(clp, status);
5525 dprintk("NFS reply setclientid: %d\n", status);
5526 return status;
5527 }
5528
5529 /**
5530 * nfs4_proc_setclientid_confirm - Confirm client ID
5531 * @clp: state data structure
5532 * @res: result of a previous SETCLIENTID
5533 * @cred: RPC credential to use for this call
5534 *
5535 * Returns zero, a negative errno, or a negative NFS4ERR status code.
5536 */
nfs4_proc_setclientid_confirm(struct nfs_client * clp,struct nfs4_setclientid_res * arg,struct rpc_cred * cred)5537 int nfs4_proc_setclientid_confirm(struct nfs_client *clp,
5538 struct nfs4_setclientid_res *arg,
5539 struct rpc_cred *cred)
5540 {
5541 struct rpc_message msg = {
5542 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID_CONFIRM],
5543 .rpc_argp = arg,
5544 .rpc_cred = cred,
5545 };
5546 int status;
5547
5548 dprintk("NFS call setclientid_confirm auth=%s, (client ID %llx)\n",
5549 clp->cl_rpcclient->cl_auth->au_ops->au_name,
5550 clp->cl_clientid);
5551 status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
5552 trace_nfs4_setclientid_confirm(clp, status);
5553 dprintk("NFS reply setclientid_confirm: %d\n", status);
5554 return status;
5555 }
5556
5557 struct nfs4_delegreturndata {
5558 struct nfs4_delegreturnargs args;
5559 struct nfs4_delegreturnres res;
5560 struct nfs_fh fh;
5561 nfs4_stateid stateid;
5562 unsigned long timestamp;
5563 struct nfs_fattr fattr;
5564 int rpc_status;
5565 struct inode *inode;
5566 bool roc;
5567 u32 roc_barrier;
5568 };
5569
nfs4_delegreturn_done(struct rpc_task * task,void * calldata)5570 static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
5571 {
5572 struct nfs4_delegreturndata *data = calldata;
5573
5574 if (!nfs4_sequence_done(task, &data->res.seq_res))
5575 return;
5576
5577 trace_nfs4_delegreturn_exit(&data->args, &data->res, task->tk_status);
5578 switch (task->tk_status) {
5579 case 0:
5580 renew_lease(data->res.server, data->timestamp);
5581 break;
5582 case -NFS4ERR_ADMIN_REVOKED:
5583 case -NFS4ERR_DELEG_REVOKED:
5584 case -NFS4ERR_EXPIRED:
5585 nfs4_free_revoked_stateid(data->res.server,
5586 data->args.stateid,
5587 task->tk_msg.rpc_cred);
5588 case -NFS4ERR_BAD_STATEID:
5589 case -NFS4ERR_OLD_STATEID:
5590 case -NFS4ERR_STALE_STATEID:
5591 task->tk_status = 0;
5592 break;
5593 default:
5594 if (nfs4_async_handle_error(task, data->res.server,
5595 NULL, NULL) == -EAGAIN) {
5596 rpc_restart_call_prepare(task);
5597 return;
5598 }
5599 }
5600 data->rpc_status = task->tk_status;
5601 if (data->roc && data->rpc_status == 0)
5602 pnfs_roc_set_barrier(data->inode, data->roc_barrier);
5603 }
5604
nfs4_delegreturn_release(void * calldata)5605 static void nfs4_delegreturn_release(void *calldata)
5606 {
5607 struct nfs4_delegreturndata *data = calldata;
5608 struct inode *inode = data->inode;
5609
5610 if (inode) {
5611 if (data->roc)
5612 pnfs_roc_release(inode);
5613 nfs_iput_and_deactive(inode);
5614 }
5615 kfree(calldata);
5616 }
5617
nfs4_delegreturn_prepare(struct rpc_task * task,void * data)5618 static void nfs4_delegreturn_prepare(struct rpc_task *task, void *data)
5619 {
5620 struct nfs4_delegreturndata *d_data;
5621
5622 d_data = (struct nfs4_delegreturndata *)data;
5623
5624 if (nfs4_wait_on_layoutreturn(d_data->inode, task))
5625 return;
5626
5627 if (d_data->roc)
5628 pnfs_roc_get_barrier(d_data->inode, &d_data->roc_barrier);
5629
5630 nfs4_setup_sequence(d_data->res.server,
5631 &d_data->args.seq_args,
5632 &d_data->res.seq_res,
5633 task);
5634 }
5635
5636 static const struct rpc_call_ops nfs4_delegreturn_ops = {
5637 .rpc_call_prepare = nfs4_delegreturn_prepare,
5638 .rpc_call_done = nfs4_delegreturn_done,
5639 .rpc_release = nfs4_delegreturn_release,
5640 };
5641
_nfs4_proc_delegreturn(struct inode * inode,struct rpc_cred * cred,const nfs4_stateid * stateid,int issync)5642 static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync)
5643 {
5644 struct nfs4_delegreturndata *data;
5645 struct nfs_server *server = NFS_SERVER(inode);
5646 struct rpc_task *task;
5647 struct rpc_message msg = {
5648 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DELEGRETURN],
5649 .rpc_cred = cred,
5650 };
5651 struct rpc_task_setup task_setup_data = {
5652 .rpc_client = server->client,
5653 .rpc_message = &msg,
5654 .callback_ops = &nfs4_delegreturn_ops,
5655 .flags = RPC_TASK_ASYNC,
5656 };
5657 int status = 0;
5658
5659 data = kzalloc(sizeof(*data), GFP_NOFS);
5660 if (data == NULL)
5661 return -ENOMEM;
5662 nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1);
5663
5664 nfs4_state_protect(server->nfs_client,
5665 NFS_SP4_MACH_CRED_CLEANUP,
5666 &task_setup_data.rpc_client, &msg);
5667
5668 data->args.fhandle = &data->fh;
5669 data->args.stateid = &data->stateid;
5670 data->args.bitmask = server->cache_consistency_bitmask;
5671 nfs_copy_fh(&data->fh, NFS_FH(inode));
5672 nfs4_stateid_copy(&data->stateid, stateid);
5673 data->res.fattr = &data->fattr;
5674 data->res.server = server;
5675 nfs_fattr_init(data->res.fattr);
5676 data->timestamp = jiffies;
5677 data->rpc_status = 0;
5678 data->inode = nfs_igrab_and_active(inode);
5679 if (data->inode)
5680 data->roc = nfs4_roc(inode);
5681
5682 task_setup_data.callback_data = data;
5683 msg.rpc_argp = &data->args;
5684 msg.rpc_resp = &data->res;
5685 task = rpc_run_task(&task_setup_data);
5686 if (IS_ERR(task))
5687 return PTR_ERR(task);
5688 if (!issync)
5689 goto out;
5690 status = nfs4_wait_for_completion_rpc_task(task);
5691 if (status != 0)
5692 goto out;
5693 status = data->rpc_status;
5694 if (status == 0)
5695 nfs_post_op_update_inode_force_wcc(inode, &data->fattr);
5696 else
5697 nfs_refresh_inode(inode, &data->fattr);
5698 out:
5699 rpc_put_task(task);
5700 return status;
5701 }
5702
nfs4_proc_delegreturn(struct inode * inode,struct rpc_cred * cred,const nfs4_stateid * stateid,int issync)5703 int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync)
5704 {
5705 struct nfs_server *server = NFS_SERVER(inode);
5706 struct nfs4_exception exception = { };
5707 int err;
5708 do {
5709 err = _nfs4_proc_delegreturn(inode, cred, stateid, issync);
5710 trace_nfs4_delegreturn(inode, stateid, err);
5711 switch (err) {
5712 case -NFS4ERR_STALE_STATEID:
5713 case -NFS4ERR_EXPIRED:
5714 case 0:
5715 return 0;
5716 }
5717 err = nfs4_handle_exception(server, err, &exception);
5718 } while (exception.retry);
5719 return err;
5720 }
5721
_nfs4_proc_getlk(struct nfs4_state * state,int cmd,struct file_lock * request)5722 static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
5723 {
5724 struct inode *inode = state->inode;
5725 struct nfs_server *server = NFS_SERVER(inode);
5726 struct nfs_client *clp = server->nfs_client;
5727 struct nfs_lockt_args arg = {
5728 .fh = NFS_FH(inode),
5729 .fl = request,
5730 };
5731 struct nfs_lockt_res res = {
5732 .denied = request,
5733 };
5734 struct rpc_message msg = {
5735 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKT],
5736 .rpc_argp = &arg,
5737 .rpc_resp = &res,
5738 .rpc_cred = state->owner->so_cred,
5739 };
5740 struct nfs4_lock_state *lsp;
5741 int status;
5742
5743 arg.lock_owner.clientid = clp->cl_clientid;
5744 status = nfs4_set_lock_state(state, request);
5745 if (status != 0)
5746 goto out;
5747 lsp = request->fl_u.nfs4_fl.owner;
5748 arg.lock_owner.id = lsp->ls_seqid.owner_id;
5749 arg.lock_owner.s_dev = server->s_dev;
5750 status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
5751 switch (status) {
5752 case 0:
5753 request->fl_type = F_UNLCK;
5754 break;
5755 case -NFS4ERR_DENIED:
5756 status = 0;
5757 }
5758 request->fl_ops->fl_release_private(request);
5759 request->fl_ops = NULL;
5760 out:
5761 return status;
5762 }
5763
nfs4_proc_getlk(struct nfs4_state * state,int cmd,struct file_lock * request)5764 static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
5765 {
5766 struct nfs4_exception exception = { };
5767 int err;
5768
5769 do {
5770 err = _nfs4_proc_getlk(state, cmd, request);
5771 trace_nfs4_get_lock(request, state, cmd, err);
5772 err = nfs4_handle_exception(NFS_SERVER(state->inode), err,
5773 &exception);
5774 } while (exception.retry);
5775 return err;
5776 }
5777
5778 struct nfs4_unlockdata {
5779 struct nfs_locku_args arg;
5780 struct nfs_locku_res res;
5781 struct nfs4_lock_state *lsp;
5782 struct nfs_open_context *ctx;
5783 struct file_lock fl;
5784 struct nfs_server *server;
5785 unsigned long timestamp;
5786 };
5787
nfs4_alloc_unlockdata(struct file_lock * fl,struct nfs_open_context * ctx,struct nfs4_lock_state * lsp,struct nfs_seqid * seqid)5788 static struct nfs4_unlockdata *nfs4_alloc_unlockdata(struct file_lock *fl,
5789 struct nfs_open_context *ctx,
5790 struct nfs4_lock_state *lsp,
5791 struct nfs_seqid *seqid)
5792 {
5793 struct nfs4_unlockdata *p;
5794 struct inode *inode = lsp->ls_state->inode;
5795
5796 p = kzalloc(sizeof(*p), GFP_NOFS);
5797 if (p == NULL)
5798 return NULL;
5799 p->arg.fh = NFS_FH(inode);
5800 p->arg.fl = &p->fl;
5801 p->arg.seqid = seqid;
5802 p->res.seqid = seqid;
5803 p->lsp = lsp;
5804 atomic_inc(&lsp->ls_count);
5805 /* Ensure we don't close file until we're done freeing locks! */
5806 p->ctx = get_nfs_open_context(ctx);
5807 memcpy(&p->fl, fl, sizeof(p->fl));
5808 p->server = NFS_SERVER(inode);
5809 return p;
5810 }
5811
nfs4_locku_release_calldata(void * data)5812 static void nfs4_locku_release_calldata(void *data)
5813 {
5814 struct nfs4_unlockdata *calldata = data;
5815 nfs_free_seqid(calldata->arg.seqid);
5816 nfs4_put_lock_state(calldata->lsp);
5817 put_nfs_open_context(calldata->ctx);
5818 kfree(calldata);
5819 }
5820
nfs4_locku_done(struct rpc_task * task,void * data)5821 static void nfs4_locku_done(struct rpc_task *task, void *data)
5822 {
5823 struct nfs4_unlockdata *calldata = data;
5824
5825 if (!nfs4_sequence_done(task, &calldata->res.seq_res))
5826 return;
5827 switch (task->tk_status) {
5828 case 0:
5829 renew_lease(calldata->server, calldata->timestamp);
5830 locks_lock_inode_wait(calldata->lsp->ls_state->inode, &calldata->fl);
5831 if (nfs4_update_lock_stateid(calldata->lsp,
5832 &calldata->res.stateid))
5833 break;
5834 case -NFS4ERR_ADMIN_REVOKED:
5835 case -NFS4ERR_EXPIRED:
5836 nfs4_free_revoked_stateid(calldata->server,
5837 &calldata->arg.stateid,
5838 task->tk_msg.rpc_cred);
5839 case -NFS4ERR_BAD_STATEID:
5840 case -NFS4ERR_OLD_STATEID:
5841 case -NFS4ERR_STALE_STATEID:
5842 if (!nfs4_stateid_match(&calldata->arg.stateid,
5843 &calldata->lsp->ls_stateid))
5844 rpc_restart_call_prepare(task);
5845 break;
5846 default:
5847 if (nfs4_async_handle_error(task, calldata->server,
5848 NULL, NULL) == -EAGAIN)
5849 rpc_restart_call_prepare(task);
5850 }
5851 nfs_release_seqid(calldata->arg.seqid);
5852 }
5853
nfs4_locku_prepare(struct rpc_task * task,void * data)5854 static void nfs4_locku_prepare(struct rpc_task *task, void *data)
5855 {
5856 struct nfs4_unlockdata *calldata = data;
5857
5858 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
5859 goto out_wait;
5860 nfs4_stateid_copy(&calldata->arg.stateid, &calldata->lsp->ls_stateid);
5861 if (test_bit(NFS_LOCK_INITIALIZED, &calldata->lsp->ls_flags) == 0) {
5862 /* Note: exit _without_ running nfs4_locku_done */
5863 goto out_no_action;
5864 }
5865 calldata->timestamp = jiffies;
5866 if (nfs4_setup_sequence(calldata->server,
5867 &calldata->arg.seq_args,
5868 &calldata->res.seq_res,
5869 task) != 0)
5870 nfs_release_seqid(calldata->arg.seqid);
5871 return;
5872 out_no_action:
5873 task->tk_action = NULL;
5874 out_wait:
5875 nfs4_sequence_done(task, &calldata->res.seq_res);
5876 }
5877
5878 static const struct rpc_call_ops nfs4_locku_ops = {
5879 .rpc_call_prepare = nfs4_locku_prepare,
5880 .rpc_call_done = nfs4_locku_done,
5881 .rpc_release = nfs4_locku_release_calldata,
5882 };
5883
nfs4_do_unlck(struct file_lock * fl,struct nfs_open_context * ctx,struct nfs4_lock_state * lsp,struct nfs_seqid * seqid)5884 static struct rpc_task *nfs4_do_unlck(struct file_lock *fl,
5885 struct nfs_open_context *ctx,
5886 struct nfs4_lock_state *lsp,
5887 struct nfs_seqid *seqid)
5888 {
5889 struct nfs4_unlockdata *data;
5890 struct rpc_message msg = {
5891 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKU],
5892 .rpc_cred = ctx->cred,
5893 };
5894 struct rpc_task_setup task_setup_data = {
5895 .rpc_client = NFS_CLIENT(lsp->ls_state->inode),
5896 .rpc_message = &msg,
5897 .callback_ops = &nfs4_locku_ops,
5898 .workqueue = nfsiod_workqueue,
5899 .flags = RPC_TASK_ASYNC,
5900 };
5901
5902 nfs4_state_protect(NFS_SERVER(lsp->ls_state->inode)->nfs_client,
5903 NFS_SP4_MACH_CRED_CLEANUP, &task_setup_data.rpc_client, &msg);
5904
5905 /* Ensure this is an unlock - when canceling a lock, the
5906 * canceled lock is passed in, and it won't be an unlock.
5907 */
5908 fl->fl_type = F_UNLCK;
5909
5910 data = nfs4_alloc_unlockdata(fl, ctx, lsp, seqid);
5911 if (data == NULL) {
5912 nfs_free_seqid(seqid);
5913 return ERR_PTR(-ENOMEM);
5914 }
5915
5916 nfs4_init_sequence(&data->arg.seq_args, &data->res.seq_res, 1);
5917 msg.rpc_argp = &data->arg;
5918 msg.rpc_resp = &data->res;
5919 task_setup_data.callback_data = data;
5920 return rpc_run_task(&task_setup_data);
5921 }
5922
nfs4_proc_unlck(struct nfs4_state * state,int cmd,struct file_lock * request)5923 static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock *request)
5924 {
5925 struct inode *inode = state->inode;
5926 struct nfs4_state_owner *sp = state->owner;
5927 struct nfs_inode *nfsi = NFS_I(inode);
5928 struct nfs_seqid *seqid;
5929 struct nfs4_lock_state *lsp;
5930 struct rpc_task *task;
5931 struct nfs_seqid *(*alloc_seqid)(struct nfs_seqid_counter *, gfp_t);
5932 int status = 0;
5933 unsigned char fl_flags = request->fl_flags;
5934
5935 status = nfs4_set_lock_state(state, request);
5936 /* Unlock _before_ we do the RPC call */
5937 request->fl_flags |= FL_EXISTS;
5938 /* Exclude nfs_delegation_claim_locks() */
5939 mutex_lock(&sp->so_delegreturn_mutex);
5940 /* Exclude nfs4_reclaim_open_stateid() - note nesting! */
5941 down_read(&nfsi->rwsem);
5942 if (locks_lock_inode_wait(inode, request) == -ENOENT) {
5943 up_read(&nfsi->rwsem);
5944 mutex_unlock(&sp->so_delegreturn_mutex);
5945 goto out;
5946 }
5947 up_read(&nfsi->rwsem);
5948 mutex_unlock(&sp->so_delegreturn_mutex);
5949 if (status != 0)
5950 goto out;
5951 /* Is this a delegated lock? */
5952 lsp = request->fl_u.nfs4_fl.owner;
5953 if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) == 0)
5954 goto out;
5955 alloc_seqid = NFS_SERVER(inode)->nfs_client->cl_mvops->alloc_seqid;
5956 seqid = alloc_seqid(&lsp->ls_seqid, GFP_KERNEL);
5957 status = -ENOMEM;
5958 if (IS_ERR(seqid))
5959 goto out;
5960 task = nfs4_do_unlck(request, nfs_file_open_context(request->fl_file), lsp, seqid);
5961 status = PTR_ERR(task);
5962 if (IS_ERR(task))
5963 goto out;
5964 status = nfs4_wait_for_completion_rpc_task(task);
5965 rpc_put_task(task);
5966 out:
5967 request->fl_flags = fl_flags;
5968 trace_nfs4_unlock(request, state, F_SETLK, status);
5969 return status;
5970 }
5971
5972 struct nfs4_lockdata {
5973 struct nfs_lock_args arg;
5974 struct nfs_lock_res res;
5975 struct nfs4_lock_state *lsp;
5976 struct nfs_open_context *ctx;
5977 struct file_lock fl;
5978 unsigned long timestamp;
5979 int rpc_status;
5980 int cancelled;
5981 struct nfs_server *server;
5982 };
5983
nfs4_alloc_lockdata(struct file_lock * fl,struct nfs_open_context * ctx,struct nfs4_lock_state * lsp,gfp_t gfp_mask)5984 static struct nfs4_lockdata *nfs4_alloc_lockdata(struct file_lock *fl,
5985 struct nfs_open_context *ctx, struct nfs4_lock_state *lsp,
5986 gfp_t gfp_mask)
5987 {
5988 struct nfs4_lockdata *p;
5989 struct inode *inode = lsp->ls_state->inode;
5990 struct nfs_server *server = NFS_SERVER(inode);
5991 struct nfs_seqid *(*alloc_seqid)(struct nfs_seqid_counter *, gfp_t);
5992
5993 p = kzalloc(sizeof(*p), gfp_mask);
5994 if (p == NULL)
5995 return NULL;
5996
5997 p->arg.fh = NFS_FH(inode);
5998 p->arg.fl = &p->fl;
5999 p->arg.open_seqid = nfs_alloc_seqid(&lsp->ls_state->owner->so_seqid, gfp_mask);
6000 if (IS_ERR(p->arg.open_seqid))
6001 goto out_free;
6002 alloc_seqid = server->nfs_client->cl_mvops->alloc_seqid;
6003 p->arg.lock_seqid = alloc_seqid(&lsp->ls_seqid, gfp_mask);
6004 if (IS_ERR(p->arg.lock_seqid))
6005 goto out_free_seqid;
6006 p->arg.lock_owner.clientid = server->nfs_client->cl_clientid;
6007 p->arg.lock_owner.id = lsp->ls_seqid.owner_id;
6008 p->arg.lock_owner.s_dev = server->s_dev;
6009 p->res.lock_seqid = p->arg.lock_seqid;
6010 p->lsp = lsp;
6011 p->server = server;
6012 atomic_inc(&lsp->ls_count);
6013 p->ctx = get_nfs_open_context(ctx);
6014 memcpy(&p->fl, fl, sizeof(p->fl));
6015 return p;
6016 out_free_seqid:
6017 nfs_free_seqid(p->arg.open_seqid);
6018 out_free:
6019 kfree(p);
6020 return NULL;
6021 }
6022
nfs4_lock_prepare(struct rpc_task * task,void * calldata)6023 static void nfs4_lock_prepare(struct rpc_task *task, void *calldata)
6024 {
6025 struct nfs4_lockdata *data = calldata;
6026 struct nfs4_state *state = data->lsp->ls_state;
6027
6028 dprintk("%s: begin!\n", __func__);
6029 if (nfs_wait_on_sequence(data->arg.lock_seqid, task) != 0)
6030 goto out_wait;
6031 /* Do we need to do an open_to_lock_owner? */
6032 if (!test_bit(NFS_LOCK_INITIALIZED, &data->lsp->ls_flags)) {
6033 if (nfs_wait_on_sequence(data->arg.open_seqid, task) != 0) {
6034 goto out_release_lock_seqid;
6035 }
6036 nfs4_stateid_copy(&data->arg.open_stateid,
6037 &state->open_stateid);
6038 data->arg.new_lock_owner = 1;
6039 data->res.open_seqid = data->arg.open_seqid;
6040 } else {
6041 data->arg.new_lock_owner = 0;
6042 nfs4_stateid_copy(&data->arg.lock_stateid,
6043 &data->lsp->ls_stateid);
6044 }
6045 if (!nfs4_valid_open_stateid(state)) {
6046 data->rpc_status = -EBADF;
6047 task->tk_action = NULL;
6048 goto out_release_open_seqid;
6049 }
6050 data->timestamp = jiffies;
6051 if (nfs4_setup_sequence(data->server,
6052 &data->arg.seq_args,
6053 &data->res.seq_res,
6054 task) == 0)
6055 return;
6056 out_release_open_seqid:
6057 nfs_release_seqid(data->arg.open_seqid);
6058 out_release_lock_seqid:
6059 nfs_release_seqid(data->arg.lock_seqid);
6060 out_wait:
6061 nfs4_sequence_done(task, &data->res.seq_res);
6062 dprintk("%s: done!, ret = %d\n", __func__, data->rpc_status);
6063 }
6064
nfs4_lock_done(struct rpc_task * task,void * calldata)6065 static void nfs4_lock_done(struct rpc_task *task, void *calldata)
6066 {
6067 struct nfs4_lockdata *data = calldata;
6068 struct nfs4_lock_state *lsp = data->lsp;
6069
6070 dprintk("%s: begin!\n", __func__);
6071
6072 if (!nfs4_sequence_done(task, &data->res.seq_res))
6073 return;
6074
6075 data->rpc_status = task->tk_status;
6076 switch (task->tk_status) {
6077 case 0:
6078 renew_lease(NFS_SERVER(d_inode(data->ctx->dentry)),
6079 data->timestamp);
6080 if (data->arg.new_lock) {
6081 data->fl.fl_flags &= ~(FL_SLEEP | FL_ACCESS);
6082 if (locks_lock_inode_wait(lsp->ls_state->inode, &data->fl) < 0) {
6083 rpc_restart_call_prepare(task);
6084 break;
6085 }
6086 }
6087 if (data->arg.new_lock_owner != 0) {
6088 nfs_confirm_seqid(&lsp->ls_seqid, 0);
6089 nfs4_stateid_copy(&lsp->ls_stateid, &data->res.stateid);
6090 set_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags);
6091 } else if (!nfs4_update_lock_stateid(lsp, &data->res.stateid))
6092 rpc_restart_call_prepare(task);
6093 break;
6094 case -NFS4ERR_BAD_STATEID:
6095 case -NFS4ERR_OLD_STATEID:
6096 case -NFS4ERR_STALE_STATEID:
6097 case -NFS4ERR_EXPIRED:
6098 if (data->arg.new_lock_owner != 0) {
6099 if (!nfs4_stateid_match(&data->arg.open_stateid,
6100 &lsp->ls_state->open_stateid))
6101 rpc_restart_call_prepare(task);
6102 } else if (!nfs4_stateid_match(&data->arg.lock_stateid,
6103 &lsp->ls_stateid))
6104 rpc_restart_call_prepare(task);
6105 }
6106 dprintk("%s: done, ret = %d!\n", __func__, data->rpc_status);
6107 }
6108
nfs4_lock_release(void * calldata)6109 static void nfs4_lock_release(void *calldata)
6110 {
6111 struct nfs4_lockdata *data = calldata;
6112
6113 dprintk("%s: begin!\n", __func__);
6114 nfs_free_seqid(data->arg.open_seqid);
6115 if (data->cancelled != 0) {
6116 struct rpc_task *task;
6117 task = nfs4_do_unlck(&data->fl, data->ctx, data->lsp,
6118 data->arg.lock_seqid);
6119 if (!IS_ERR(task))
6120 rpc_put_task_async(task);
6121 dprintk("%s: cancelling lock!\n", __func__);
6122 } else
6123 nfs_free_seqid(data->arg.lock_seqid);
6124 nfs4_put_lock_state(data->lsp);
6125 put_nfs_open_context(data->ctx);
6126 kfree(data);
6127 dprintk("%s: done!\n", __func__);
6128 }
6129
6130 static const struct rpc_call_ops nfs4_lock_ops = {
6131 .rpc_call_prepare = nfs4_lock_prepare,
6132 .rpc_call_done = nfs4_lock_done,
6133 .rpc_release = nfs4_lock_release,
6134 };
6135
nfs4_handle_setlk_error(struct nfs_server * server,struct nfs4_lock_state * lsp,int new_lock_owner,int error)6136 static void nfs4_handle_setlk_error(struct nfs_server *server, struct nfs4_lock_state *lsp, int new_lock_owner, int error)
6137 {
6138 switch (error) {
6139 case -NFS4ERR_ADMIN_REVOKED:
6140 case -NFS4ERR_EXPIRED:
6141 case -NFS4ERR_BAD_STATEID:
6142 lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED;
6143 if (new_lock_owner != 0 ||
6144 test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) != 0)
6145 nfs4_schedule_stateid_recovery(server, lsp->ls_state);
6146 break;
6147 case -NFS4ERR_STALE_STATEID:
6148 lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED;
6149 nfs4_schedule_lease_recovery(server->nfs_client);
6150 };
6151 }
6152
_nfs4_do_setlk(struct nfs4_state * state,int cmd,struct file_lock * fl,int recovery_type)6153 static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int recovery_type)
6154 {
6155 struct nfs4_lockdata *data;
6156 struct rpc_task *task;
6157 struct rpc_message msg = {
6158 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCK],
6159 .rpc_cred = state->owner->so_cred,
6160 };
6161 struct rpc_task_setup task_setup_data = {
6162 .rpc_client = NFS_CLIENT(state->inode),
6163 .rpc_message = &msg,
6164 .callback_ops = &nfs4_lock_ops,
6165 .workqueue = nfsiod_workqueue,
6166 .flags = RPC_TASK_ASYNC,
6167 };
6168 int ret;
6169
6170 dprintk("%s: begin!\n", __func__);
6171 data = nfs4_alloc_lockdata(fl, nfs_file_open_context(fl->fl_file),
6172 fl->fl_u.nfs4_fl.owner,
6173 recovery_type == NFS_LOCK_NEW ? GFP_KERNEL : GFP_NOFS);
6174 if (data == NULL)
6175 return -ENOMEM;
6176 if (IS_SETLKW(cmd))
6177 data->arg.block = 1;
6178 nfs4_init_sequence(&data->arg.seq_args, &data->res.seq_res, 1);
6179 msg.rpc_argp = &data->arg;
6180 msg.rpc_resp = &data->res;
6181 task_setup_data.callback_data = data;
6182 if (recovery_type > NFS_LOCK_NEW) {
6183 if (recovery_type == NFS_LOCK_RECLAIM)
6184 data->arg.reclaim = NFS_LOCK_RECLAIM;
6185 nfs4_set_sequence_privileged(&data->arg.seq_args);
6186 } else
6187 data->arg.new_lock = 1;
6188 task = rpc_run_task(&task_setup_data);
6189 if (IS_ERR(task))
6190 return PTR_ERR(task);
6191 ret = nfs4_wait_for_completion_rpc_task(task);
6192 if (ret == 0) {
6193 ret = data->rpc_status;
6194 if (ret)
6195 nfs4_handle_setlk_error(data->server, data->lsp,
6196 data->arg.new_lock_owner, ret);
6197 } else
6198 data->cancelled = 1;
6199 rpc_put_task(task);
6200 dprintk("%s: done, ret = %d!\n", __func__, ret);
6201 trace_nfs4_set_lock(fl, state, &data->res.stateid, cmd, ret);
6202 return ret;
6203 }
6204
nfs4_lock_reclaim(struct nfs4_state * state,struct file_lock * request)6205 static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request)
6206 {
6207 struct nfs_server *server = NFS_SERVER(state->inode);
6208 struct nfs4_exception exception = {
6209 .inode = state->inode,
6210 };
6211 int err;
6212
6213 do {
6214 /* Cache the lock if possible... */
6215 if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
6216 return 0;
6217 err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_RECLAIM);
6218 if (err != -NFS4ERR_DELAY)
6219 break;
6220 nfs4_handle_exception(server, err, &exception);
6221 } while (exception.retry);
6222 return err;
6223 }
6224
nfs4_lock_expired(struct nfs4_state * state,struct file_lock * request)6225 static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request)
6226 {
6227 struct nfs_server *server = NFS_SERVER(state->inode);
6228 struct nfs4_exception exception = {
6229 .inode = state->inode,
6230 };
6231 int err;
6232
6233 err = nfs4_set_lock_state(state, request);
6234 if (err != 0)
6235 return err;
6236 if (!recover_lost_locks) {
6237 set_bit(NFS_LOCK_LOST, &request->fl_u.nfs4_fl.owner->ls_flags);
6238 return 0;
6239 }
6240 do {
6241 if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0)
6242 return 0;
6243 err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_EXPIRED);
6244 switch (err) {
6245 default:
6246 goto out;
6247 case -NFS4ERR_GRACE:
6248 case -NFS4ERR_DELAY:
6249 nfs4_handle_exception(server, err, &exception);
6250 err = 0;
6251 }
6252 } while (exception.retry);
6253 out:
6254 return err;
6255 }
6256
6257 #if defined(CONFIG_NFS_V4_1)
nfs41_lock_expired(struct nfs4_state * state,struct file_lock * request)6258 static int nfs41_lock_expired(struct nfs4_state *state, struct file_lock *request)
6259 {
6260 struct nfs4_lock_state *lsp;
6261 int status;
6262
6263 status = nfs4_set_lock_state(state, request);
6264 if (status != 0)
6265 return status;
6266 lsp = request->fl_u.nfs4_fl.owner;
6267 if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) ||
6268 test_bit(NFS_LOCK_LOST, &lsp->ls_flags))
6269 return 0;
6270 status = nfs4_lock_expired(state, request);
6271 return status;
6272 }
6273 #endif
6274
_nfs4_proc_setlk(struct nfs4_state * state,int cmd,struct file_lock * request)6275 static int _nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
6276 {
6277 struct nfs_inode *nfsi = NFS_I(state->inode);
6278 struct nfs4_state_owner *sp = state->owner;
6279 unsigned char fl_flags = request->fl_flags;
6280 int status;
6281
6282 request->fl_flags |= FL_ACCESS;
6283 status = locks_lock_inode_wait(state->inode, request);
6284 if (status < 0)
6285 goto out;
6286 mutex_lock(&sp->so_delegreturn_mutex);
6287 down_read(&nfsi->rwsem);
6288 if (test_bit(NFS_DELEGATED_STATE, &state->flags)) {
6289 /* Yes: cache locks! */
6290 /* ...but avoid races with delegation recall... */
6291 request->fl_flags = fl_flags & ~FL_SLEEP;
6292 status = locks_lock_inode_wait(state->inode, request);
6293 up_read(&nfsi->rwsem);
6294 mutex_unlock(&sp->so_delegreturn_mutex);
6295 goto out;
6296 }
6297 up_read(&nfsi->rwsem);
6298 mutex_unlock(&sp->so_delegreturn_mutex);
6299 status = _nfs4_do_setlk(state, cmd, request, NFS_LOCK_NEW);
6300 out:
6301 request->fl_flags = fl_flags;
6302 return status;
6303 }
6304
nfs4_proc_setlk(struct nfs4_state * state,int cmd,struct file_lock * request)6305 static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
6306 {
6307 struct nfs4_exception exception = {
6308 .state = state,
6309 .inode = state->inode,
6310 };
6311 int err;
6312
6313 do {
6314 err = _nfs4_proc_setlk(state, cmd, request);
6315 if (err == -NFS4ERR_DENIED)
6316 err = -EAGAIN;
6317 err = nfs4_handle_exception(NFS_SERVER(state->inode),
6318 err, &exception);
6319 } while (exception.retry);
6320 return err;
6321 }
6322
6323 #define NFS4_LOCK_MINTIMEOUT (1 * HZ)
6324 #define NFS4_LOCK_MAXTIMEOUT (30 * HZ)
6325
6326 static int
nfs4_retry_setlk_simple(struct nfs4_state * state,int cmd,struct file_lock * request)6327 nfs4_retry_setlk_simple(struct nfs4_state *state, int cmd,
6328 struct file_lock *request)
6329 {
6330 int status = -ERESTARTSYS;
6331 unsigned long timeout = NFS4_LOCK_MINTIMEOUT;
6332
6333 while(!signalled()) {
6334 status = nfs4_proc_setlk(state, cmd, request);
6335 if ((status != -EAGAIN) || IS_SETLK(cmd))
6336 break;
6337 freezable_schedule_timeout_interruptible(timeout);
6338 timeout *= 2;
6339 timeout = min_t(unsigned long, NFS4_LOCK_MAXTIMEOUT, timeout);
6340 status = -ERESTARTSYS;
6341 }
6342 return status;
6343 }
6344
6345 #ifdef CONFIG_NFS_V4_1
6346 struct nfs4_lock_waiter {
6347 struct task_struct *task;
6348 struct inode *inode;
6349 struct nfs_lowner *owner;
6350 bool notified;
6351 };
6352
6353 static int
nfs4_wake_lock_waiter(wait_queue_t * wait,unsigned int mode,int flags,void * key)6354 nfs4_wake_lock_waiter(wait_queue_t *wait, unsigned int mode, int flags, void *key)
6355 {
6356 int ret;
6357 struct cb_notify_lock_args *cbnl = key;
6358 struct nfs4_lock_waiter *waiter = wait->private;
6359 struct nfs_lowner *lowner = &cbnl->cbnl_owner,
6360 *wowner = waiter->owner;
6361
6362 /* Only wake if the callback was for the same owner */
6363 if (lowner->clientid != wowner->clientid ||
6364 lowner->id != wowner->id ||
6365 lowner->s_dev != wowner->s_dev)
6366 return 0;
6367
6368 /* Make sure it's for the right inode */
6369 if (nfs_compare_fh(NFS_FH(waiter->inode), &cbnl->cbnl_fh))
6370 return 0;
6371
6372 waiter->notified = true;
6373
6374 /* override "private" so we can use default_wake_function */
6375 wait->private = waiter->task;
6376 ret = autoremove_wake_function(wait, mode, flags, key);
6377 wait->private = waiter;
6378 return ret;
6379 }
6380
6381 static int
nfs4_retry_setlk(struct nfs4_state * state,int cmd,struct file_lock * request)6382 nfs4_retry_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
6383 {
6384 int status = -ERESTARTSYS;
6385 unsigned long flags;
6386 struct nfs4_lock_state *lsp = request->fl_u.nfs4_fl.owner;
6387 struct nfs_server *server = NFS_SERVER(state->inode);
6388 struct nfs_client *clp = server->nfs_client;
6389 wait_queue_head_t *q = &clp->cl_lock_waitq;
6390 struct nfs_lowner owner = { .clientid = clp->cl_clientid,
6391 .id = lsp->ls_seqid.owner_id,
6392 .s_dev = server->s_dev };
6393 struct nfs4_lock_waiter waiter = { .task = current,
6394 .inode = state->inode,
6395 .owner = &owner,
6396 .notified = false };
6397 wait_queue_t wait;
6398
6399 /* Don't bother with waitqueue if we don't expect a callback */
6400 if (!test_bit(NFS_STATE_MAY_NOTIFY_LOCK, &state->flags))
6401 return nfs4_retry_setlk_simple(state, cmd, request);
6402
6403 init_wait(&wait);
6404 wait.private = &waiter;
6405 wait.func = nfs4_wake_lock_waiter;
6406 add_wait_queue(q, &wait);
6407
6408 while(!signalled()) {
6409 status = nfs4_proc_setlk(state, cmd, request);
6410 if ((status != -EAGAIN) || IS_SETLK(cmd))
6411 break;
6412
6413 status = -ERESTARTSYS;
6414 spin_lock_irqsave(&q->lock, flags);
6415 if (waiter.notified) {
6416 spin_unlock_irqrestore(&q->lock, flags);
6417 continue;
6418 }
6419 set_current_state(TASK_INTERRUPTIBLE);
6420 spin_unlock_irqrestore(&q->lock, flags);
6421
6422 freezable_schedule_timeout(NFS4_LOCK_MAXTIMEOUT);
6423 }
6424
6425 finish_wait(q, &wait);
6426 return status;
6427 }
6428 #else /* !CONFIG_NFS_V4_1 */
6429 static inline int
nfs4_retry_setlk(struct nfs4_state * state,int cmd,struct file_lock * request)6430 nfs4_retry_setlk(struct nfs4_state *state, int cmd, struct file_lock *request)
6431 {
6432 return nfs4_retry_setlk_simple(state, cmd, request);
6433 }
6434 #endif
6435
6436 static int
nfs4_proc_lock(struct file * filp,int cmd,struct file_lock * request)6437 nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request)
6438 {
6439 struct nfs_open_context *ctx;
6440 struct nfs4_state *state;
6441 int status;
6442
6443 /* verify open state */
6444 ctx = nfs_file_open_context(filp);
6445 state = ctx->state;
6446
6447 if (request->fl_start < 0 || request->fl_end < 0)
6448 return -EINVAL;
6449
6450 if (IS_GETLK(cmd)) {
6451 if (state != NULL)
6452 return nfs4_proc_getlk(state, F_GETLK, request);
6453 return 0;
6454 }
6455
6456 if (!(IS_SETLK(cmd) || IS_SETLKW(cmd)))
6457 return -EINVAL;
6458
6459 if (request->fl_type == F_UNLCK) {
6460 if (state != NULL)
6461 return nfs4_proc_unlck(state, cmd, request);
6462 return 0;
6463 }
6464
6465 if (state == NULL)
6466 return -ENOLCK;
6467
6468 if ((request->fl_flags & FL_POSIX) &&
6469 !test_bit(NFS_STATE_POSIX_LOCKS, &state->flags))
6470 return -ENOLCK;
6471
6472 /*
6473 * Don't rely on the VFS having checked the file open mode,
6474 * since it won't do this for flock() locks.
6475 */
6476 switch (request->fl_type) {
6477 case F_RDLCK:
6478 if (!(filp->f_mode & FMODE_READ))
6479 return -EBADF;
6480 break;
6481 case F_WRLCK:
6482 if (!(filp->f_mode & FMODE_WRITE))
6483 return -EBADF;
6484 }
6485
6486 status = nfs4_set_lock_state(state, request);
6487 if (status != 0)
6488 return status;
6489
6490 return nfs4_retry_setlk(state, cmd, request);
6491 }
6492
nfs4_lock_delegation_recall(struct file_lock * fl,struct nfs4_state * state,const nfs4_stateid * stateid)6493 int nfs4_lock_delegation_recall(struct file_lock *fl, struct nfs4_state *state, const nfs4_stateid *stateid)
6494 {
6495 struct nfs_server *server = NFS_SERVER(state->inode);
6496 int err;
6497
6498 err = nfs4_set_lock_state(state, fl);
6499 if (err != 0)
6500 return err;
6501 err = _nfs4_do_setlk(state, F_SETLK, fl, NFS_LOCK_NEW);
6502 return nfs4_handle_delegation_recall_error(server, state, stateid, err);
6503 }
6504
6505 struct nfs_release_lockowner_data {
6506 struct nfs4_lock_state *lsp;
6507 struct nfs_server *server;
6508 struct nfs_release_lockowner_args args;
6509 struct nfs_release_lockowner_res res;
6510 unsigned long timestamp;
6511 };
6512
nfs4_release_lockowner_prepare(struct rpc_task * task,void * calldata)6513 static void nfs4_release_lockowner_prepare(struct rpc_task *task, void *calldata)
6514 {
6515 struct nfs_release_lockowner_data *data = calldata;
6516 struct nfs_server *server = data->server;
6517 nfs40_setup_sequence(server->nfs_client->cl_slot_tbl,
6518 &data->args.seq_args, &data->res.seq_res, task);
6519 data->args.lock_owner.clientid = server->nfs_client->cl_clientid;
6520 data->timestamp = jiffies;
6521 }
6522
nfs4_release_lockowner_done(struct rpc_task * task,void * calldata)6523 static void nfs4_release_lockowner_done(struct rpc_task *task, void *calldata)
6524 {
6525 struct nfs_release_lockowner_data *data = calldata;
6526 struct nfs_server *server = data->server;
6527
6528 nfs40_sequence_done(task, &data->res.seq_res);
6529
6530 switch (task->tk_status) {
6531 case 0:
6532 renew_lease(server, data->timestamp);
6533 break;
6534 case -NFS4ERR_STALE_CLIENTID:
6535 case -NFS4ERR_EXPIRED:
6536 nfs4_schedule_lease_recovery(server->nfs_client);
6537 break;
6538 case -NFS4ERR_LEASE_MOVED:
6539 case -NFS4ERR_DELAY:
6540 if (nfs4_async_handle_error(task, server,
6541 NULL, NULL) == -EAGAIN)
6542 rpc_restart_call_prepare(task);
6543 }
6544 }
6545
nfs4_release_lockowner_release(void * calldata)6546 static void nfs4_release_lockowner_release(void *calldata)
6547 {
6548 struct nfs_release_lockowner_data *data = calldata;
6549 nfs4_free_lock_state(data->server, data->lsp);
6550 kfree(calldata);
6551 }
6552
6553 static const struct rpc_call_ops nfs4_release_lockowner_ops = {
6554 .rpc_call_prepare = nfs4_release_lockowner_prepare,
6555 .rpc_call_done = nfs4_release_lockowner_done,
6556 .rpc_release = nfs4_release_lockowner_release,
6557 };
6558
6559 static void
nfs4_release_lockowner(struct nfs_server * server,struct nfs4_lock_state * lsp)6560 nfs4_release_lockowner(struct nfs_server *server, struct nfs4_lock_state *lsp)
6561 {
6562 struct nfs_release_lockowner_data *data;
6563 struct rpc_message msg = {
6564 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RELEASE_LOCKOWNER],
6565 };
6566
6567 if (server->nfs_client->cl_mvops->minor_version != 0)
6568 return;
6569
6570 data = kmalloc(sizeof(*data), GFP_NOFS);
6571 if (!data)
6572 return;
6573 data->lsp = lsp;
6574 data->server = server;
6575 data->args.lock_owner.clientid = server->nfs_client->cl_clientid;
6576 data->args.lock_owner.id = lsp->ls_seqid.owner_id;
6577 data->args.lock_owner.s_dev = server->s_dev;
6578
6579 msg.rpc_argp = &data->args;
6580 msg.rpc_resp = &data->res;
6581 nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 0);
6582 rpc_call_async(server->client, &msg, 0, &nfs4_release_lockowner_ops, data);
6583 }
6584
6585 #define XATTR_NAME_NFSV4_ACL "system.nfs4_acl"
6586
nfs4_xattr_set_nfs4_acl(const struct xattr_handler * handler,struct dentry * unused,struct inode * inode,const char * key,const void * buf,size_t buflen,int flags)6587 static int nfs4_xattr_set_nfs4_acl(const struct xattr_handler *handler,
6588 struct dentry *unused, struct inode *inode,
6589 const char *key, const void *buf,
6590 size_t buflen, int flags)
6591 {
6592 return nfs4_proc_set_acl(inode, buf, buflen);
6593 }
6594
nfs4_xattr_get_nfs4_acl(const struct xattr_handler * handler,struct dentry * unused,struct inode * inode,const char * key,void * buf,size_t buflen)6595 static int nfs4_xattr_get_nfs4_acl(const struct xattr_handler *handler,
6596 struct dentry *unused, struct inode *inode,
6597 const char *key, void *buf, size_t buflen)
6598 {
6599 return nfs4_proc_get_acl(inode, buf, buflen);
6600 }
6601
nfs4_xattr_list_nfs4_acl(struct dentry * dentry)6602 static bool nfs4_xattr_list_nfs4_acl(struct dentry *dentry)
6603 {
6604 return nfs4_server_supports_acls(NFS_SERVER(d_inode(dentry)));
6605 }
6606
6607 #ifdef CONFIG_NFS_V4_SECURITY_LABEL
6608
nfs4_xattr_set_nfs4_label(const struct xattr_handler * handler,struct dentry * unused,struct inode * inode,const char * key,const void * buf,size_t buflen,int flags)6609 static int nfs4_xattr_set_nfs4_label(const struct xattr_handler *handler,
6610 struct dentry *unused, struct inode *inode,
6611 const char *key, const void *buf,
6612 size_t buflen, int flags)
6613 {
6614 if (security_ismaclabel(key))
6615 return nfs4_set_security_label(inode, buf, buflen);
6616
6617 return -EOPNOTSUPP;
6618 }
6619
nfs4_xattr_get_nfs4_label(const struct xattr_handler * handler,struct dentry * unused,struct inode * inode,const char * key,void * buf,size_t buflen)6620 static int nfs4_xattr_get_nfs4_label(const struct xattr_handler *handler,
6621 struct dentry *unused, struct inode *inode,
6622 const char *key, void *buf, size_t buflen)
6623 {
6624 if (security_ismaclabel(key))
6625 return nfs4_get_security_label(inode, buf, buflen);
6626 return -EOPNOTSUPP;
6627 }
6628
6629 static ssize_t
nfs4_listxattr_nfs4_label(struct inode * inode,char * list,size_t list_len)6630 nfs4_listxattr_nfs4_label(struct inode *inode, char *list, size_t list_len)
6631 {
6632 int len = 0;
6633
6634 if (nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL)) {
6635 len = security_inode_listsecurity(inode, list, list_len);
6636 if (list_len && len > list_len)
6637 return -ERANGE;
6638 }
6639 return len;
6640 }
6641
6642 static const struct xattr_handler nfs4_xattr_nfs4_label_handler = {
6643 .prefix = XATTR_SECURITY_PREFIX,
6644 .get = nfs4_xattr_get_nfs4_label,
6645 .set = nfs4_xattr_set_nfs4_label,
6646 };
6647
6648 #else
6649
6650 static ssize_t
nfs4_listxattr_nfs4_label(struct inode * inode,char * list,size_t list_len)6651 nfs4_listxattr_nfs4_label(struct inode *inode, char *list, size_t list_len)
6652 {
6653 return 0;
6654 }
6655
6656 #endif
6657
6658 /*
6659 * nfs_fhget will use either the mounted_on_fileid or the fileid
6660 */
nfs_fixup_referral_attributes(struct nfs_fattr * fattr)6661 static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr)
6662 {
6663 if (!(((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) ||
6664 (fattr->valid & NFS_ATTR_FATTR_FILEID)) &&
6665 (fattr->valid & NFS_ATTR_FATTR_FSID) &&
6666 (fattr->valid & NFS_ATTR_FATTR_V4_LOCATIONS)))
6667 return;
6668
6669 fattr->valid |= NFS_ATTR_FATTR_TYPE | NFS_ATTR_FATTR_MODE |
6670 NFS_ATTR_FATTR_NLINK | NFS_ATTR_FATTR_V4_REFERRAL;
6671 fattr->mode = S_IFDIR | S_IRUGO | S_IXUGO;
6672 fattr->nlink = 2;
6673 }
6674
_nfs4_proc_fs_locations(struct rpc_clnt * client,struct inode * dir,const struct qstr * name,struct nfs4_fs_locations * fs_locations,struct page * page)6675 static int _nfs4_proc_fs_locations(struct rpc_clnt *client, struct inode *dir,
6676 const struct qstr *name,
6677 struct nfs4_fs_locations *fs_locations,
6678 struct page *page)
6679 {
6680 struct nfs_server *server = NFS_SERVER(dir);
6681 u32 bitmask[3];
6682 struct nfs4_fs_locations_arg args = {
6683 .dir_fh = NFS_FH(dir),
6684 .name = name,
6685 .page = page,
6686 .bitmask = bitmask,
6687 };
6688 struct nfs4_fs_locations_res res = {
6689 .fs_locations = fs_locations,
6690 };
6691 struct rpc_message msg = {
6692 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS],
6693 .rpc_argp = &args,
6694 .rpc_resp = &res,
6695 };
6696 int status;
6697
6698 dprintk("%s: start\n", __func__);
6699
6700 bitmask[0] = nfs4_fattr_bitmap[0] | FATTR4_WORD0_FS_LOCATIONS;
6701 bitmask[1] = nfs4_fattr_bitmap[1];
6702
6703 /* Ask for the fileid of the absent filesystem if mounted_on_fileid
6704 * is not supported */
6705 if (NFS_SERVER(dir)->attr_bitmask[1] & FATTR4_WORD1_MOUNTED_ON_FILEID)
6706 bitmask[0] &= ~FATTR4_WORD0_FILEID;
6707 else
6708 bitmask[1] &= ~FATTR4_WORD1_MOUNTED_ON_FILEID;
6709
6710 nfs_fattr_init(&fs_locations->fattr);
6711 fs_locations->server = server;
6712 fs_locations->nlocations = 0;
6713 status = nfs4_call_sync(client, server, &msg, &args.seq_args, &res.seq_res, 0);
6714 dprintk("%s: returned status = %d\n", __func__, status);
6715 return status;
6716 }
6717
nfs4_proc_fs_locations(struct rpc_clnt * client,struct inode * dir,const struct qstr * name,struct nfs4_fs_locations * fs_locations,struct page * page)6718 int nfs4_proc_fs_locations(struct rpc_clnt *client, struct inode *dir,
6719 const struct qstr *name,
6720 struct nfs4_fs_locations *fs_locations,
6721 struct page *page)
6722 {
6723 struct nfs4_exception exception = { };
6724 int err;
6725 do {
6726 err = _nfs4_proc_fs_locations(client, dir, name,
6727 fs_locations, page);
6728 trace_nfs4_get_fs_locations(dir, name, err);
6729 err = nfs4_handle_exception(NFS_SERVER(dir), err,
6730 &exception);
6731 } while (exception.retry);
6732 return err;
6733 }
6734
6735 /*
6736 * This operation also signals the server that this client is
6737 * performing migration recovery. The server can stop returning
6738 * NFS4ERR_LEASE_MOVED to this client. A RENEW operation is
6739 * appended to this compound to identify the client ID which is
6740 * performing recovery.
6741 */
_nfs40_proc_get_locations(struct inode * inode,struct nfs4_fs_locations * locations,struct page * page,struct rpc_cred * cred)6742 static int _nfs40_proc_get_locations(struct inode *inode,
6743 struct nfs4_fs_locations *locations,
6744 struct page *page, struct rpc_cred *cred)
6745 {
6746 struct nfs_server *server = NFS_SERVER(inode);
6747 struct rpc_clnt *clnt = server->client;
6748 u32 bitmask[2] = {
6749 [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS,
6750 };
6751 struct nfs4_fs_locations_arg args = {
6752 .clientid = server->nfs_client->cl_clientid,
6753 .fh = NFS_FH(inode),
6754 .page = page,
6755 .bitmask = bitmask,
6756 .migration = 1, /* skip LOOKUP */
6757 .renew = 1, /* append RENEW */
6758 };
6759 struct nfs4_fs_locations_res res = {
6760 .fs_locations = locations,
6761 .migration = 1,
6762 .renew = 1,
6763 };
6764 struct rpc_message msg = {
6765 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS],
6766 .rpc_argp = &args,
6767 .rpc_resp = &res,
6768 .rpc_cred = cred,
6769 };
6770 unsigned long now = jiffies;
6771 int status;
6772
6773 nfs_fattr_init(&locations->fattr);
6774 locations->server = server;
6775 locations->nlocations = 0;
6776
6777 nfs4_init_sequence(&args.seq_args, &res.seq_res, 0);
6778 nfs4_set_sequence_privileged(&args.seq_args);
6779 status = nfs4_call_sync_sequence(clnt, server, &msg,
6780 &args.seq_args, &res.seq_res);
6781 if (status)
6782 return status;
6783
6784 renew_lease(server, now);
6785 return 0;
6786 }
6787
6788 #ifdef CONFIG_NFS_V4_1
6789
6790 /*
6791 * This operation also signals the server that this client is
6792 * performing migration recovery. The server can stop asserting
6793 * SEQ4_STATUS_LEASE_MOVED for this client. The client ID
6794 * performing this operation is identified in the SEQUENCE
6795 * operation in this compound.
6796 *
6797 * When the client supports GETATTR(fs_locations_info), it can
6798 * be plumbed in here.
6799 */
_nfs41_proc_get_locations(struct inode * inode,struct nfs4_fs_locations * locations,struct page * page,struct rpc_cred * cred)6800 static int _nfs41_proc_get_locations(struct inode *inode,
6801 struct nfs4_fs_locations *locations,
6802 struct page *page, struct rpc_cred *cred)
6803 {
6804 struct nfs_server *server = NFS_SERVER(inode);
6805 struct rpc_clnt *clnt = server->client;
6806 u32 bitmask[2] = {
6807 [0] = FATTR4_WORD0_FSID | FATTR4_WORD0_FS_LOCATIONS,
6808 };
6809 struct nfs4_fs_locations_arg args = {
6810 .fh = NFS_FH(inode),
6811 .page = page,
6812 .bitmask = bitmask,
6813 .migration = 1, /* skip LOOKUP */
6814 };
6815 struct nfs4_fs_locations_res res = {
6816 .fs_locations = locations,
6817 .migration = 1,
6818 };
6819 struct rpc_message msg = {
6820 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FS_LOCATIONS],
6821 .rpc_argp = &args,
6822 .rpc_resp = &res,
6823 .rpc_cred = cred,
6824 };
6825 int status;
6826
6827 nfs_fattr_init(&locations->fattr);
6828 locations->server = server;
6829 locations->nlocations = 0;
6830
6831 nfs4_init_sequence(&args.seq_args, &res.seq_res, 0);
6832 nfs4_set_sequence_privileged(&args.seq_args);
6833 status = nfs4_call_sync_sequence(clnt, server, &msg,
6834 &args.seq_args, &res.seq_res);
6835 if (status == NFS4_OK &&
6836 res.seq_res.sr_status_flags & SEQ4_STATUS_LEASE_MOVED)
6837 status = -NFS4ERR_LEASE_MOVED;
6838 return status;
6839 }
6840
6841 #endif /* CONFIG_NFS_V4_1 */
6842
6843 /**
6844 * nfs4_proc_get_locations - discover locations for a migrated FSID
6845 * @inode: inode on FSID that is migrating
6846 * @locations: result of query
6847 * @page: buffer
6848 * @cred: credential to use for this operation
6849 *
6850 * Returns NFS4_OK on success, a negative NFS4ERR status code if the
6851 * operation failed, or a negative errno if a local error occurred.
6852 *
6853 * On success, "locations" is filled in, but if the server has
6854 * no locations information, NFS_ATTR_FATTR_V4_LOCATIONS is not
6855 * asserted.
6856 *
6857 * -NFS4ERR_LEASE_MOVED is returned if the server still has leases
6858 * from this client that require migration recovery.
6859 */
nfs4_proc_get_locations(struct inode * inode,struct nfs4_fs_locations * locations,struct page * page,struct rpc_cred * cred)6860 int nfs4_proc_get_locations(struct inode *inode,
6861 struct nfs4_fs_locations *locations,
6862 struct page *page, struct rpc_cred *cred)
6863 {
6864 struct nfs_server *server = NFS_SERVER(inode);
6865 struct nfs_client *clp = server->nfs_client;
6866 const struct nfs4_mig_recovery_ops *ops =
6867 clp->cl_mvops->mig_recovery_ops;
6868 struct nfs4_exception exception = { };
6869 int status;
6870
6871 dprintk("%s: FSID %llx:%llx on \"%s\"\n", __func__,
6872 (unsigned long long)server->fsid.major,
6873 (unsigned long long)server->fsid.minor,
6874 clp->cl_hostname);
6875 nfs_display_fhandle(NFS_FH(inode), __func__);
6876
6877 do {
6878 status = ops->get_locations(inode, locations, page, cred);
6879 if (status != -NFS4ERR_DELAY)
6880 break;
6881 nfs4_handle_exception(server, status, &exception);
6882 } while (exception.retry);
6883 return status;
6884 }
6885
6886 /*
6887 * This operation also signals the server that this client is
6888 * performing "lease moved" recovery. The server can stop
6889 * returning NFS4ERR_LEASE_MOVED to this client. A RENEW operation
6890 * is appended to this compound to identify the client ID which is
6891 * performing recovery.
6892 */
_nfs40_proc_fsid_present(struct inode * inode,struct rpc_cred * cred)6893 static int _nfs40_proc_fsid_present(struct inode *inode, struct rpc_cred *cred)
6894 {
6895 struct nfs_server *server = NFS_SERVER(inode);
6896 struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
6897 struct rpc_clnt *clnt = server->client;
6898 struct nfs4_fsid_present_arg args = {
6899 .fh = NFS_FH(inode),
6900 .clientid = clp->cl_clientid,
6901 .renew = 1, /* append RENEW */
6902 };
6903 struct nfs4_fsid_present_res res = {
6904 .renew = 1,
6905 };
6906 struct rpc_message msg = {
6907 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSID_PRESENT],
6908 .rpc_argp = &args,
6909 .rpc_resp = &res,
6910 .rpc_cred = cred,
6911 };
6912 unsigned long now = jiffies;
6913 int status;
6914
6915 res.fh = nfs_alloc_fhandle();
6916 if (res.fh == NULL)
6917 return -ENOMEM;
6918
6919 nfs4_init_sequence(&args.seq_args, &res.seq_res, 0);
6920 nfs4_set_sequence_privileged(&args.seq_args);
6921 status = nfs4_call_sync_sequence(clnt, server, &msg,
6922 &args.seq_args, &res.seq_res);
6923 nfs_free_fhandle(res.fh);
6924 if (status)
6925 return status;
6926
6927 do_renew_lease(clp, now);
6928 return 0;
6929 }
6930
6931 #ifdef CONFIG_NFS_V4_1
6932
6933 /*
6934 * This operation also signals the server that this client is
6935 * performing "lease moved" recovery. The server can stop asserting
6936 * SEQ4_STATUS_LEASE_MOVED for this client. The client ID performing
6937 * this operation is identified in the SEQUENCE operation in this
6938 * compound.
6939 */
_nfs41_proc_fsid_present(struct inode * inode,struct rpc_cred * cred)6940 static int _nfs41_proc_fsid_present(struct inode *inode, struct rpc_cred *cred)
6941 {
6942 struct nfs_server *server = NFS_SERVER(inode);
6943 struct rpc_clnt *clnt = server->client;
6944 struct nfs4_fsid_present_arg args = {
6945 .fh = NFS_FH(inode),
6946 };
6947 struct nfs4_fsid_present_res res = {
6948 };
6949 struct rpc_message msg = {
6950 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FSID_PRESENT],
6951 .rpc_argp = &args,
6952 .rpc_resp = &res,
6953 .rpc_cred = cred,
6954 };
6955 int status;
6956
6957 res.fh = nfs_alloc_fhandle();
6958 if (res.fh == NULL)
6959 return -ENOMEM;
6960
6961 nfs4_init_sequence(&args.seq_args, &res.seq_res, 0);
6962 nfs4_set_sequence_privileged(&args.seq_args);
6963 status = nfs4_call_sync_sequence(clnt, server, &msg,
6964 &args.seq_args, &res.seq_res);
6965 nfs_free_fhandle(res.fh);
6966 if (status == NFS4_OK &&
6967 res.seq_res.sr_status_flags & SEQ4_STATUS_LEASE_MOVED)
6968 status = -NFS4ERR_LEASE_MOVED;
6969 return status;
6970 }
6971
6972 #endif /* CONFIG_NFS_V4_1 */
6973
6974 /**
6975 * nfs4_proc_fsid_present - Is this FSID present or absent on server?
6976 * @inode: inode on FSID to check
6977 * @cred: credential to use for this operation
6978 *
6979 * Server indicates whether the FSID is present, moved, or not
6980 * recognized. This operation is necessary to clear a LEASE_MOVED
6981 * condition for this client ID.
6982 *
6983 * Returns NFS4_OK if the FSID is present on this server,
6984 * -NFS4ERR_MOVED if the FSID is no longer present, a negative
6985 * NFS4ERR code if some error occurred on the server, or a
6986 * negative errno if a local failure occurred.
6987 */
nfs4_proc_fsid_present(struct inode * inode,struct rpc_cred * cred)6988 int nfs4_proc_fsid_present(struct inode *inode, struct rpc_cred *cred)
6989 {
6990 struct nfs_server *server = NFS_SERVER(inode);
6991 struct nfs_client *clp = server->nfs_client;
6992 const struct nfs4_mig_recovery_ops *ops =
6993 clp->cl_mvops->mig_recovery_ops;
6994 struct nfs4_exception exception = { };
6995 int status;
6996
6997 dprintk("%s: FSID %llx:%llx on \"%s\"\n", __func__,
6998 (unsigned long long)server->fsid.major,
6999 (unsigned long long)server->fsid.minor,
7000 clp->cl_hostname);
7001 nfs_display_fhandle(NFS_FH(inode), __func__);
7002
7003 do {
7004 status = ops->fsid_present(inode, cred);
7005 if (status != -NFS4ERR_DELAY)
7006 break;
7007 nfs4_handle_exception(server, status, &exception);
7008 } while (exception.retry);
7009 return status;
7010 }
7011
7012 /**
7013 * If 'use_integrity' is true and the state managment nfs_client
7014 * cl_rpcclient is using krb5i/p, use the integrity protected cl_rpcclient
7015 * and the machine credential as per RFC3530bis and RFC5661 Security
7016 * Considerations sections. Otherwise, just use the user cred with the
7017 * filesystem's rpc_client.
7018 */
_nfs4_proc_secinfo(struct inode * dir,const struct qstr * name,struct nfs4_secinfo_flavors * flavors,bool use_integrity)7019 static int _nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct nfs4_secinfo_flavors *flavors, bool use_integrity)
7020 {
7021 int status;
7022 struct nfs4_secinfo_arg args = {
7023 .dir_fh = NFS_FH(dir),
7024 .name = name,
7025 };
7026 struct nfs4_secinfo_res res = {
7027 .flavors = flavors,
7028 };
7029 struct rpc_message msg = {
7030 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SECINFO],
7031 .rpc_argp = &args,
7032 .rpc_resp = &res,
7033 };
7034 struct rpc_clnt *clnt = NFS_SERVER(dir)->client;
7035 struct rpc_cred *cred = NULL;
7036
7037 if (use_integrity) {
7038 clnt = NFS_SERVER(dir)->nfs_client->cl_rpcclient;
7039 cred = nfs4_get_clid_cred(NFS_SERVER(dir)->nfs_client);
7040 msg.rpc_cred = cred;
7041 }
7042
7043 dprintk("NFS call secinfo %s\n", name->name);
7044
7045 nfs4_state_protect(NFS_SERVER(dir)->nfs_client,
7046 NFS_SP4_MACH_CRED_SECINFO, &clnt, &msg);
7047
7048 status = nfs4_call_sync(clnt, NFS_SERVER(dir), &msg, &args.seq_args,
7049 &res.seq_res, 0);
7050 dprintk("NFS reply secinfo: %d\n", status);
7051
7052 if (cred)
7053 put_rpccred(cred);
7054
7055 return status;
7056 }
7057
nfs4_proc_secinfo(struct inode * dir,const struct qstr * name,struct nfs4_secinfo_flavors * flavors)7058 int nfs4_proc_secinfo(struct inode *dir, const struct qstr *name,
7059 struct nfs4_secinfo_flavors *flavors)
7060 {
7061 struct nfs4_exception exception = { };
7062 int err;
7063 do {
7064 err = -NFS4ERR_WRONGSEC;
7065
7066 /* try to use integrity protection with machine cred */
7067 if (_nfs4_is_integrity_protected(NFS_SERVER(dir)->nfs_client))
7068 err = _nfs4_proc_secinfo(dir, name, flavors, true);
7069
7070 /*
7071 * if unable to use integrity protection, or SECINFO with
7072 * integrity protection returns NFS4ERR_WRONGSEC (which is
7073 * disallowed by spec, but exists in deployed servers) use
7074 * the current filesystem's rpc_client and the user cred.
7075 */
7076 if (err == -NFS4ERR_WRONGSEC)
7077 err = _nfs4_proc_secinfo(dir, name, flavors, false);
7078
7079 trace_nfs4_secinfo(dir, name, err);
7080 err = nfs4_handle_exception(NFS_SERVER(dir), err,
7081 &exception);
7082 } while (exception.retry);
7083 return err;
7084 }
7085
7086 #ifdef CONFIG_NFS_V4_1
7087 /*
7088 * Check the exchange flags returned by the server for invalid flags, having
7089 * both PNFS and NON_PNFS flags set, and not having one of NON_PNFS, PNFS, or
7090 * DS flags set.
7091 */
nfs4_check_cl_exchange_flags(u32 flags)7092 static int nfs4_check_cl_exchange_flags(u32 flags)
7093 {
7094 if (flags & ~EXCHGID4_FLAG_MASK_R)
7095 goto out_inval;
7096 if ((flags & EXCHGID4_FLAG_USE_PNFS_MDS) &&
7097 (flags & EXCHGID4_FLAG_USE_NON_PNFS))
7098 goto out_inval;
7099 if (!(flags & (EXCHGID4_FLAG_MASK_PNFS)))
7100 goto out_inval;
7101 return NFS_OK;
7102 out_inval:
7103 return -NFS4ERR_INVAL;
7104 }
7105
7106 static bool
nfs41_same_server_scope(struct nfs41_server_scope * a,struct nfs41_server_scope * b)7107 nfs41_same_server_scope(struct nfs41_server_scope *a,
7108 struct nfs41_server_scope *b)
7109 {
7110 if (a->server_scope_sz == b->server_scope_sz &&
7111 memcmp(a->server_scope, b->server_scope, a->server_scope_sz) == 0)
7112 return true;
7113
7114 return false;
7115 }
7116
7117 static void
nfs4_bind_one_conn_to_session_done(struct rpc_task * task,void * calldata)7118 nfs4_bind_one_conn_to_session_done(struct rpc_task *task, void *calldata)
7119 {
7120 }
7121
7122 static const struct rpc_call_ops nfs4_bind_one_conn_to_session_ops = {
7123 .rpc_call_done = &nfs4_bind_one_conn_to_session_done,
7124 };
7125
7126 /*
7127 * nfs4_proc_bind_one_conn_to_session()
7128 *
7129 * The 4.1 client currently uses the same TCP connection for the
7130 * fore and backchannel.
7131 */
7132 static
nfs4_proc_bind_one_conn_to_session(struct rpc_clnt * clnt,struct rpc_xprt * xprt,struct nfs_client * clp,struct rpc_cred * cred)7133 int nfs4_proc_bind_one_conn_to_session(struct rpc_clnt *clnt,
7134 struct rpc_xprt *xprt,
7135 struct nfs_client *clp,
7136 struct rpc_cred *cred)
7137 {
7138 int status;
7139 struct nfs41_bind_conn_to_session_args args = {
7140 .client = clp,
7141 .dir = NFS4_CDFC4_FORE_OR_BOTH,
7142 };
7143 struct nfs41_bind_conn_to_session_res res;
7144 struct rpc_message msg = {
7145 .rpc_proc =
7146 &nfs4_procedures[NFSPROC4_CLNT_BIND_CONN_TO_SESSION],
7147 .rpc_argp = &args,
7148 .rpc_resp = &res,
7149 .rpc_cred = cred,
7150 };
7151 struct rpc_task_setup task_setup_data = {
7152 .rpc_client = clnt,
7153 .rpc_xprt = xprt,
7154 .callback_ops = &nfs4_bind_one_conn_to_session_ops,
7155 .rpc_message = &msg,
7156 .flags = RPC_TASK_TIMEOUT,
7157 };
7158 struct rpc_task *task;
7159
7160 dprintk("--> %s\n", __func__);
7161
7162 nfs4_copy_sessionid(&args.sessionid, &clp->cl_session->sess_id);
7163 if (!(clp->cl_session->flags & SESSION4_BACK_CHAN))
7164 args.dir = NFS4_CDFC4_FORE;
7165
7166 /* Do not set the backchannel flag unless this is clnt->cl_xprt */
7167 if (xprt != rcu_access_pointer(clnt->cl_xprt))
7168 args.dir = NFS4_CDFC4_FORE;
7169
7170 task = rpc_run_task(&task_setup_data);
7171 if (!IS_ERR(task)) {
7172 status = task->tk_status;
7173 rpc_put_task(task);
7174 } else
7175 status = PTR_ERR(task);
7176 trace_nfs4_bind_conn_to_session(clp, status);
7177 if (status == 0) {
7178 if (memcmp(res.sessionid.data,
7179 clp->cl_session->sess_id.data, NFS4_MAX_SESSIONID_LEN)) {
7180 dprintk("NFS: %s: Session ID mismatch\n", __func__);
7181 status = -EIO;
7182 goto out;
7183 }
7184 if ((res.dir & args.dir) != res.dir || res.dir == 0) {
7185 dprintk("NFS: %s: Unexpected direction from server\n",
7186 __func__);
7187 status = -EIO;
7188 goto out;
7189 }
7190 if (res.use_conn_in_rdma_mode != args.use_conn_in_rdma_mode) {
7191 dprintk("NFS: %s: Server returned RDMA mode = true\n",
7192 __func__);
7193 status = -EIO;
7194 goto out;
7195 }
7196 }
7197 out:
7198 dprintk("<-- %s status= %d\n", __func__, status);
7199 return status;
7200 }
7201
7202 struct rpc_bind_conn_calldata {
7203 struct nfs_client *clp;
7204 struct rpc_cred *cred;
7205 };
7206
7207 static int
nfs4_proc_bind_conn_to_session_callback(struct rpc_clnt * clnt,struct rpc_xprt * xprt,void * calldata)7208 nfs4_proc_bind_conn_to_session_callback(struct rpc_clnt *clnt,
7209 struct rpc_xprt *xprt,
7210 void *calldata)
7211 {
7212 struct rpc_bind_conn_calldata *p = calldata;
7213
7214 return nfs4_proc_bind_one_conn_to_session(clnt, xprt, p->clp, p->cred);
7215 }
7216
nfs4_proc_bind_conn_to_session(struct nfs_client * clp,struct rpc_cred * cred)7217 int nfs4_proc_bind_conn_to_session(struct nfs_client *clp, struct rpc_cred *cred)
7218 {
7219 struct rpc_bind_conn_calldata data = {
7220 .clp = clp,
7221 .cred = cred,
7222 };
7223 return rpc_clnt_iterate_for_each_xprt(clp->cl_rpcclient,
7224 nfs4_proc_bind_conn_to_session_callback, &data);
7225 }
7226
7227 /*
7228 * Minimum set of SP4_MACH_CRED operations from RFC 5661 in the enforce map
7229 * and operations we'd like to see to enable certain features in the allow map
7230 */
7231 static const struct nfs41_state_protection nfs4_sp4_mach_cred_request = {
7232 .how = SP4_MACH_CRED,
7233 .enforce.u.words = {
7234 [1] = 1 << (OP_BIND_CONN_TO_SESSION - 32) |
7235 1 << (OP_EXCHANGE_ID - 32) |
7236 1 << (OP_CREATE_SESSION - 32) |
7237 1 << (OP_DESTROY_SESSION - 32) |
7238 1 << (OP_DESTROY_CLIENTID - 32)
7239 },
7240 .allow.u.words = {
7241 [0] = 1 << (OP_CLOSE) |
7242 1 << (OP_OPEN_DOWNGRADE) |
7243 1 << (OP_LOCKU) |
7244 1 << (OP_DELEGRETURN) |
7245 1 << (OP_COMMIT),
7246 [1] = 1 << (OP_SECINFO - 32) |
7247 1 << (OP_SECINFO_NO_NAME - 32) |
7248 1 << (OP_LAYOUTRETURN - 32) |
7249 1 << (OP_TEST_STATEID - 32) |
7250 1 << (OP_FREE_STATEID - 32) |
7251 1 << (OP_WRITE - 32)
7252 }
7253 };
7254
7255 /*
7256 * Select the state protection mode for client `clp' given the server results
7257 * from exchange_id in `sp'.
7258 *
7259 * Returns 0 on success, negative errno otherwise.
7260 */
nfs4_sp4_select_mode(struct nfs_client * clp,struct nfs41_state_protection * sp)7261 static int nfs4_sp4_select_mode(struct nfs_client *clp,
7262 struct nfs41_state_protection *sp)
7263 {
7264 static const u32 supported_enforce[NFS4_OP_MAP_NUM_WORDS] = {
7265 [1] = 1 << (OP_BIND_CONN_TO_SESSION - 32) |
7266 1 << (OP_EXCHANGE_ID - 32) |
7267 1 << (OP_CREATE_SESSION - 32) |
7268 1 << (OP_DESTROY_SESSION - 32) |
7269 1 << (OP_DESTROY_CLIENTID - 32)
7270 };
7271 unsigned int i;
7272
7273 if (sp->how == SP4_MACH_CRED) {
7274 /* Print state protect result */
7275 dfprintk(MOUNT, "Server SP4_MACH_CRED support:\n");
7276 for (i = 0; i <= LAST_NFS4_OP; i++) {
7277 if (test_bit(i, sp->enforce.u.longs))
7278 dfprintk(MOUNT, " enforce op %d\n", i);
7279 if (test_bit(i, sp->allow.u.longs))
7280 dfprintk(MOUNT, " allow op %d\n", i);
7281 }
7282
7283 /* make sure nothing is on enforce list that isn't supported */
7284 for (i = 0; i < NFS4_OP_MAP_NUM_WORDS; i++) {
7285 if (sp->enforce.u.words[i] & ~supported_enforce[i]) {
7286 dfprintk(MOUNT, "sp4_mach_cred: disabled\n");
7287 return -EINVAL;
7288 }
7289 }
7290
7291 /*
7292 * Minimal mode - state operations are allowed to use machine
7293 * credential. Note this already happens by default, so the
7294 * client doesn't have to do anything more than the negotiation.
7295 *
7296 * NOTE: we don't care if EXCHANGE_ID is in the list -
7297 * we're already using the machine cred for exchange_id
7298 * and will never use a different cred.
7299 */
7300 if (test_bit(OP_BIND_CONN_TO_SESSION, sp->enforce.u.longs) &&
7301 test_bit(OP_CREATE_SESSION, sp->enforce.u.longs) &&
7302 test_bit(OP_DESTROY_SESSION, sp->enforce.u.longs) &&
7303 test_bit(OP_DESTROY_CLIENTID, sp->enforce.u.longs)) {
7304 dfprintk(MOUNT, "sp4_mach_cred:\n");
7305 dfprintk(MOUNT, " minimal mode enabled\n");
7306 set_bit(NFS_SP4_MACH_CRED_MINIMAL, &clp->cl_sp4_flags);
7307 } else {
7308 dfprintk(MOUNT, "sp4_mach_cred: disabled\n");
7309 return -EINVAL;
7310 }
7311
7312 if (test_bit(OP_CLOSE, sp->allow.u.longs) &&
7313 test_bit(OP_OPEN_DOWNGRADE, sp->allow.u.longs) &&
7314 test_bit(OP_DELEGRETURN, sp->allow.u.longs) &&
7315 test_bit(OP_LOCKU, sp->allow.u.longs)) {
7316 dfprintk(MOUNT, " cleanup mode enabled\n");
7317 set_bit(NFS_SP4_MACH_CRED_CLEANUP, &clp->cl_sp4_flags);
7318 }
7319
7320 if (test_bit(OP_LAYOUTRETURN, sp->allow.u.longs)) {
7321 dfprintk(MOUNT, " pnfs cleanup mode enabled\n");
7322 set_bit(NFS_SP4_MACH_CRED_PNFS_CLEANUP,
7323 &clp->cl_sp4_flags);
7324 }
7325
7326 if (test_bit(OP_SECINFO, sp->allow.u.longs) &&
7327 test_bit(OP_SECINFO_NO_NAME, sp->allow.u.longs)) {
7328 dfprintk(MOUNT, " secinfo mode enabled\n");
7329 set_bit(NFS_SP4_MACH_CRED_SECINFO, &clp->cl_sp4_flags);
7330 }
7331
7332 if (test_bit(OP_TEST_STATEID, sp->allow.u.longs) &&
7333 test_bit(OP_FREE_STATEID, sp->allow.u.longs)) {
7334 dfprintk(MOUNT, " stateid mode enabled\n");
7335 set_bit(NFS_SP4_MACH_CRED_STATEID, &clp->cl_sp4_flags);
7336 }
7337
7338 if (test_bit(OP_WRITE, sp->allow.u.longs)) {
7339 dfprintk(MOUNT, " write mode enabled\n");
7340 set_bit(NFS_SP4_MACH_CRED_WRITE, &clp->cl_sp4_flags);
7341 }
7342
7343 if (test_bit(OP_COMMIT, sp->allow.u.longs)) {
7344 dfprintk(MOUNT, " commit mode enabled\n");
7345 set_bit(NFS_SP4_MACH_CRED_COMMIT, &clp->cl_sp4_flags);
7346 }
7347 }
7348
7349 return 0;
7350 }
7351
7352 struct nfs41_exchange_id_data {
7353 struct nfs41_exchange_id_res res;
7354 struct nfs41_exchange_id_args args;
7355 struct rpc_xprt *xprt;
7356 int rpc_status;
7357 };
7358
nfs4_exchange_id_done(struct rpc_task * task,void * data)7359 static void nfs4_exchange_id_done(struct rpc_task *task, void *data)
7360 {
7361 struct nfs41_exchange_id_data *cdata =
7362 (struct nfs41_exchange_id_data *)data;
7363 struct nfs_client *clp = cdata->args.client;
7364 int status = task->tk_status;
7365
7366 trace_nfs4_exchange_id(clp, status);
7367
7368 if (status == 0)
7369 status = nfs4_check_cl_exchange_flags(cdata->res.flags);
7370
7371 if (cdata->xprt && status == 0) {
7372 status = nfs4_detect_session_trunking(clp, &cdata->res,
7373 cdata->xprt);
7374 goto out;
7375 }
7376
7377 if (status == 0)
7378 status = nfs4_sp4_select_mode(clp, &cdata->res.state_protect);
7379
7380 if (status == 0) {
7381 clp->cl_clientid = cdata->res.clientid;
7382 clp->cl_exchange_flags = cdata->res.flags;
7383 /* Client ID is not confirmed */
7384 if (!(cdata->res.flags & EXCHGID4_FLAG_CONFIRMED_R)) {
7385 clear_bit(NFS4_SESSION_ESTABLISHED,
7386 &clp->cl_session->session_state);
7387 clp->cl_seqid = cdata->res.seqid;
7388 }
7389
7390 kfree(clp->cl_serverowner);
7391 clp->cl_serverowner = cdata->res.server_owner;
7392 cdata->res.server_owner = NULL;
7393
7394 /* use the most recent implementation id */
7395 kfree(clp->cl_implid);
7396 clp->cl_implid = cdata->res.impl_id;
7397 cdata->res.impl_id = NULL;
7398
7399 if (clp->cl_serverscope != NULL &&
7400 !nfs41_same_server_scope(clp->cl_serverscope,
7401 cdata->res.server_scope)) {
7402 dprintk("%s: server_scope mismatch detected\n",
7403 __func__);
7404 set_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH, &clp->cl_state);
7405 kfree(clp->cl_serverscope);
7406 clp->cl_serverscope = NULL;
7407 }
7408
7409 if (clp->cl_serverscope == NULL) {
7410 clp->cl_serverscope = cdata->res.server_scope;
7411 cdata->res.server_scope = NULL;
7412 }
7413 /* Save the EXCHANGE_ID verifier session trunk tests */
7414 memcpy(clp->cl_confirm.data, cdata->args.verifier.data,
7415 sizeof(clp->cl_confirm.data));
7416 }
7417 out:
7418 cdata->rpc_status = status;
7419 return;
7420 }
7421
nfs4_exchange_id_release(void * data)7422 static void nfs4_exchange_id_release(void *data)
7423 {
7424 struct nfs41_exchange_id_data *cdata =
7425 (struct nfs41_exchange_id_data *)data;
7426
7427 if (cdata->xprt) {
7428 xprt_put(cdata->xprt);
7429 rpc_clnt_xprt_switch_put(cdata->args.client->cl_rpcclient);
7430 }
7431 nfs_put_client(cdata->args.client);
7432 kfree(cdata->res.impl_id);
7433 kfree(cdata->res.server_scope);
7434 kfree(cdata->res.server_owner);
7435 kfree(cdata);
7436 }
7437
7438 static const struct rpc_call_ops nfs4_exchange_id_call_ops = {
7439 .rpc_call_done = nfs4_exchange_id_done,
7440 .rpc_release = nfs4_exchange_id_release,
7441 };
7442
7443 /*
7444 * _nfs4_proc_exchange_id()
7445 *
7446 * Wrapper for EXCHANGE_ID operation.
7447 */
_nfs4_proc_exchange_id(struct nfs_client * clp,struct rpc_cred * cred,u32 sp4_how,struct rpc_xprt * xprt)7448 static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
7449 u32 sp4_how, struct rpc_xprt *xprt)
7450 {
7451 struct rpc_message msg = {
7452 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_EXCHANGE_ID],
7453 .rpc_cred = cred,
7454 };
7455 struct rpc_task_setup task_setup_data = {
7456 .rpc_client = clp->cl_rpcclient,
7457 .callback_ops = &nfs4_exchange_id_call_ops,
7458 .rpc_message = &msg,
7459 .flags = RPC_TASK_ASYNC | RPC_TASK_TIMEOUT,
7460 };
7461 struct nfs41_exchange_id_data *calldata;
7462 struct rpc_task *task;
7463 int status = -EIO;
7464
7465 if (!atomic_inc_not_zero(&clp->cl_count))
7466 goto out;
7467
7468 status = -ENOMEM;
7469 calldata = kzalloc(sizeof(*calldata), GFP_NOFS);
7470 if (!calldata)
7471 goto out;
7472
7473 nfs4_init_boot_verifier(clp, &calldata->args.verifier);
7474
7475 status = nfs4_init_uniform_client_string(clp);
7476 if (status)
7477 goto out_calldata;
7478
7479 dprintk("NFS call exchange_id auth=%s, '%s'\n",
7480 clp->cl_rpcclient->cl_auth->au_ops->au_name,
7481 clp->cl_owner_id);
7482
7483 calldata->res.server_owner = kzalloc(sizeof(struct nfs41_server_owner),
7484 GFP_NOFS);
7485 status = -ENOMEM;
7486 if (unlikely(calldata->res.server_owner == NULL))
7487 goto out_calldata;
7488
7489 calldata->res.server_scope = kzalloc(sizeof(struct nfs41_server_scope),
7490 GFP_NOFS);
7491 if (unlikely(calldata->res.server_scope == NULL))
7492 goto out_server_owner;
7493
7494 calldata->res.impl_id = kzalloc(sizeof(struct nfs41_impl_id), GFP_NOFS);
7495 if (unlikely(calldata->res.impl_id == NULL))
7496 goto out_server_scope;
7497
7498 switch (sp4_how) {
7499 case SP4_NONE:
7500 calldata->args.state_protect.how = SP4_NONE;
7501 break;
7502
7503 case SP4_MACH_CRED:
7504 calldata->args.state_protect = nfs4_sp4_mach_cred_request;
7505 break;
7506
7507 default:
7508 /* unsupported! */
7509 WARN_ON_ONCE(1);
7510 status = -EINVAL;
7511 goto out_impl_id;
7512 }
7513 if (xprt) {
7514 calldata->xprt = xprt;
7515 task_setup_data.rpc_xprt = xprt;
7516 task_setup_data.flags =
7517 RPC_TASK_SOFT|RPC_TASK_SOFTCONN|RPC_TASK_ASYNC;
7518 memcpy(calldata->args.verifier.data, clp->cl_confirm.data,
7519 sizeof(calldata->args.verifier.data));
7520 }
7521 calldata->args.client = clp;
7522 #ifdef CONFIG_NFS_V4_1_MIGRATION
7523 calldata->args.flags = EXCHGID4_FLAG_SUPP_MOVED_REFER |
7524 EXCHGID4_FLAG_BIND_PRINC_STATEID |
7525 EXCHGID4_FLAG_SUPP_MOVED_MIGR,
7526 #else
7527 calldata->args.flags = EXCHGID4_FLAG_SUPP_MOVED_REFER |
7528 EXCHGID4_FLAG_BIND_PRINC_STATEID,
7529 #endif
7530 msg.rpc_argp = &calldata->args;
7531 msg.rpc_resp = &calldata->res;
7532 task_setup_data.callback_data = calldata;
7533
7534 task = rpc_run_task(&task_setup_data);
7535 if (IS_ERR(task))
7536 return PTR_ERR(task);
7537
7538 if (!xprt) {
7539 status = rpc_wait_for_completion_task(task);
7540 if (!status)
7541 status = calldata->rpc_status;
7542 } else /* session trunking test */
7543 status = calldata->rpc_status;
7544
7545 rpc_put_task(task);
7546 out:
7547 if (clp->cl_implid != NULL)
7548 dprintk("NFS reply exchange_id: Server Implementation ID: "
7549 "domain: %s, name: %s, date: %llu,%u\n",
7550 clp->cl_implid->domain, clp->cl_implid->name,
7551 clp->cl_implid->date.seconds,
7552 clp->cl_implid->date.nseconds);
7553 dprintk("NFS reply exchange_id: %d\n", status);
7554 return status;
7555
7556 out_impl_id:
7557 kfree(calldata->res.impl_id);
7558 out_server_scope:
7559 kfree(calldata->res.server_scope);
7560 out_server_owner:
7561 kfree(calldata->res.server_owner);
7562 out_calldata:
7563 kfree(calldata);
7564 nfs_put_client(clp);
7565 goto out;
7566 }
7567
7568 /*
7569 * nfs4_proc_exchange_id()
7570 *
7571 * Returns zero, a negative errno, or a negative NFS4ERR status code.
7572 *
7573 * Since the clientid has expired, all compounds using sessions
7574 * associated with the stale clientid will be returning
7575 * NFS4ERR_BADSESSION in the sequence operation, and will therefore
7576 * be in some phase of session reset.
7577 *
7578 * Will attempt to negotiate SP4_MACH_CRED if krb5i / krb5p auth is used.
7579 */
nfs4_proc_exchange_id(struct nfs_client * clp,struct rpc_cred * cred)7580 int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
7581 {
7582 rpc_authflavor_t authflavor = clp->cl_rpcclient->cl_auth->au_flavor;
7583 int status;
7584
7585 /* try SP4_MACH_CRED if krb5i/p */
7586 if (authflavor == RPC_AUTH_GSS_KRB5I ||
7587 authflavor == RPC_AUTH_GSS_KRB5P) {
7588 status = _nfs4_proc_exchange_id(clp, cred, SP4_MACH_CRED, NULL);
7589 if (!status)
7590 return 0;
7591 }
7592
7593 /* try SP4_NONE */
7594 return _nfs4_proc_exchange_id(clp, cred, SP4_NONE, NULL);
7595 }
7596
7597 /**
7598 * nfs4_test_session_trunk
7599 *
7600 * This is an add_xprt_test() test function called from
7601 * rpc_clnt_setup_test_and_add_xprt.
7602 *
7603 * The rpc_xprt_switch is referrenced by rpc_clnt_setup_test_and_add_xprt
7604 * and is dereferrenced in nfs4_exchange_id_release
7605 *
7606 * Upon success, add the new transport to the rpc_clnt
7607 *
7608 * @clnt: struct rpc_clnt to get new transport
7609 * @xprt: the rpc_xprt to test
7610 * @data: call data for _nfs4_proc_exchange_id.
7611 */
nfs4_test_session_trunk(struct rpc_clnt * clnt,struct rpc_xprt * xprt,void * data)7612 int nfs4_test_session_trunk(struct rpc_clnt *clnt, struct rpc_xprt *xprt,
7613 void *data)
7614 {
7615 struct nfs4_add_xprt_data *adata = (struct nfs4_add_xprt_data *)data;
7616 u32 sp4_how;
7617
7618 dprintk("--> %s try %s\n", __func__,
7619 xprt->address_strings[RPC_DISPLAY_ADDR]);
7620
7621 sp4_how = (adata->clp->cl_sp4_flags == 0 ? SP4_NONE : SP4_MACH_CRED);
7622
7623 /* Test connection for session trunking. Async exchange_id call */
7624 return _nfs4_proc_exchange_id(adata->clp, adata->cred, sp4_how, xprt);
7625 }
7626 EXPORT_SYMBOL_GPL(nfs4_test_session_trunk);
7627
_nfs4_proc_destroy_clientid(struct nfs_client * clp,struct rpc_cred * cred)7628 static int _nfs4_proc_destroy_clientid(struct nfs_client *clp,
7629 struct rpc_cred *cred)
7630 {
7631 struct rpc_message msg = {
7632 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DESTROY_CLIENTID],
7633 .rpc_argp = clp,
7634 .rpc_cred = cred,
7635 };
7636 int status;
7637
7638 status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
7639 trace_nfs4_destroy_clientid(clp, status);
7640 if (status)
7641 dprintk("NFS: Got error %d from the server %s on "
7642 "DESTROY_CLIENTID.", status, clp->cl_hostname);
7643 return status;
7644 }
7645
nfs4_proc_destroy_clientid(struct nfs_client * clp,struct rpc_cred * cred)7646 static int nfs4_proc_destroy_clientid(struct nfs_client *clp,
7647 struct rpc_cred *cred)
7648 {
7649 unsigned int loop;
7650 int ret;
7651
7652 for (loop = NFS4_MAX_LOOP_ON_RECOVER; loop != 0; loop--) {
7653 ret = _nfs4_proc_destroy_clientid(clp, cred);
7654 switch (ret) {
7655 case -NFS4ERR_DELAY:
7656 case -NFS4ERR_CLIENTID_BUSY:
7657 ssleep(1);
7658 break;
7659 default:
7660 return ret;
7661 }
7662 }
7663 return 0;
7664 }
7665
nfs4_destroy_clientid(struct nfs_client * clp)7666 int nfs4_destroy_clientid(struct nfs_client *clp)
7667 {
7668 struct rpc_cred *cred;
7669 int ret = 0;
7670
7671 if (clp->cl_mvops->minor_version < 1)
7672 goto out;
7673 if (clp->cl_exchange_flags == 0)
7674 goto out;
7675 if (clp->cl_preserve_clid)
7676 goto out;
7677 cred = nfs4_get_clid_cred(clp);
7678 ret = nfs4_proc_destroy_clientid(clp, cred);
7679 if (cred)
7680 put_rpccred(cred);
7681 switch (ret) {
7682 case 0:
7683 case -NFS4ERR_STALE_CLIENTID:
7684 clp->cl_exchange_flags = 0;
7685 }
7686 out:
7687 return ret;
7688 }
7689
7690 struct nfs4_get_lease_time_data {
7691 struct nfs4_get_lease_time_args *args;
7692 struct nfs4_get_lease_time_res *res;
7693 struct nfs_client *clp;
7694 };
7695
nfs4_get_lease_time_prepare(struct rpc_task * task,void * calldata)7696 static void nfs4_get_lease_time_prepare(struct rpc_task *task,
7697 void *calldata)
7698 {
7699 struct nfs4_get_lease_time_data *data =
7700 (struct nfs4_get_lease_time_data *)calldata;
7701
7702 dprintk("--> %s\n", __func__);
7703 /* just setup sequence, do not trigger session recovery
7704 since we're invoked within one */
7705 nfs41_setup_sequence(data->clp->cl_session,
7706 &data->args->la_seq_args,
7707 &data->res->lr_seq_res,
7708 task);
7709 dprintk("<-- %s\n", __func__);
7710 }
7711
7712 /*
7713 * Called from nfs4_state_manager thread for session setup, so don't recover
7714 * from sequence operation or clientid errors.
7715 */
nfs4_get_lease_time_done(struct rpc_task * task,void * calldata)7716 static void nfs4_get_lease_time_done(struct rpc_task *task, void *calldata)
7717 {
7718 struct nfs4_get_lease_time_data *data =
7719 (struct nfs4_get_lease_time_data *)calldata;
7720
7721 dprintk("--> %s\n", __func__);
7722 if (!nfs41_sequence_done(task, &data->res->lr_seq_res))
7723 return;
7724 switch (task->tk_status) {
7725 case -NFS4ERR_DELAY:
7726 case -NFS4ERR_GRACE:
7727 dprintk("%s Retry: tk_status %d\n", __func__, task->tk_status);
7728 rpc_delay(task, NFS4_POLL_RETRY_MIN);
7729 task->tk_status = 0;
7730 /* fall through */
7731 case -NFS4ERR_RETRY_UNCACHED_REP:
7732 rpc_restart_call_prepare(task);
7733 return;
7734 }
7735 dprintk("<-- %s\n", __func__);
7736 }
7737
7738 static const struct rpc_call_ops nfs4_get_lease_time_ops = {
7739 .rpc_call_prepare = nfs4_get_lease_time_prepare,
7740 .rpc_call_done = nfs4_get_lease_time_done,
7741 };
7742
nfs4_proc_get_lease_time(struct nfs_client * clp,struct nfs_fsinfo * fsinfo)7743 int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo)
7744 {
7745 struct rpc_task *task;
7746 struct nfs4_get_lease_time_args args;
7747 struct nfs4_get_lease_time_res res = {
7748 .lr_fsinfo = fsinfo,
7749 };
7750 struct nfs4_get_lease_time_data data = {
7751 .args = &args,
7752 .res = &res,
7753 .clp = clp,
7754 };
7755 struct rpc_message msg = {
7756 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GET_LEASE_TIME],
7757 .rpc_argp = &args,
7758 .rpc_resp = &res,
7759 };
7760 struct rpc_task_setup task_setup = {
7761 .rpc_client = clp->cl_rpcclient,
7762 .rpc_message = &msg,
7763 .callback_ops = &nfs4_get_lease_time_ops,
7764 .callback_data = &data,
7765 .flags = RPC_TASK_TIMEOUT,
7766 };
7767 int status;
7768
7769 nfs4_init_sequence(&args.la_seq_args, &res.lr_seq_res, 0);
7770 nfs4_set_sequence_privileged(&args.la_seq_args);
7771 dprintk("--> %s\n", __func__);
7772 task = rpc_run_task(&task_setup);
7773
7774 if (IS_ERR(task))
7775 status = PTR_ERR(task);
7776 else {
7777 status = task->tk_status;
7778 rpc_put_task(task);
7779 }
7780 dprintk("<-- %s return %d\n", __func__, status);
7781
7782 return status;
7783 }
7784
7785 /*
7786 * Initialize the values to be used by the client in CREATE_SESSION
7787 * If nfs4_init_session set the fore channel request and response sizes,
7788 * use them.
7789 *
7790 * Set the back channel max_resp_sz_cached to zero to force the client to
7791 * always set csa_cachethis to FALSE because the current implementation
7792 * of the back channel DRC only supports caching the CB_SEQUENCE operation.
7793 */
nfs4_init_channel_attrs(struct nfs41_create_session_args * args,struct rpc_clnt * clnt)7794 static void nfs4_init_channel_attrs(struct nfs41_create_session_args *args,
7795 struct rpc_clnt *clnt)
7796 {
7797 unsigned int max_rqst_sz, max_resp_sz;
7798 unsigned int max_bc_payload = rpc_max_bc_payload(clnt);
7799
7800 max_rqst_sz = NFS_MAX_FILE_IO_SIZE + nfs41_maxwrite_overhead;
7801 max_resp_sz = NFS_MAX_FILE_IO_SIZE + nfs41_maxread_overhead;
7802
7803 /* Fore channel attributes */
7804 args->fc_attrs.max_rqst_sz = max_rqst_sz;
7805 args->fc_attrs.max_resp_sz = max_resp_sz;
7806 args->fc_attrs.max_ops = NFS4_MAX_OPS;
7807 args->fc_attrs.max_reqs = max_session_slots;
7808
7809 dprintk("%s: Fore Channel : max_rqst_sz=%u max_resp_sz=%u "
7810 "max_ops=%u max_reqs=%u\n",
7811 __func__,
7812 args->fc_attrs.max_rqst_sz, args->fc_attrs.max_resp_sz,
7813 args->fc_attrs.max_ops, args->fc_attrs.max_reqs);
7814
7815 /* Back channel attributes */
7816 args->bc_attrs.max_rqst_sz = max_bc_payload;
7817 args->bc_attrs.max_resp_sz = max_bc_payload;
7818 args->bc_attrs.max_resp_sz_cached = 0;
7819 args->bc_attrs.max_ops = NFS4_MAX_BACK_CHANNEL_OPS;
7820 args->bc_attrs.max_reqs = min_t(unsigned short, max_session_cb_slots, 1);
7821
7822 dprintk("%s: Back Channel : max_rqst_sz=%u max_resp_sz=%u "
7823 "max_resp_sz_cached=%u max_ops=%u max_reqs=%u\n",
7824 __func__,
7825 args->bc_attrs.max_rqst_sz, args->bc_attrs.max_resp_sz,
7826 args->bc_attrs.max_resp_sz_cached, args->bc_attrs.max_ops,
7827 args->bc_attrs.max_reqs);
7828 }
7829
nfs4_verify_fore_channel_attrs(struct nfs41_create_session_args * args,struct nfs41_create_session_res * res)7830 static int nfs4_verify_fore_channel_attrs(struct nfs41_create_session_args *args,
7831 struct nfs41_create_session_res *res)
7832 {
7833 struct nfs4_channel_attrs *sent = &args->fc_attrs;
7834 struct nfs4_channel_attrs *rcvd = &res->fc_attrs;
7835
7836 if (rcvd->max_resp_sz > sent->max_resp_sz)
7837 return -EINVAL;
7838 /*
7839 * Our requested max_ops is the minimum we need; we're not
7840 * prepared to break up compounds into smaller pieces than that.
7841 * So, no point even trying to continue if the server won't
7842 * cooperate:
7843 */
7844 if (rcvd->max_ops < sent->max_ops)
7845 return -EINVAL;
7846 if (rcvd->max_reqs == 0)
7847 return -EINVAL;
7848 if (rcvd->max_reqs > NFS4_MAX_SLOT_TABLE)
7849 rcvd->max_reqs = NFS4_MAX_SLOT_TABLE;
7850 return 0;
7851 }
7852
nfs4_verify_back_channel_attrs(struct nfs41_create_session_args * args,struct nfs41_create_session_res * res)7853 static int nfs4_verify_back_channel_attrs(struct nfs41_create_session_args *args,
7854 struct nfs41_create_session_res *res)
7855 {
7856 struct nfs4_channel_attrs *sent = &args->bc_attrs;
7857 struct nfs4_channel_attrs *rcvd = &res->bc_attrs;
7858
7859 if (!(res->flags & SESSION4_BACK_CHAN))
7860 goto out;
7861 if (rcvd->max_rqst_sz > sent->max_rqst_sz)
7862 return -EINVAL;
7863 if (rcvd->max_resp_sz < sent->max_resp_sz)
7864 return -EINVAL;
7865 if (rcvd->max_resp_sz_cached > sent->max_resp_sz_cached)
7866 return -EINVAL;
7867 if (rcvd->max_ops > sent->max_ops)
7868 return -EINVAL;
7869 if (rcvd->max_reqs > sent->max_reqs)
7870 return -EINVAL;
7871 out:
7872 return 0;
7873 }
7874
nfs4_verify_channel_attrs(struct nfs41_create_session_args * args,struct nfs41_create_session_res * res)7875 static int nfs4_verify_channel_attrs(struct nfs41_create_session_args *args,
7876 struct nfs41_create_session_res *res)
7877 {
7878 int ret;
7879
7880 ret = nfs4_verify_fore_channel_attrs(args, res);
7881 if (ret)
7882 return ret;
7883 return nfs4_verify_back_channel_attrs(args, res);
7884 }
7885
nfs4_update_session(struct nfs4_session * session,struct nfs41_create_session_res * res)7886 static void nfs4_update_session(struct nfs4_session *session,
7887 struct nfs41_create_session_res *res)
7888 {
7889 nfs4_copy_sessionid(&session->sess_id, &res->sessionid);
7890 /* Mark client id and session as being confirmed */
7891 session->clp->cl_exchange_flags |= EXCHGID4_FLAG_CONFIRMED_R;
7892 set_bit(NFS4_SESSION_ESTABLISHED, &session->session_state);
7893 session->flags = res->flags;
7894 memcpy(&session->fc_attrs, &res->fc_attrs, sizeof(session->fc_attrs));
7895 if (res->flags & SESSION4_BACK_CHAN)
7896 memcpy(&session->bc_attrs, &res->bc_attrs,
7897 sizeof(session->bc_attrs));
7898 }
7899
_nfs4_proc_create_session(struct nfs_client * clp,struct rpc_cred * cred)7900 static int _nfs4_proc_create_session(struct nfs_client *clp,
7901 struct rpc_cred *cred)
7902 {
7903 struct nfs4_session *session = clp->cl_session;
7904 struct nfs41_create_session_args args = {
7905 .client = clp,
7906 .clientid = clp->cl_clientid,
7907 .seqid = clp->cl_seqid,
7908 .cb_program = NFS4_CALLBACK,
7909 };
7910 struct nfs41_create_session_res res;
7911
7912 struct rpc_message msg = {
7913 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CREATE_SESSION],
7914 .rpc_argp = &args,
7915 .rpc_resp = &res,
7916 .rpc_cred = cred,
7917 };
7918 int status;
7919
7920 nfs4_init_channel_attrs(&args, clp->cl_rpcclient);
7921 args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN);
7922
7923 status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
7924 trace_nfs4_create_session(clp, status);
7925
7926 switch (status) {
7927 case -NFS4ERR_STALE_CLIENTID:
7928 case -NFS4ERR_DELAY:
7929 case -ETIMEDOUT:
7930 case -EACCES:
7931 case -EAGAIN:
7932 goto out;
7933 };
7934
7935 clp->cl_seqid++;
7936 if (!status) {
7937 /* Verify the session's negotiated channel_attrs values */
7938 status = nfs4_verify_channel_attrs(&args, &res);
7939 /* Increment the clientid slot sequence id */
7940 if (status)
7941 goto out;
7942 nfs4_update_session(session, &res);
7943 }
7944 out:
7945 return status;
7946 }
7947
7948 /*
7949 * Issues a CREATE_SESSION operation to the server.
7950 * It is the responsibility of the caller to verify the session is
7951 * expired before calling this routine.
7952 */
nfs4_proc_create_session(struct nfs_client * clp,struct rpc_cred * cred)7953 int nfs4_proc_create_session(struct nfs_client *clp, struct rpc_cred *cred)
7954 {
7955 int status;
7956 unsigned *ptr;
7957 struct nfs4_session *session = clp->cl_session;
7958
7959 dprintk("--> %s clp=%p session=%p\n", __func__, clp, session);
7960
7961 status = _nfs4_proc_create_session(clp, cred);
7962 if (status)
7963 goto out;
7964
7965 /* Init or reset the session slot tables */
7966 status = nfs4_setup_session_slot_tables(session);
7967 dprintk("slot table setup returned %d\n", status);
7968 if (status)
7969 goto out;
7970
7971 ptr = (unsigned *)&session->sess_id.data[0];
7972 dprintk("%s client>seqid %d sessionid %u:%u:%u:%u\n", __func__,
7973 clp->cl_seqid, ptr[0], ptr[1], ptr[2], ptr[3]);
7974 out:
7975 dprintk("<-- %s\n", __func__);
7976 return status;
7977 }
7978
7979 /*
7980 * Issue the over-the-wire RPC DESTROY_SESSION.
7981 * The caller must serialize access to this routine.
7982 */
nfs4_proc_destroy_session(struct nfs4_session * session,struct rpc_cred * cred)7983 int nfs4_proc_destroy_session(struct nfs4_session *session,
7984 struct rpc_cred *cred)
7985 {
7986 struct rpc_message msg = {
7987 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DESTROY_SESSION],
7988 .rpc_argp = session,
7989 .rpc_cred = cred,
7990 };
7991 int status = 0;
7992
7993 dprintk("--> nfs4_proc_destroy_session\n");
7994
7995 /* session is still being setup */
7996 if (!test_and_clear_bit(NFS4_SESSION_ESTABLISHED, &session->session_state))
7997 return 0;
7998
7999 status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
8000 trace_nfs4_destroy_session(session->clp, status);
8001
8002 if (status)
8003 dprintk("NFS: Got error %d from the server on DESTROY_SESSION. "
8004 "Session has been destroyed regardless...\n", status);
8005
8006 dprintk("<-- nfs4_proc_destroy_session\n");
8007 return status;
8008 }
8009
8010 /*
8011 * Renew the cl_session lease.
8012 */
8013 struct nfs4_sequence_data {
8014 struct nfs_client *clp;
8015 struct nfs4_sequence_args args;
8016 struct nfs4_sequence_res res;
8017 };
8018
nfs41_sequence_release(void * data)8019 static void nfs41_sequence_release(void *data)
8020 {
8021 struct nfs4_sequence_data *calldata = data;
8022 struct nfs_client *clp = calldata->clp;
8023
8024 if (atomic_read(&clp->cl_count) > 1)
8025 nfs4_schedule_state_renewal(clp);
8026 nfs_put_client(clp);
8027 kfree(calldata);
8028 }
8029
nfs41_sequence_handle_errors(struct rpc_task * task,struct nfs_client * clp)8030 static int nfs41_sequence_handle_errors(struct rpc_task *task, struct nfs_client *clp)
8031 {
8032 switch(task->tk_status) {
8033 case -NFS4ERR_DELAY:
8034 rpc_delay(task, NFS4_POLL_RETRY_MAX);
8035 return -EAGAIN;
8036 default:
8037 nfs4_schedule_lease_recovery(clp);
8038 }
8039 return 0;
8040 }
8041
nfs41_sequence_call_done(struct rpc_task * task,void * data)8042 static void nfs41_sequence_call_done(struct rpc_task *task, void *data)
8043 {
8044 struct nfs4_sequence_data *calldata = data;
8045 struct nfs_client *clp = calldata->clp;
8046
8047 if (!nfs41_sequence_done(task, task->tk_msg.rpc_resp))
8048 return;
8049
8050 trace_nfs4_sequence(clp, task->tk_status);
8051 if (task->tk_status < 0) {
8052 dprintk("%s ERROR %d\n", __func__, task->tk_status);
8053 if (atomic_read(&clp->cl_count) == 1)
8054 goto out;
8055
8056 if (nfs41_sequence_handle_errors(task, clp) == -EAGAIN) {
8057 rpc_restart_call_prepare(task);
8058 return;
8059 }
8060 }
8061 dprintk("%s rpc_cred %p\n", __func__, task->tk_msg.rpc_cred);
8062 out:
8063 dprintk("<-- %s\n", __func__);
8064 }
8065
nfs41_sequence_prepare(struct rpc_task * task,void * data)8066 static void nfs41_sequence_prepare(struct rpc_task *task, void *data)
8067 {
8068 struct nfs4_sequence_data *calldata = data;
8069 struct nfs_client *clp = calldata->clp;
8070 struct nfs4_sequence_args *args;
8071 struct nfs4_sequence_res *res;
8072
8073 args = task->tk_msg.rpc_argp;
8074 res = task->tk_msg.rpc_resp;
8075
8076 nfs41_setup_sequence(clp->cl_session, args, res, task);
8077 }
8078
8079 static const struct rpc_call_ops nfs41_sequence_ops = {
8080 .rpc_call_done = nfs41_sequence_call_done,
8081 .rpc_call_prepare = nfs41_sequence_prepare,
8082 .rpc_release = nfs41_sequence_release,
8083 };
8084
_nfs41_proc_sequence(struct nfs_client * clp,struct rpc_cred * cred,bool is_privileged)8085 static struct rpc_task *_nfs41_proc_sequence(struct nfs_client *clp,
8086 struct rpc_cred *cred,
8087 bool is_privileged)
8088 {
8089 struct nfs4_sequence_data *calldata;
8090 struct rpc_message msg = {
8091 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SEQUENCE],
8092 .rpc_cred = cred,
8093 };
8094 struct rpc_task_setup task_setup_data = {
8095 .rpc_client = clp->cl_rpcclient,
8096 .rpc_message = &msg,
8097 .callback_ops = &nfs41_sequence_ops,
8098 .flags = RPC_TASK_ASYNC | RPC_TASK_TIMEOUT,
8099 };
8100
8101 if (!atomic_inc_not_zero(&clp->cl_count))
8102 return ERR_PTR(-EIO);
8103 calldata = kzalloc(sizeof(*calldata), GFP_NOFS);
8104 if (calldata == NULL) {
8105 nfs_put_client(clp);
8106 return ERR_PTR(-ENOMEM);
8107 }
8108 nfs4_init_sequence(&calldata->args, &calldata->res, 0);
8109 if (is_privileged)
8110 nfs4_set_sequence_privileged(&calldata->args);
8111 msg.rpc_argp = &calldata->args;
8112 msg.rpc_resp = &calldata->res;
8113 calldata->clp = clp;
8114 task_setup_data.callback_data = calldata;
8115
8116 return rpc_run_task(&task_setup_data);
8117 }
8118
nfs41_proc_async_sequence(struct nfs_client * clp,struct rpc_cred * cred,unsigned renew_flags)8119 static int nfs41_proc_async_sequence(struct nfs_client *clp, struct rpc_cred *cred, unsigned renew_flags)
8120 {
8121 struct rpc_task *task;
8122 int ret = 0;
8123
8124 if ((renew_flags & NFS4_RENEW_TIMEOUT) == 0)
8125 return -EAGAIN;
8126 task = _nfs41_proc_sequence(clp, cred, false);
8127 if (IS_ERR(task))
8128 ret = PTR_ERR(task);
8129 else
8130 rpc_put_task_async(task);
8131 dprintk("<-- %s status=%d\n", __func__, ret);
8132 return ret;
8133 }
8134
nfs4_proc_sequence(struct nfs_client * clp,struct rpc_cred * cred)8135 static int nfs4_proc_sequence(struct nfs_client *clp, struct rpc_cred *cred)
8136 {
8137 struct rpc_task *task;
8138 int ret;
8139
8140 task = _nfs41_proc_sequence(clp, cred, true);
8141 if (IS_ERR(task)) {
8142 ret = PTR_ERR(task);
8143 goto out;
8144 }
8145 ret = rpc_wait_for_completion_task(task);
8146 if (!ret)
8147 ret = task->tk_status;
8148 rpc_put_task(task);
8149 out:
8150 dprintk("<-- %s status=%d\n", __func__, ret);
8151 return ret;
8152 }
8153
8154 struct nfs4_reclaim_complete_data {
8155 struct nfs_client *clp;
8156 struct nfs41_reclaim_complete_args arg;
8157 struct nfs41_reclaim_complete_res res;
8158 };
8159
nfs4_reclaim_complete_prepare(struct rpc_task * task,void * data)8160 static void nfs4_reclaim_complete_prepare(struct rpc_task *task, void *data)
8161 {
8162 struct nfs4_reclaim_complete_data *calldata = data;
8163
8164 nfs41_setup_sequence(calldata->clp->cl_session,
8165 &calldata->arg.seq_args,
8166 &calldata->res.seq_res,
8167 task);
8168 }
8169
nfs41_reclaim_complete_handle_errors(struct rpc_task * task,struct nfs_client * clp)8170 static int nfs41_reclaim_complete_handle_errors(struct rpc_task *task, struct nfs_client *clp)
8171 {
8172 switch(task->tk_status) {
8173 case 0:
8174 case -NFS4ERR_COMPLETE_ALREADY:
8175 case -NFS4ERR_WRONG_CRED: /* What to do here? */
8176 break;
8177 case -NFS4ERR_DELAY:
8178 rpc_delay(task, NFS4_POLL_RETRY_MAX);
8179 /* fall through */
8180 case -NFS4ERR_RETRY_UNCACHED_REP:
8181 return -EAGAIN;
8182 case -NFS4ERR_BADSESSION:
8183 case -NFS4ERR_DEADSESSION:
8184 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
8185 nfs4_schedule_session_recovery(clp->cl_session,
8186 task->tk_status);
8187 break;
8188 default:
8189 nfs4_schedule_lease_recovery(clp);
8190 }
8191 return 0;
8192 }
8193
nfs4_reclaim_complete_done(struct rpc_task * task,void * data)8194 static void nfs4_reclaim_complete_done(struct rpc_task *task, void *data)
8195 {
8196 struct nfs4_reclaim_complete_data *calldata = data;
8197 struct nfs_client *clp = calldata->clp;
8198 struct nfs4_sequence_res *res = &calldata->res.seq_res;
8199
8200 dprintk("--> %s\n", __func__);
8201 if (!nfs41_sequence_done(task, res))
8202 return;
8203
8204 trace_nfs4_reclaim_complete(clp, task->tk_status);
8205 if (nfs41_reclaim_complete_handle_errors(task, clp) == -EAGAIN) {
8206 rpc_restart_call_prepare(task);
8207 return;
8208 }
8209 dprintk("<-- %s\n", __func__);
8210 }
8211
nfs4_free_reclaim_complete_data(void * data)8212 static void nfs4_free_reclaim_complete_data(void *data)
8213 {
8214 struct nfs4_reclaim_complete_data *calldata = data;
8215
8216 kfree(calldata);
8217 }
8218
8219 static const struct rpc_call_ops nfs4_reclaim_complete_call_ops = {
8220 .rpc_call_prepare = nfs4_reclaim_complete_prepare,
8221 .rpc_call_done = nfs4_reclaim_complete_done,
8222 .rpc_release = nfs4_free_reclaim_complete_data,
8223 };
8224
8225 /*
8226 * Issue a global reclaim complete.
8227 */
nfs41_proc_reclaim_complete(struct nfs_client * clp,struct rpc_cred * cred)8228 static int nfs41_proc_reclaim_complete(struct nfs_client *clp,
8229 struct rpc_cred *cred)
8230 {
8231 struct nfs4_reclaim_complete_data *calldata;
8232 struct rpc_task *task;
8233 struct rpc_message msg = {
8234 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RECLAIM_COMPLETE],
8235 .rpc_cred = cred,
8236 };
8237 struct rpc_task_setup task_setup_data = {
8238 .rpc_client = clp->cl_rpcclient,
8239 .rpc_message = &msg,
8240 .callback_ops = &nfs4_reclaim_complete_call_ops,
8241 .flags = RPC_TASK_ASYNC,
8242 };
8243 int status = -ENOMEM;
8244
8245 dprintk("--> %s\n", __func__);
8246 calldata = kzalloc(sizeof(*calldata), GFP_NOFS);
8247 if (calldata == NULL)
8248 goto out;
8249 calldata->clp = clp;
8250 calldata->arg.one_fs = 0;
8251
8252 nfs4_init_sequence(&calldata->arg.seq_args, &calldata->res.seq_res, 0);
8253 nfs4_set_sequence_privileged(&calldata->arg.seq_args);
8254 msg.rpc_argp = &calldata->arg;
8255 msg.rpc_resp = &calldata->res;
8256 task_setup_data.callback_data = calldata;
8257 task = rpc_run_task(&task_setup_data);
8258 if (IS_ERR(task)) {
8259 status = PTR_ERR(task);
8260 goto out;
8261 }
8262 status = nfs4_wait_for_completion_rpc_task(task);
8263 if (status == 0)
8264 status = task->tk_status;
8265 rpc_put_task(task);
8266 out:
8267 dprintk("<-- %s status=%d\n", __func__, status);
8268 return status;
8269 }
8270
8271 static void
nfs4_layoutget_prepare(struct rpc_task * task,void * calldata)8272 nfs4_layoutget_prepare(struct rpc_task *task, void *calldata)
8273 {
8274 struct nfs4_layoutget *lgp = calldata;
8275 struct nfs_server *server = NFS_SERVER(lgp->args.inode);
8276 struct nfs4_session *session = nfs4_get_session(server);
8277
8278 dprintk("--> %s\n", __func__);
8279 nfs41_setup_sequence(session, &lgp->args.seq_args,
8280 &lgp->res.seq_res, task);
8281 dprintk("<-- %s\n", __func__);
8282 }
8283
nfs4_layoutget_done(struct rpc_task * task,void * calldata)8284 static void nfs4_layoutget_done(struct rpc_task *task, void *calldata)
8285 {
8286 struct nfs4_layoutget *lgp = calldata;
8287
8288 dprintk("--> %s\n", __func__);
8289 nfs41_sequence_process(task, &lgp->res.seq_res);
8290 dprintk("<-- %s\n", __func__);
8291 }
8292
8293 static int
nfs4_layoutget_handle_exception(struct rpc_task * task,struct nfs4_layoutget * lgp,struct nfs4_exception * exception)8294 nfs4_layoutget_handle_exception(struct rpc_task *task,
8295 struct nfs4_layoutget *lgp, struct nfs4_exception *exception)
8296 {
8297 struct inode *inode = lgp->args.inode;
8298 struct nfs_server *server = NFS_SERVER(inode);
8299 struct pnfs_layout_hdr *lo;
8300 int nfs4err = task->tk_status;
8301 int err, status = 0;
8302 LIST_HEAD(head);
8303
8304 dprintk("--> %s tk_status => %d\n", __func__, -task->tk_status);
8305
8306 switch (nfs4err) {
8307 case 0:
8308 goto out;
8309
8310 /*
8311 * NFS4ERR_LAYOUTUNAVAILABLE means we are not supposed to use pnfs
8312 * on the file. set tk_status to -ENODATA to tell upper layer to
8313 * retry go inband.
8314 */
8315 case -NFS4ERR_LAYOUTUNAVAILABLE:
8316 status = -ENODATA;
8317 goto out;
8318 /*
8319 * NFS4ERR_BADLAYOUT means the MDS cannot return a layout of
8320 * length lgp->args.minlength != 0 (see RFC5661 section 18.43.3).
8321 */
8322 case -NFS4ERR_BADLAYOUT:
8323 status = -EOVERFLOW;
8324 goto out;
8325 /*
8326 * NFS4ERR_LAYOUTTRYLATER is a conflict with another client
8327 * (or clients) writing to the same RAID stripe except when
8328 * the minlength argument is 0 (see RFC5661 section 18.43.3).
8329 *
8330 * Treat it like we would RECALLCONFLICT -- we retry for a little
8331 * while, and then eventually give up.
8332 */
8333 case -NFS4ERR_LAYOUTTRYLATER:
8334 if (lgp->args.minlength == 0) {
8335 status = -EOVERFLOW;
8336 goto out;
8337 }
8338 status = -EBUSY;
8339 break;
8340 case -NFS4ERR_RECALLCONFLICT:
8341 status = -ERECALLCONFLICT;
8342 break;
8343 case -NFS4ERR_DELEG_REVOKED:
8344 case -NFS4ERR_ADMIN_REVOKED:
8345 case -NFS4ERR_EXPIRED:
8346 case -NFS4ERR_BAD_STATEID:
8347 exception->timeout = 0;
8348 spin_lock(&inode->i_lock);
8349 lo = NFS_I(inode)->layout;
8350 /* If the open stateid was bad, then recover it. */
8351 if (!lo || test_bit(NFS_LAYOUT_INVALID_STID, &lo->plh_flags) ||
8352 nfs4_stateid_match_other(&lgp->args.stateid,
8353 &lgp->args.ctx->state->stateid)) {
8354 spin_unlock(&inode->i_lock);
8355 exception->state = lgp->args.ctx->state;
8356 exception->stateid = &lgp->args.stateid;
8357 break;
8358 }
8359
8360 /*
8361 * Mark the bad layout state as invalid, then retry
8362 */
8363 pnfs_mark_layout_stateid_invalid(lo, &head);
8364 spin_unlock(&inode->i_lock);
8365 pnfs_free_lseg_list(&head);
8366 status = -EAGAIN;
8367 goto out;
8368 }
8369
8370 nfs4_sequence_free_slot(&lgp->res.seq_res);
8371 err = nfs4_handle_exception(server, nfs4err, exception);
8372 if (!status) {
8373 if (exception->retry)
8374 status = -EAGAIN;
8375 else
8376 status = err;
8377 }
8378 out:
8379 dprintk("<-- %s\n", __func__);
8380 return status;
8381 }
8382
max_response_pages(struct nfs_server * server)8383 static size_t max_response_pages(struct nfs_server *server)
8384 {
8385 u32 max_resp_sz = server->nfs_client->cl_session->fc_attrs.max_resp_sz;
8386 return nfs_page_array_len(0, max_resp_sz);
8387 }
8388
nfs4_free_pages(struct page ** pages,size_t size)8389 static void nfs4_free_pages(struct page **pages, size_t size)
8390 {
8391 int i;
8392
8393 if (!pages)
8394 return;
8395
8396 for (i = 0; i < size; i++) {
8397 if (!pages[i])
8398 break;
8399 __free_page(pages[i]);
8400 }
8401 kfree(pages);
8402 }
8403
nfs4_alloc_pages(size_t size,gfp_t gfp_flags)8404 static struct page **nfs4_alloc_pages(size_t size, gfp_t gfp_flags)
8405 {
8406 struct page **pages;
8407 int i;
8408
8409 pages = kcalloc(size, sizeof(struct page *), gfp_flags);
8410 if (!pages) {
8411 dprintk("%s: can't alloc array of %zu pages\n", __func__, size);
8412 return NULL;
8413 }
8414
8415 for (i = 0; i < size; i++) {
8416 pages[i] = alloc_page(gfp_flags);
8417 if (!pages[i]) {
8418 dprintk("%s: failed to allocate page\n", __func__);
8419 nfs4_free_pages(pages, size);
8420 return NULL;
8421 }
8422 }
8423
8424 return pages;
8425 }
8426
nfs4_layoutget_release(void * calldata)8427 static void nfs4_layoutget_release(void *calldata)
8428 {
8429 struct nfs4_layoutget *lgp = calldata;
8430 struct inode *inode = lgp->args.inode;
8431 struct nfs_server *server = NFS_SERVER(inode);
8432 size_t max_pages = max_response_pages(server);
8433
8434 dprintk("--> %s\n", __func__);
8435 nfs4_sequence_free_slot(&lgp->res.seq_res);
8436 nfs4_free_pages(lgp->args.layout.pages, max_pages);
8437 pnfs_put_layout_hdr(NFS_I(inode)->layout);
8438 put_nfs_open_context(lgp->args.ctx);
8439 kfree(calldata);
8440 dprintk("<-- %s\n", __func__);
8441 }
8442
8443 static const struct rpc_call_ops nfs4_layoutget_call_ops = {
8444 .rpc_call_prepare = nfs4_layoutget_prepare,
8445 .rpc_call_done = nfs4_layoutget_done,
8446 .rpc_release = nfs4_layoutget_release,
8447 };
8448
8449 struct pnfs_layout_segment *
nfs4_proc_layoutget(struct nfs4_layoutget * lgp,long * timeout,gfp_t gfp_flags)8450 nfs4_proc_layoutget(struct nfs4_layoutget *lgp, long *timeout, gfp_t gfp_flags)
8451 {
8452 struct inode *inode = lgp->args.inode;
8453 struct nfs_server *server = NFS_SERVER(inode);
8454 size_t max_pages = max_response_pages(server);
8455 struct rpc_task *task;
8456 struct rpc_message msg = {
8457 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTGET],
8458 .rpc_argp = &lgp->args,
8459 .rpc_resp = &lgp->res,
8460 .rpc_cred = lgp->cred,
8461 };
8462 struct rpc_task_setup task_setup_data = {
8463 .rpc_client = server->client,
8464 .rpc_message = &msg,
8465 .callback_ops = &nfs4_layoutget_call_ops,
8466 .callback_data = lgp,
8467 .flags = RPC_TASK_ASYNC,
8468 };
8469 struct pnfs_layout_segment *lseg = NULL;
8470 struct nfs4_exception exception = {
8471 .inode = inode,
8472 .timeout = *timeout,
8473 };
8474 int status = 0;
8475
8476 dprintk("--> %s\n", __func__);
8477
8478 /* nfs4_layoutget_release calls pnfs_put_layout_hdr */
8479 pnfs_get_layout_hdr(NFS_I(inode)->layout);
8480
8481 lgp->args.layout.pages = nfs4_alloc_pages(max_pages, gfp_flags);
8482 if (!lgp->args.layout.pages) {
8483 nfs4_layoutget_release(lgp);
8484 return ERR_PTR(-ENOMEM);
8485 }
8486 lgp->args.layout.pglen = max_pages * PAGE_SIZE;
8487
8488 lgp->res.layoutp = &lgp->args.layout;
8489 lgp->res.seq_res.sr_slot = NULL;
8490 nfs4_init_sequence(&lgp->args.seq_args, &lgp->res.seq_res, 0);
8491
8492 task = rpc_run_task(&task_setup_data);
8493 if (IS_ERR(task))
8494 return ERR_CAST(task);
8495 status = nfs4_wait_for_completion_rpc_task(task);
8496 if (status == 0) {
8497 status = nfs4_layoutget_handle_exception(task, lgp, &exception);
8498 *timeout = exception.timeout;
8499 }
8500
8501 trace_nfs4_layoutget(lgp->args.ctx,
8502 &lgp->args.range,
8503 &lgp->res.range,
8504 &lgp->res.stateid,
8505 status);
8506
8507 /* if layoutp->len is 0, nfs4_layoutget_prepare called rpc_exit */
8508 if (status == 0 && lgp->res.layoutp->len)
8509 lseg = pnfs_layout_process(lgp);
8510 rpc_put_task(task);
8511 dprintk("<-- %s status=%d\n", __func__, status);
8512 if (status)
8513 return ERR_PTR(status);
8514 return lseg;
8515 }
8516
8517 static void
nfs4_layoutreturn_prepare(struct rpc_task * task,void * calldata)8518 nfs4_layoutreturn_prepare(struct rpc_task *task, void *calldata)
8519 {
8520 struct nfs4_layoutreturn *lrp = calldata;
8521
8522 dprintk("--> %s\n", __func__);
8523 nfs41_setup_sequence(lrp->clp->cl_session,
8524 &lrp->args.seq_args,
8525 &lrp->res.seq_res,
8526 task);
8527 }
8528
nfs4_layoutreturn_done(struct rpc_task * task,void * calldata)8529 static void nfs4_layoutreturn_done(struct rpc_task *task, void *calldata)
8530 {
8531 struct nfs4_layoutreturn *lrp = calldata;
8532 struct nfs_server *server;
8533
8534 dprintk("--> %s\n", __func__);
8535
8536 if (!nfs41_sequence_process(task, &lrp->res.seq_res))
8537 return;
8538
8539 server = NFS_SERVER(lrp->args.inode);
8540 switch (task->tk_status) {
8541 default:
8542 task->tk_status = 0;
8543 case 0:
8544 break;
8545 case -NFS4ERR_DELAY:
8546 if (nfs4_async_handle_error(task, server, NULL, NULL) != -EAGAIN)
8547 break;
8548 nfs4_sequence_free_slot(&lrp->res.seq_res);
8549 rpc_restart_call_prepare(task);
8550 return;
8551 }
8552 dprintk("<-- %s\n", __func__);
8553 }
8554
nfs4_layoutreturn_release(void * calldata)8555 static void nfs4_layoutreturn_release(void *calldata)
8556 {
8557 struct nfs4_layoutreturn *lrp = calldata;
8558 struct pnfs_layout_hdr *lo = lrp->args.layout;
8559 LIST_HEAD(freeme);
8560
8561 dprintk("--> %s\n", __func__);
8562 spin_lock(&lo->plh_inode->i_lock);
8563 if (lrp->res.lrs_present) {
8564 pnfs_mark_matching_lsegs_invalid(lo, &freeme,
8565 &lrp->args.range,
8566 be32_to_cpu(lrp->args.stateid.seqid));
8567 pnfs_set_layout_stateid(lo, &lrp->res.stateid, true);
8568 } else
8569 pnfs_mark_layout_stateid_invalid(lo, &freeme);
8570 pnfs_clear_layoutreturn_waitbit(lo);
8571 spin_unlock(&lo->plh_inode->i_lock);
8572 nfs4_sequence_free_slot(&lrp->res.seq_res);
8573 pnfs_free_lseg_list(&freeme);
8574 pnfs_put_layout_hdr(lrp->args.layout);
8575 nfs_iput_and_deactive(lrp->inode);
8576 kfree(calldata);
8577 dprintk("<-- %s\n", __func__);
8578 }
8579
8580 static const struct rpc_call_ops nfs4_layoutreturn_call_ops = {
8581 .rpc_call_prepare = nfs4_layoutreturn_prepare,
8582 .rpc_call_done = nfs4_layoutreturn_done,
8583 .rpc_release = nfs4_layoutreturn_release,
8584 };
8585
nfs4_proc_layoutreturn(struct nfs4_layoutreturn * lrp,bool sync)8586 int nfs4_proc_layoutreturn(struct nfs4_layoutreturn *lrp, bool sync)
8587 {
8588 struct rpc_task *task;
8589 struct rpc_message msg = {
8590 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTRETURN],
8591 .rpc_argp = &lrp->args,
8592 .rpc_resp = &lrp->res,
8593 .rpc_cred = lrp->cred,
8594 };
8595 struct rpc_task_setup task_setup_data = {
8596 .rpc_client = NFS_SERVER(lrp->args.inode)->client,
8597 .rpc_message = &msg,
8598 .callback_ops = &nfs4_layoutreturn_call_ops,
8599 .callback_data = lrp,
8600 };
8601 int status = 0;
8602
8603 nfs4_state_protect(NFS_SERVER(lrp->args.inode)->nfs_client,
8604 NFS_SP4_MACH_CRED_PNFS_CLEANUP,
8605 &task_setup_data.rpc_client, &msg);
8606
8607 dprintk("--> %s\n", __func__);
8608 if (!sync) {
8609 lrp->inode = nfs_igrab_and_active(lrp->args.inode);
8610 if (!lrp->inode) {
8611 nfs4_layoutreturn_release(lrp);
8612 return -EAGAIN;
8613 }
8614 task_setup_data.flags |= RPC_TASK_ASYNC;
8615 }
8616 nfs4_init_sequence(&lrp->args.seq_args, &lrp->res.seq_res, 1);
8617 task = rpc_run_task(&task_setup_data);
8618 if (IS_ERR(task))
8619 return PTR_ERR(task);
8620 if (sync)
8621 status = task->tk_status;
8622 trace_nfs4_layoutreturn(lrp->args.inode, &lrp->args.stateid, status);
8623 dprintk("<-- %s status=%d\n", __func__, status);
8624 rpc_put_task(task);
8625 return status;
8626 }
8627
8628 static int
_nfs4_proc_getdeviceinfo(struct nfs_server * server,struct pnfs_device * pdev,struct rpc_cred * cred)8629 _nfs4_proc_getdeviceinfo(struct nfs_server *server,
8630 struct pnfs_device *pdev,
8631 struct rpc_cred *cred)
8632 {
8633 struct nfs4_getdeviceinfo_args args = {
8634 .pdev = pdev,
8635 .notify_types = NOTIFY_DEVICEID4_CHANGE |
8636 NOTIFY_DEVICEID4_DELETE,
8637 };
8638 struct nfs4_getdeviceinfo_res res = {
8639 .pdev = pdev,
8640 };
8641 struct rpc_message msg = {
8642 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_GETDEVICEINFO],
8643 .rpc_argp = &args,
8644 .rpc_resp = &res,
8645 .rpc_cred = cred,
8646 };
8647 int status;
8648
8649 dprintk("--> %s\n", __func__);
8650 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
8651 if (res.notification & ~args.notify_types)
8652 dprintk("%s: unsupported notification\n", __func__);
8653 if (res.notification != args.notify_types)
8654 pdev->nocache = 1;
8655
8656 dprintk("<-- %s status=%d\n", __func__, status);
8657
8658 return status;
8659 }
8660
nfs4_proc_getdeviceinfo(struct nfs_server * server,struct pnfs_device * pdev,struct rpc_cred * cred)8661 int nfs4_proc_getdeviceinfo(struct nfs_server *server,
8662 struct pnfs_device *pdev,
8663 struct rpc_cred *cred)
8664 {
8665 struct nfs4_exception exception = { };
8666 int err;
8667
8668 do {
8669 err = nfs4_handle_exception(server,
8670 _nfs4_proc_getdeviceinfo(server, pdev, cred),
8671 &exception);
8672 } while (exception.retry);
8673 return err;
8674 }
8675 EXPORT_SYMBOL_GPL(nfs4_proc_getdeviceinfo);
8676
nfs4_layoutcommit_prepare(struct rpc_task * task,void * calldata)8677 static void nfs4_layoutcommit_prepare(struct rpc_task *task, void *calldata)
8678 {
8679 struct nfs4_layoutcommit_data *data = calldata;
8680 struct nfs_server *server = NFS_SERVER(data->args.inode);
8681 struct nfs4_session *session = nfs4_get_session(server);
8682
8683 nfs41_setup_sequence(session,
8684 &data->args.seq_args,
8685 &data->res.seq_res,
8686 task);
8687 }
8688
8689 static void
nfs4_layoutcommit_done(struct rpc_task * task,void * calldata)8690 nfs4_layoutcommit_done(struct rpc_task *task, void *calldata)
8691 {
8692 struct nfs4_layoutcommit_data *data = calldata;
8693 struct nfs_server *server = NFS_SERVER(data->args.inode);
8694
8695 if (!nfs41_sequence_done(task, &data->res.seq_res))
8696 return;
8697
8698 switch (task->tk_status) { /* Just ignore these failures */
8699 case -NFS4ERR_DELEG_REVOKED: /* layout was recalled */
8700 case -NFS4ERR_BADIOMODE: /* no IOMODE_RW layout for range */
8701 case -NFS4ERR_BADLAYOUT: /* no layout */
8702 case -NFS4ERR_GRACE: /* loca_recalim always false */
8703 task->tk_status = 0;
8704 case 0:
8705 break;
8706 default:
8707 if (nfs4_async_handle_error(task, server, NULL, NULL) == -EAGAIN) {
8708 rpc_restart_call_prepare(task);
8709 return;
8710 }
8711 }
8712 }
8713
nfs4_layoutcommit_release(void * calldata)8714 static void nfs4_layoutcommit_release(void *calldata)
8715 {
8716 struct nfs4_layoutcommit_data *data = calldata;
8717
8718 pnfs_cleanup_layoutcommit(data);
8719 nfs_post_op_update_inode_force_wcc(data->args.inode,
8720 data->res.fattr);
8721 put_rpccred(data->cred);
8722 nfs_iput_and_deactive(data->inode);
8723 kfree(data);
8724 }
8725
8726 static const struct rpc_call_ops nfs4_layoutcommit_ops = {
8727 .rpc_call_prepare = nfs4_layoutcommit_prepare,
8728 .rpc_call_done = nfs4_layoutcommit_done,
8729 .rpc_release = nfs4_layoutcommit_release,
8730 };
8731
8732 int
nfs4_proc_layoutcommit(struct nfs4_layoutcommit_data * data,bool sync)8733 nfs4_proc_layoutcommit(struct nfs4_layoutcommit_data *data, bool sync)
8734 {
8735 struct rpc_message msg = {
8736 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LAYOUTCOMMIT],
8737 .rpc_argp = &data->args,
8738 .rpc_resp = &data->res,
8739 .rpc_cred = data->cred,
8740 };
8741 struct rpc_task_setup task_setup_data = {
8742 .task = &data->task,
8743 .rpc_client = NFS_CLIENT(data->args.inode),
8744 .rpc_message = &msg,
8745 .callback_ops = &nfs4_layoutcommit_ops,
8746 .callback_data = data,
8747 };
8748 struct rpc_task *task;
8749 int status = 0;
8750
8751 dprintk("NFS: initiating layoutcommit call. sync %d "
8752 "lbw: %llu inode %lu\n", sync,
8753 data->args.lastbytewritten,
8754 data->args.inode->i_ino);
8755
8756 if (!sync) {
8757 data->inode = nfs_igrab_and_active(data->args.inode);
8758 if (data->inode == NULL) {
8759 nfs4_layoutcommit_release(data);
8760 return -EAGAIN;
8761 }
8762 task_setup_data.flags = RPC_TASK_ASYNC;
8763 }
8764 nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1);
8765 task = rpc_run_task(&task_setup_data);
8766 if (IS_ERR(task))
8767 return PTR_ERR(task);
8768 if (sync)
8769 status = task->tk_status;
8770 trace_nfs4_layoutcommit(data->args.inode, &data->args.stateid, status);
8771 dprintk("%s: status %d\n", __func__, status);
8772 rpc_put_task(task);
8773 return status;
8774 }
8775
8776 /**
8777 * Use the state managment nfs_client cl_rpcclient, which uses krb5i (if
8778 * possible) as per RFC3530bis and RFC5661 Security Considerations sections
8779 */
8780 static int
_nfs41_proc_secinfo_no_name(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsinfo * info,struct nfs4_secinfo_flavors * flavors,bool use_integrity)8781 _nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle,
8782 struct nfs_fsinfo *info,
8783 struct nfs4_secinfo_flavors *flavors, bool use_integrity)
8784 {
8785 struct nfs41_secinfo_no_name_args args = {
8786 .style = SECINFO_STYLE_CURRENT_FH,
8787 };
8788 struct nfs4_secinfo_res res = {
8789 .flavors = flavors,
8790 };
8791 struct rpc_message msg = {
8792 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SECINFO_NO_NAME],
8793 .rpc_argp = &args,
8794 .rpc_resp = &res,
8795 };
8796 struct rpc_clnt *clnt = server->client;
8797 struct rpc_cred *cred = NULL;
8798 int status;
8799
8800 if (use_integrity) {
8801 clnt = server->nfs_client->cl_rpcclient;
8802 cred = nfs4_get_clid_cred(server->nfs_client);
8803 msg.rpc_cred = cred;
8804 }
8805
8806 dprintk("--> %s\n", __func__);
8807 status = nfs4_call_sync(clnt, server, &msg, &args.seq_args,
8808 &res.seq_res, 0);
8809 dprintk("<-- %s status=%d\n", __func__, status);
8810
8811 if (cred)
8812 put_rpccred(cred);
8813
8814 return status;
8815 }
8816
8817 static int
nfs41_proc_secinfo_no_name(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsinfo * info,struct nfs4_secinfo_flavors * flavors)8818 nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle,
8819 struct nfs_fsinfo *info, struct nfs4_secinfo_flavors *flavors)
8820 {
8821 struct nfs4_exception exception = { };
8822 int err;
8823 do {
8824 /* first try using integrity protection */
8825 err = -NFS4ERR_WRONGSEC;
8826
8827 /* try to use integrity protection with machine cred */
8828 if (_nfs4_is_integrity_protected(server->nfs_client))
8829 err = _nfs41_proc_secinfo_no_name(server, fhandle, info,
8830 flavors, true);
8831
8832 /*
8833 * if unable to use integrity protection, or SECINFO with
8834 * integrity protection returns NFS4ERR_WRONGSEC (which is
8835 * disallowed by spec, but exists in deployed servers) use
8836 * the current filesystem's rpc_client and the user cred.
8837 */
8838 if (err == -NFS4ERR_WRONGSEC)
8839 err = _nfs41_proc_secinfo_no_name(server, fhandle, info,
8840 flavors, false);
8841
8842 switch (err) {
8843 case 0:
8844 case -NFS4ERR_WRONGSEC:
8845 case -ENOTSUPP:
8846 goto out;
8847 default:
8848 err = nfs4_handle_exception(server, err, &exception);
8849 }
8850 } while (exception.retry);
8851 out:
8852 return err;
8853 }
8854
8855 static int
nfs41_find_root_sec(struct nfs_server * server,struct nfs_fh * fhandle,struct nfs_fsinfo * info)8856 nfs41_find_root_sec(struct nfs_server *server, struct nfs_fh *fhandle,
8857 struct nfs_fsinfo *info)
8858 {
8859 int err;
8860 struct page *page;
8861 rpc_authflavor_t flavor = RPC_AUTH_MAXFLAVOR;
8862 struct nfs4_secinfo_flavors *flavors;
8863 struct nfs4_secinfo4 *secinfo;
8864 int i;
8865
8866 page = alloc_page(GFP_KERNEL);
8867 if (!page) {
8868 err = -ENOMEM;
8869 goto out;
8870 }
8871
8872 flavors = page_address(page);
8873 err = nfs41_proc_secinfo_no_name(server, fhandle, info, flavors);
8874
8875 /*
8876 * Fall back on "guess and check" method if
8877 * the server doesn't support SECINFO_NO_NAME
8878 */
8879 if (err == -NFS4ERR_WRONGSEC || err == -ENOTSUPP) {
8880 err = nfs4_find_root_sec(server, fhandle, info);
8881 goto out_freepage;
8882 }
8883 if (err)
8884 goto out_freepage;
8885
8886 for (i = 0; i < flavors->num_flavors; i++) {
8887 secinfo = &flavors->flavors[i];
8888
8889 switch (secinfo->flavor) {
8890 case RPC_AUTH_NULL:
8891 case RPC_AUTH_UNIX:
8892 case RPC_AUTH_GSS:
8893 flavor = rpcauth_get_pseudoflavor(secinfo->flavor,
8894 &secinfo->flavor_info);
8895 break;
8896 default:
8897 flavor = RPC_AUTH_MAXFLAVOR;
8898 break;
8899 }
8900
8901 if (!nfs_auth_info_match(&server->auth_info, flavor))
8902 flavor = RPC_AUTH_MAXFLAVOR;
8903
8904 if (flavor != RPC_AUTH_MAXFLAVOR) {
8905 err = nfs4_lookup_root_sec(server, fhandle,
8906 info, flavor);
8907 if (!err)
8908 break;
8909 }
8910 }
8911
8912 if (flavor == RPC_AUTH_MAXFLAVOR)
8913 err = -EPERM;
8914
8915 out_freepage:
8916 put_page(page);
8917 if (err == -EACCES)
8918 return -EPERM;
8919 out:
8920 return err;
8921 }
8922
_nfs41_test_stateid(struct nfs_server * server,nfs4_stateid * stateid,struct rpc_cred * cred)8923 static int _nfs41_test_stateid(struct nfs_server *server,
8924 nfs4_stateid *stateid,
8925 struct rpc_cred *cred)
8926 {
8927 int status;
8928 struct nfs41_test_stateid_args args = {
8929 .stateid = stateid,
8930 };
8931 struct nfs41_test_stateid_res res;
8932 struct rpc_message msg = {
8933 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_TEST_STATEID],
8934 .rpc_argp = &args,
8935 .rpc_resp = &res,
8936 .rpc_cred = cred,
8937 };
8938 struct rpc_clnt *rpc_client = server->client;
8939
8940 nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_STATEID,
8941 &rpc_client, &msg);
8942
8943 dprintk("NFS call test_stateid %p\n", stateid);
8944 nfs4_init_sequence(&args.seq_args, &res.seq_res, 0);
8945 nfs4_set_sequence_privileged(&args.seq_args);
8946 status = nfs4_call_sync_sequence(rpc_client, server, &msg,
8947 &args.seq_args, &res.seq_res);
8948 if (status != NFS_OK) {
8949 dprintk("NFS reply test_stateid: failed, %d\n", status);
8950 return status;
8951 }
8952 dprintk("NFS reply test_stateid: succeeded, %d\n", -res.status);
8953 return -res.status;
8954 }
8955
nfs4_handle_delay_or_session_error(struct nfs_server * server,int err,struct nfs4_exception * exception)8956 static void nfs4_handle_delay_or_session_error(struct nfs_server *server,
8957 int err, struct nfs4_exception *exception)
8958 {
8959 exception->retry = 0;
8960 switch(err) {
8961 case -NFS4ERR_DELAY:
8962 case -NFS4ERR_RETRY_UNCACHED_REP:
8963 nfs4_handle_exception(server, err, exception);
8964 break;
8965 case -NFS4ERR_BADSESSION:
8966 case -NFS4ERR_BADSLOT:
8967 case -NFS4ERR_BAD_HIGH_SLOT:
8968 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
8969 case -NFS4ERR_DEADSESSION:
8970 nfs4_do_handle_exception(server, err, exception);
8971 }
8972 }
8973
8974 /**
8975 * nfs41_test_stateid - perform a TEST_STATEID operation
8976 *
8977 * @server: server / transport on which to perform the operation
8978 * @stateid: state ID to test
8979 * @cred: credential
8980 *
8981 * Returns NFS_OK if the server recognizes that "stateid" is valid.
8982 * Otherwise a negative NFS4ERR value is returned if the operation
8983 * failed or the state ID is not currently valid.
8984 */
nfs41_test_stateid(struct nfs_server * server,nfs4_stateid * stateid,struct rpc_cred * cred)8985 static int nfs41_test_stateid(struct nfs_server *server,
8986 nfs4_stateid *stateid,
8987 struct rpc_cred *cred)
8988 {
8989 struct nfs4_exception exception = { };
8990 int err;
8991 do {
8992 err = _nfs41_test_stateid(server, stateid, cred);
8993 nfs4_handle_delay_or_session_error(server, err, &exception);
8994 } while (exception.retry);
8995 return err;
8996 }
8997
8998 struct nfs_free_stateid_data {
8999 struct nfs_server *server;
9000 struct nfs41_free_stateid_args args;
9001 struct nfs41_free_stateid_res res;
9002 };
9003
nfs41_free_stateid_prepare(struct rpc_task * task,void * calldata)9004 static void nfs41_free_stateid_prepare(struct rpc_task *task, void *calldata)
9005 {
9006 struct nfs_free_stateid_data *data = calldata;
9007 nfs41_setup_sequence(nfs4_get_session(data->server),
9008 &data->args.seq_args,
9009 &data->res.seq_res,
9010 task);
9011 }
9012
nfs41_free_stateid_done(struct rpc_task * task,void * calldata)9013 static void nfs41_free_stateid_done(struct rpc_task *task, void *calldata)
9014 {
9015 struct nfs_free_stateid_data *data = calldata;
9016
9017 nfs41_sequence_done(task, &data->res.seq_res);
9018
9019 switch (task->tk_status) {
9020 case -NFS4ERR_DELAY:
9021 if (nfs4_async_handle_error(task, data->server, NULL, NULL) == -EAGAIN)
9022 rpc_restart_call_prepare(task);
9023 }
9024 }
9025
nfs41_free_stateid_release(void * calldata)9026 static void nfs41_free_stateid_release(void *calldata)
9027 {
9028 kfree(calldata);
9029 }
9030
9031 static const struct rpc_call_ops nfs41_free_stateid_ops = {
9032 .rpc_call_prepare = nfs41_free_stateid_prepare,
9033 .rpc_call_done = nfs41_free_stateid_done,
9034 .rpc_release = nfs41_free_stateid_release,
9035 };
9036
_nfs41_free_stateid(struct nfs_server * server,const nfs4_stateid * stateid,struct rpc_cred * cred,bool privileged)9037 static struct rpc_task *_nfs41_free_stateid(struct nfs_server *server,
9038 const nfs4_stateid *stateid,
9039 struct rpc_cred *cred,
9040 bool privileged)
9041 {
9042 struct rpc_message msg = {
9043 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_FREE_STATEID],
9044 .rpc_cred = cred,
9045 };
9046 struct rpc_task_setup task_setup = {
9047 .rpc_client = server->client,
9048 .rpc_message = &msg,
9049 .callback_ops = &nfs41_free_stateid_ops,
9050 .flags = RPC_TASK_ASYNC,
9051 };
9052 struct nfs_free_stateid_data *data;
9053
9054 nfs4_state_protect(server->nfs_client, NFS_SP4_MACH_CRED_STATEID,
9055 &task_setup.rpc_client, &msg);
9056
9057 dprintk("NFS call free_stateid %p\n", stateid);
9058 data = kmalloc(sizeof(*data), GFP_NOFS);
9059 if (!data)
9060 return ERR_PTR(-ENOMEM);
9061 data->server = server;
9062 nfs4_stateid_copy(&data->args.stateid, stateid);
9063
9064 task_setup.callback_data = data;
9065
9066 msg.rpc_argp = &data->args;
9067 msg.rpc_resp = &data->res;
9068 nfs4_init_sequence(&data->args.seq_args, &data->res.seq_res, 1);
9069 if (privileged)
9070 nfs4_set_sequence_privileged(&data->args.seq_args);
9071
9072 return rpc_run_task(&task_setup);
9073 }
9074
9075 /**
9076 * nfs41_free_stateid - perform a FREE_STATEID operation
9077 *
9078 * @server: server / transport on which to perform the operation
9079 * @stateid: state ID to release
9080 * @cred: credential
9081 * @is_recovery: set to true if this call needs to be privileged
9082 *
9083 * Note: this function is always asynchronous.
9084 */
nfs41_free_stateid(struct nfs_server * server,const nfs4_stateid * stateid,struct rpc_cred * cred,bool is_recovery)9085 static int nfs41_free_stateid(struct nfs_server *server,
9086 const nfs4_stateid *stateid,
9087 struct rpc_cred *cred,
9088 bool is_recovery)
9089 {
9090 struct rpc_task *task;
9091
9092 task = _nfs41_free_stateid(server, stateid, cred, is_recovery);
9093 if (IS_ERR(task))
9094 return PTR_ERR(task);
9095 rpc_put_task(task);
9096 return 0;
9097 }
9098
9099 static void
nfs41_free_lock_state(struct nfs_server * server,struct nfs4_lock_state * lsp)9100 nfs41_free_lock_state(struct nfs_server *server, struct nfs4_lock_state *lsp)
9101 {
9102 struct rpc_cred *cred = lsp->ls_state->owner->so_cred;
9103
9104 nfs41_free_stateid(server, &lsp->ls_stateid, cred, false);
9105 nfs4_free_lock_state(server, lsp);
9106 }
9107
nfs41_match_stateid(const nfs4_stateid * s1,const nfs4_stateid * s2)9108 static bool nfs41_match_stateid(const nfs4_stateid *s1,
9109 const nfs4_stateid *s2)
9110 {
9111 if (s1->type != s2->type)
9112 return false;
9113
9114 if (memcmp(s1->other, s2->other, sizeof(s1->other)) != 0)
9115 return false;
9116
9117 if (s1->seqid == s2->seqid)
9118 return true;
9119 if (s1->seqid == 0 || s2->seqid == 0)
9120 return true;
9121
9122 return false;
9123 }
9124
9125 #endif /* CONFIG_NFS_V4_1 */
9126
nfs4_match_stateid(const nfs4_stateid * s1,const nfs4_stateid * s2)9127 static bool nfs4_match_stateid(const nfs4_stateid *s1,
9128 const nfs4_stateid *s2)
9129 {
9130 return nfs4_stateid_match(s1, s2);
9131 }
9132
9133
9134 static const struct nfs4_state_recovery_ops nfs40_reboot_recovery_ops = {
9135 .owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT,
9136 .state_flag_bit = NFS_STATE_RECLAIM_REBOOT,
9137 .recover_open = nfs4_open_reclaim,
9138 .recover_lock = nfs4_lock_reclaim,
9139 .establish_clid = nfs4_init_clientid,
9140 .detect_trunking = nfs40_discover_server_trunking,
9141 };
9142
9143 #if defined(CONFIG_NFS_V4_1)
9144 static const struct nfs4_state_recovery_ops nfs41_reboot_recovery_ops = {
9145 .owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT,
9146 .state_flag_bit = NFS_STATE_RECLAIM_REBOOT,
9147 .recover_open = nfs4_open_reclaim,
9148 .recover_lock = nfs4_lock_reclaim,
9149 .establish_clid = nfs41_init_clientid,
9150 .reclaim_complete = nfs41_proc_reclaim_complete,
9151 .detect_trunking = nfs41_discover_server_trunking,
9152 };
9153 #endif /* CONFIG_NFS_V4_1 */
9154
9155 static const struct nfs4_state_recovery_ops nfs40_nograce_recovery_ops = {
9156 .owner_flag_bit = NFS_OWNER_RECLAIM_NOGRACE,
9157 .state_flag_bit = NFS_STATE_RECLAIM_NOGRACE,
9158 .recover_open = nfs40_open_expired,
9159 .recover_lock = nfs4_lock_expired,
9160 .establish_clid = nfs4_init_clientid,
9161 };
9162
9163 #if defined(CONFIG_NFS_V4_1)
9164 static const struct nfs4_state_recovery_ops nfs41_nograce_recovery_ops = {
9165 .owner_flag_bit = NFS_OWNER_RECLAIM_NOGRACE,
9166 .state_flag_bit = NFS_STATE_RECLAIM_NOGRACE,
9167 .recover_open = nfs41_open_expired,
9168 .recover_lock = nfs41_lock_expired,
9169 .establish_clid = nfs41_init_clientid,
9170 };
9171 #endif /* CONFIG_NFS_V4_1 */
9172
9173 static const struct nfs4_state_maintenance_ops nfs40_state_renewal_ops = {
9174 .sched_state_renewal = nfs4_proc_async_renew,
9175 .get_state_renewal_cred_locked = nfs4_get_renew_cred_locked,
9176 .renew_lease = nfs4_proc_renew,
9177 };
9178
9179 #if defined(CONFIG_NFS_V4_1)
9180 static const struct nfs4_state_maintenance_ops nfs41_state_renewal_ops = {
9181 .sched_state_renewal = nfs41_proc_async_sequence,
9182 .get_state_renewal_cred_locked = nfs4_get_machine_cred_locked,
9183 .renew_lease = nfs4_proc_sequence,
9184 };
9185 #endif
9186
9187 static const struct nfs4_mig_recovery_ops nfs40_mig_recovery_ops = {
9188 .get_locations = _nfs40_proc_get_locations,
9189 .fsid_present = _nfs40_proc_fsid_present,
9190 };
9191
9192 #if defined(CONFIG_NFS_V4_1)
9193 static const struct nfs4_mig_recovery_ops nfs41_mig_recovery_ops = {
9194 .get_locations = _nfs41_proc_get_locations,
9195 .fsid_present = _nfs41_proc_fsid_present,
9196 };
9197 #endif /* CONFIG_NFS_V4_1 */
9198
9199 static const struct nfs4_minor_version_ops nfs_v4_0_minor_ops = {
9200 .minor_version = 0,
9201 .init_caps = NFS_CAP_READDIRPLUS
9202 | NFS_CAP_ATOMIC_OPEN
9203 | NFS_CAP_POSIX_LOCK,
9204 .init_client = nfs40_init_client,
9205 .shutdown_client = nfs40_shutdown_client,
9206 .match_stateid = nfs4_match_stateid,
9207 .find_root_sec = nfs4_find_root_sec,
9208 .free_lock_state = nfs4_release_lockowner,
9209 .test_and_free_expired = nfs40_test_and_free_expired_stateid,
9210 .alloc_seqid = nfs_alloc_seqid,
9211 .call_sync_ops = &nfs40_call_sync_ops,
9212 .reboot_recovery_ops = &nfs40_reboot_recovery_ops,
9213 .nograce_recovery_ops = &nfs40_nograce_recovery_ops,
9214 .state_renewal_ops = &nfs40_state_renewal_ops,
9215 .mig_recovery_ops = &nfs40_mig_recovery_ops,
9216 };
9217
9218 #if defined(CONFIG_NFS_V4_1)
9219 static struct nfs_seqid *
nfs_alloc_no_seqid(struct nfs_seqid_counter * arg1,gfp_t arg2)9220 nfs_alloc_no_seqid(struct nfs_seqid_counter *arg1, gfp_t arg2)
9221 {
9222 return NULL;
9223 }
9224
9225 static const struct nfs4_minor_version_ops nfs_v4_1_minor_ops = {
9226 .minor_version = 1,
9227 .init_caps = NFS_CAP_READDIRPLUS
9228 | NFS_CAP_ATOMIC_OPEN
9229 | NFS_CAP_POSIX_LOCK
9230 | NFS_CAP_STATEID_NFSV41
9231 | NFS_CAP_ATOMIC_OPEN_V1,
9232 .init_client = nfs41_init_client,
9233 .shutdown_client = nfs41_shutdown_client,
9234 .match_stateid = nfs41_match_stateid,
9235 .find_root_sec = nfs41_find_root_sec,
9236 .free_lock_state = nfs41_free_lock_state,
9237 .test_and_free_expired = nfs41_test_and_free_expired_stateid,
9238 .alloc_seqid = nfs_alloc_no_seqid,
9239 .session_trunk = nfs4_test_session_trunk,
9240 .call_sync_ops = &nfs41_call_sync_ops,
9241 .reboot_recovery_ops = &nfs41_reboot_recovery_ops,
9242 .nograce_recovery_ops = &nfs41_nograce_recovery_ops,
9243 .state_renewal_ops = &nfs41_state_renewal_ops,
9244 .mig_recovery_ops = &nfs41_mig_recovery_ops,
9245 };
9246 #endif
9247
9248 #if defined(CONFIG_NFS_V4_2)
9249 static const struct nfs4_minor_version_ops nfs_v4_2_minor_ops = {
9250 .minor_version = 2,
9251 .init_caps = NFS_CAP_READDIRPLUS
9252 | NFS_CAP_ATOMIC_OPEN
9253 | NFS_CAP_POSIX_LOCK
9254 | NFS_CAP_STATEID_NFSV41
9255 | NFS_CAP_ATOMIC_OPEN_V1
9256 | NFS_CAP_ALLOCATE
9257 | NFS_CAP_COPY
9258 | NFS_CAP_DEALLOCATE
9259 | NFS_CAP_SEEK
9260 | NFS_CAP_LAYOUTSTATS
9261 | NFS_CAP_CLONE,
9262 .init_client = nfs41_init_client,
9263 .shutdown_client = nfs41_shutdown_client,
9264 .match_stateid = nfs41_match_stateid,
9265 .find_root_sec = nfs41_find_root_sec,
9266 .free_lock_state = nfs41_free_lock_state,
9267 .call_sync_ops = &nfs41_call_sync_ops,
9268 .test_and_free_expired = nfs41_test_and_free_expired_stateid,
9269 .alloc_seqid = nfs_alloc_no_seqid,
9270 .session_trunk = nfs4_test_session_trunk,
9271 .reboot_recovery_ops = &nfs41_reboot_recovery_ops,
9272 .nograce_recovery_ops = &nfs41_nograce_recovery_ops,
9273 .state_renewal_ops = &nfs41_state_renewal_ops,
9274 .mig_recovery_ops = &nfs41_mig_recovery_ops,
9275 };
9276 #endif
9277
9278 const struct nfs4_minor_version_ops *nfs_v4_minor_ops[] = {
9279 [0] = &nfs_v4_0_minor_ops,
9280 #if defined(CONFIG_NFS_V4_1)
9281 [1] = &nfs_v4_1_minor_ops,
9282 #endif
9283 #if defined(CONFIG_NFS_V4_2)
9284 [2] = &nfs_v4_2_minor_ops,
9285 #endif
9286 };
9287
nfs4_listxattr(struct dentry * dentry,char * list,size_t size)9288 static ssize_t nfs4_listxattr(struct dentry *dentry, char *list, size_t size)
9289 {
9290 ssize_t error, error2;
9291
9292 error = generic_listxattr(dentry, list, size);
9293 if (error < 0)
9294 return error;
9295 if (list) {
9296 list += error;
9297 size -= error;
9298 }
9299
9300 error2 = nfs4_listxattr_nfs4_label(d_inode(dentry), list, size);
9301 if (error2 < 0)
9302 return error2;
9303 return error + error2;
9304 }
9305
9306 static const struct inode_operations nfs4_dir_inode_operations = {
9307 .create = nfs_create,
9308 .lookup = nfs_lookup,
9309 .atomic_open = nfs_atomic_open,
9310 .link = nfs_link,
9311 .unlink = nfs_unlink,
9312 .symlink = nfs_symlink,
9313 .mkdir = nfs_mkdir,
9314 .rmdir = nfs_rmdir,
9315 .mknod = nfs_mknod,
9316 .rename = nfs_rename,
9317 .permission = nfs_permission,
9318 .getattr = nfs_getattr,
9319 .setattr = nfs_setattr,
9320 .listxattr = nfs4_listxattr,
9321 };
9322
9323 static const struct inode_operations nfs4_file_inode_operations = {
9324 .permission = nfs_permission,
9325 .getattr = nfs_getattr,
9326 .setattr = nfs_setattr,
9327 .listxattr = nfs4_listxattr,
9328 };
9329
9330 const struct nfs_rpc_ops nfs_v4_clientops = {
9331 .version = 4, /* protocol version */
9332 .dentry_ops = &nfs4_dentry_operations,
9333 .dir_inode_ops = &nfs4_dir_inode_operations,
9334 .file_inode_ops = &nfs4_file_inode_operations,
9335 .file_ops = &nfs4_file_operations,
9336 .getroot = nfs4_proc_get_root,
9337 .submount = nfs4_submount,
9338 .try_mount = nfs4_try_mount,
9339 .getattr = nfs4_proc_getattr,
9340 .setattr = nfs4_proc_setattr,
9341 .lookup = nfs4_proc_lookup,
9342 .access = nfs4_proc_access,
9343 .readlink = nfs4_proc_readlink,
9344 .create = nfs4_proc_create,
9345 .remove = nfs4_proc_remove,
9346 .unlink_setup = nfs4_proc_unlink_setup,
9347 .unlink_rpc_prepare = nfs4_proc_unlink_rpc_prepare,
9348 .unlink_done = nfs4_proc_unlink_done,
9349 .rename_setup = nfs4_proc_rename_setup,
9350 .rename_rpc_prepare = nfs4_proc_rename_rpc_prepare,
9351 .rename_done = nfs4_proc_rename_done,
9352 .link = nfs4_proc_link,
9353 .symlink = nfs4_proc_symlink,
9354 .mkdir = nfs4_proc_mkdir,
9355 .rmdir = nfs4_proc_remove,
9356 .readdir = nfs4_proc_readdir,
9357 .mknod = nfs4_proc_mknod,
9358 .statfs = nfs4_proc_statfs,
9359 .fsinfo = nfs4_proc_fsinfo,
9360 .pathconf = nfs4_proc_pathconf,
9361 .set_capabilities = nfs4_server_capabilities,
9362 .decode_dirent = nfs4_decode_dirent,
9363 .pgio_rpc_prepare = nfs4_proc_pgio_rpc_prepare,
9364 .read_setup = nfs4_proc_read_setup,
9365 .read_done = nfs4_read_done,
9366 .write_setup = nfs4_proc_write_setup,
9367 .write_done = nfs4_write_done,
9368 .commit_setup = nfs4_proc_commit_setup,
9369 .commit_rpc_prepare = nfs4_proc_commit_rpc_prepare,
9370 .commit_done = nfs4_commit_done,
9371 .lock = nfs4_proc_lock,
9372 .clear_acl_cache = nfs4_zap_acl_attr,
9373 .close_context = nfs4_close_context,
9374 .open_context = nfs4_atomic_open,
9375 .have_delegation = nfs4_have_delegation,
9376 .return_delegation = nfs4_inode_return_delegation,
9377 .alloc_client = nfs4_alloc_client,
9378 .init_client = nfs4_init_client,
9379 .free_client = nfs4_free_client,
9380 .create_server = nfs4_create_server,
9381 .clone_server = nfs_clone_server,
9382 };
9383
9384 static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = {
9385 .name = XATTR_NAME_NFSV4_ACL,
9386 .list = nfs4_xattr_list_nfs4_acl,
9387 .get = nfs4_xattr_get_nfs4_acl,
9388 .set = nfs4_xattr_set_nfs4_acl,
9389 };
9390
9391 const struct xattr_handler *nfs4_xattr_handlers[] = {
9392 &nfs4_xattr_nfs4_acl_handler,
9393 #ifdef CONFIG_NFS_V4_SECURITY_LABEL
9394 &nfs4_xattr_nfs4_label_handler,
9395 #endif
9396 NULL
9397 };
9398
9399 /*
9400 * Local variables:
9401 * c-basic-offset: 8
9402 * End:
9403 */
9404