forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 95099d4622f8cb224d94e314c7a8e0df60b13f87
kernel/fs/nfs/nfs4proc.c
....@@ -63,11 +63,17 @@
6363 #include "callback.h"
6464 #include "pnfs.h"
6565 #include "netns.h"
66
+#include "sysfs.h"
6667 #include "nfs4idmap.h"
6768 #include "nfs4session.h"
6869 #include "fscache.h"
70
+#include "nfs42.h"
6971
7072 #include "nfs4trace.h"
73
+
74
+#ifdef CONFIG_NFS_V4_2
75
+#include "nfs42.h"
76
+#endif /* CONFIG_NFS_V4_2 */
7177
7278 #define NFSDBG_FACILITY NFSDBG_PROC
7379
....@@ -91,22 +97,25 @@
9197 static int _nfs4_recover_proc_open(struct nfs4_opendata *data);
9298 static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *);
9399 static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr);
94
-static int nfs4_proc_getattr(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *, struct nfs4_label *label, struct inode *inode);
95100 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr, struct nfs4_label *label, struct inode *inode);
96
-static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
101
+static int nfs4_do_setattr(struct inode *inode, const struct cred *cred,
97102 struct nfs_fattr *fattr, struct iattr *sattr,
98103 struct nfs_open_context *ctx, struct nfs4_label *ilabel,
99104 struct nfs4_label *olabel);
100105 #ifdef CONFIG_NFS_V4_1
101106 static struct rpc_task *_nfs41_proc_sequence(struct nfs_client *clp,
102
- struct rpc_cred *cred,
107
+ const struct cred *cred,
103108 struct nfs4_slot *slot,
104109 bool is_privileged);
105110 static int nfs41_test_stateid(struct nfs_server *, nfs4_stateid *,
106
- struct rpc_cred *);
111
+ const struct cred *);
107112 static int nfs41_free_stateid(struct nfs_server *, const nfs4_stateid *,
108
- struct rpc_cred *, bool);
113
+ const struct cred *, bool);
109114 #endif
115
+static void nfs4_bitmask_set(__u32 bitmask[NFS4_BITMASK_SZ],
116
+ const __u32 *src, struct inode *inode,
117
+ struct nfs_server *server,
118
+ struct nfs4_label *label);
110119
111120 #ifdef CONFIG_NFS_V4_SECURITY_LABEL
112121 static inline struct nfs4_label *
....@@ -257,6 +266,7 @@
257266 | FATTR4_WORD1_FS_LAYOUT_TYPES,
258267 FATTR4_WORD2_LAYOUT_BLKSIZE
259268 | FATTR4_WORD2_CLONE_BLKSIZE
269
+ | FATTR4_WORD2_XATTR_SUPPORT
260270 };
261271
262272 const u32 nfs4_fs_locations_bitmap[3] = {
....@@ -359,9 +369,17 @@
359369 kunmap_atomic(start);
360370 }
361371
372
+static void nfs4_fattr_set_prechange(struct nfs_fattr *fattr, u64 version)
373
+{
374
+ if (!(fattr->valid & NFS_ATTR_FATTR_PRECHANGE)) {
375
+ fattr->pre_change_attr = version;
376
+ fattr->valid |= NFS_ATTR_FATTR_PRECHANGE;
377
+ }
378
+}
379
+
362380 static void nfs4_test_and_free_stateid(struct nfs_server *server,
363381 nfs4_stateid *stateid,
364
- struct rpc_cred *cred)
382
+ const struct cred *cred)
365383 {
366384 const struct nfs4_minor_version_ops *ops = server->nfs_client->cl_mvops;
367385
....@@ -370,7 +388,7 @@
370388
371389 static void __nfs4_free_revoked_stateid(struct nfs_server *server,
372390 nfs4_stateid *stateid,
373
- struct rpc_cred *cred)
391
+ const struct cred *cred)
374392 {
375393 stateid->type = NFS4_REVOKED_STATEID_TYPE;
376394 nfs4_test_and_free_stateid(server, stateid, cred);
....@@ -378,7 +396,7 @@
378396
379397 static void nfs4_free_revoked_stateid(struct nfs_server *server,
380398 const nfs4_stateid *stateid,
381
- struct rpc_cred *cred)
399
+ const struct cred *cred)
382400 {
383401 nfs4_stateid tmp;
384402
....@@ -400,17 +418,48 @@
400418 return ret;
401419 }
402420
403
-static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
421
+static int nfs4_delay_killable(long *timeout)
404422 {
405
- int res = 0;
406
-
407423 might_sleep();
408424
409425 freezable_schedule_timeout_killable_unsafe(
410426 nfs4_update_delay(timeout));
411
- if (fatal_signal_pending(current))
412
- res = -ERESTARTSYS;
413
- return res;
427
+ if (!__fatal_signal_pending(current))
428
+ return 0;
429
+ return -EINTR;
430
+}
431
+
432
+static int nfs4_delay_interruptible(long *timeout)
433
+{
434
+ might_sleep();
435
+
436
+ freezable_schedule_timeout_interruptible_unsafe(nfs4_update_delay(timeout));
437
+ if (!signal_pending(current))
438
+ return 0;
439
+ return __fatal_signal_pending(current) ? -EINTR :-ERESTARTSYS;
440
+}
441
+
442
+static int nfs4_delay(long *timeout, bool interruptible)
443
+{
444
+ if (interruptible)
445
+ return nfs4_delay_interruptible(timeout);
446
+ return nfs4_delay_killable(timeout);
447
+}
448
+
449
+static const nfs4_stateid *
450
+nfs4_recoverable_stateid(const nfs4_stateid *stateid)
451
+{
452
+ if (!stateid)
453
+ return NULL;
454
+ switch (stateid->type) {
455
+ case NFS4_OPEN_STATEID_TYPE:
456
+ case NFS4_LOCK_STATEID_TYPE:
457
+ case NFS4_DELEGATION_STATEID_TYPE:
458
+ return stateid;
459
+ default:
460
+ break;
461
+ }
462
+ return NULL;
414463 }
415464
416465 /* This is the error handling routine for processes that are allowed
....@@ -421,7 +470,7 @@
421470 {
422471 struct nfs_client *clp = server->nfs_client;
423472 struct nfs4_state *state = exception->state;
424
- const nfs4_stateid *stateid = exception->stateid;
473
+ const nfs4_stateid *stateid;
425474 struct inode *inode = exception->inode;
426475 int ret = errorcode;
427476
....@@ -429,8 +478,9 @@
429478 exception->recovering = 0;
430479 exception->retry = 0;
431480
481
+ stateid = nfs4_recoverable_stateid(exception->stateid);
432482 if (stateid == NULL && state != NULL)
433
- stateid = &state->stateid;
483
+ stateid = nfs4_recoverable_stateid(&state->stateid);
434484
435485 switch(errorcode) {
436486 case 0:
....@@ -444,12 +494,13 @@
444494 case -NFS4ERR_ADMIN_REVOKED:
445495 case -NFS4ERR_EXPIRED:
446496 case -NFS4ERR_BAD_STATEID:
497
+ case -NFS4ERR_PARTNER_NO_AUTH:
447498 if (inode != NULL && stateid != NULL) {
448499 nfs_inode_find_state_and_recover(inode,
449500 stateid);
450501 goto wait_on_recovery;
451502 }
452
- /* Fall through */
503
+ fallthrough;
453504 case -NFS4ERR_OPENMODE:
454505 if (inode) {
455506 int err;
....@@ -489,9 +540,7 @@
489540 case -NFS4ERR_DEADSESSION:
490541 case -NFS4ERR_SEQ_FALSE_RETRY:
491542 case -NFS4ERR_SEQ_MISORDERED:
492
- dprintk("%s ERROR: %d Reset session\n", __func__,
493
- errorcode);
494
- nfs4_schedule_session_recovery(clp->cl_session, errorcode);
543
+ /* Handled in nfs41_sequence_process() */
495544 goto wait_on_recovery;
496545 #endif /* defined(CONFIG_NFS_V4_1) */
497546 case -NFS4ERR_FILE_OPEN:
....@@ -502,10 +551,10 @@
502551 ret = -EBUSY;
503552 break;
504553 }
505
- /* Fall through */
554
+ fallthrough;
506555 case -NFS4ERR_DELAY:
507556 nfs_inc_server_stats(server, NFSIOS_DELAY);
508
- /* Fall through */
557
+ fallthrough;
509558 case -NFS4ERR_GRACE:
510559 case -NFS4ERR_LAYOUTTRYLATER:
511560 case -NFS4ERR_RECALLCONFLICT:
....@@ -546,7 +595,8 @@
546595
547596 ret = nfs4_do_handle_exception(server, errorcode, exception);
548597 if (exception->delay) {
549
- ret = nfs4_delay(server->client, &exception->timeout);
598
+ ret = nfs4_delay(&exception->timeout,
599
+ exception->interruptible);
550600 goto out_retry;
551601 }
552602 if (exception->recovering) {
....@@ -734,36 +784,57 @@
734784 res->sr_slot = NULL;
735785 }
736786
787
+static void nfs4_slot_sequence_record_sent(struct nfs4_slot *slot,
788
+ u32 seqnr)
789
+{
790
+ if ((s32)(seqnr - slot->seq_nr_highest_sent) > 0)
791
+ slot->seq_nr_highest_sent = seqnr;
792
+}
793
+static void nfs4_slot_sequence_acked(struct nfs4_slot *slot, u32 seqnr)
794
+{
795
+ nfs4_slot_sequence_record_sent(slot, seqnr);
796
+ slot->seq_nr_last_acked = seqnr;
797
+}
798
+
799
+static void nfs4_probe_sequence(struct nfs_client *client, const struct cred *cred,
800
+ struct nfs4_slot *slot)
801
+{
802
+ struct rpc_task *task = _nfs41_proc_sequence(client, cred, slot, true);
803
+ if (!IS_ERR(task))
804
+ rpc_put_task_async(task);
805
+}
806
+
737807 static int nfs41_sequence_process(struct rpc_task *task,
738808 struct nfs4_sequence_res *res)
739809 {
740810 struct nfs4_session *session;
741811 struct nfs4_slot *slot = res->sr_slot;
742812 struct nfs_client *clp;
743
- bool interrupted = false;
813
+ int status;
744814 int ret = 1;
745815
746816 if (slot == NULL)
747817 goto out_noaction;
748818 /* don't increment the sequence number if the task wasn't sent */
749
- if (!RPC_WAS_SENT(task))
819
+ if (!RPC_WAS_SENT(task) || slot->seq_done)
750820 goto out;
751821
752822 session = slot->table->session;
753
-
754
- if (slot->interrupted) {
755
- if (res->sr_status != -NFS4ERR_DELAY)
756
- slot->interrupted = 0;
757
- interrupted = true;
758
- }
823
+ clp = session->clp;
759824
760825 trace_nfs4_sequence_done(session, res);
826
+
827
+ status = res->sr_status;
828
+ if (task->tk_status == -NFS4ERR_DEADSESSION)
829
+ status = -NFS4ERR_DEADSESSION;
830
+
761831 /* Check the SEQUENCE operation status */
762
- switch (res->sr_status) {
832
+ switch (status) {
763833 case 0:
834
+ /* Mark this sequence number as having been acked */
835
+ nfs4_slot_sequence_acked(slot, slot->seq_nr);
764836 /* Update the slot's sequence and clientid lease timer */
765837 slot->seq_done = 1;
766
- clp = session->clp;
767838 do_renew_lease(clp, res->sr_timestamp);
768839 /* Check sequence flags */
769840 nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags,
....@@ -775,9 +846,9 @@
775846 * sr_status remains 1 if an RPC level error occurred.
776847 * The server may or may not have processed the sequence
777848 * operation..
778
- * Mark the slot as having hosted an interrupted RPC call.
779849 */
780
- slot->interrupted = 1;
850
+ nfs4_slot_sequence_record_sent(slot, slot->seq_nr);
851
+ slot->seq_done = 1;
781852 goto out;
782853 case -NFS4ERR_DELAY:
783854 /* The server detected a resend of the RPC call and
....@@ -795,6 +866,7 @@
795866 * The server thinks we tried to replay a request.
796867 * Retry the call after bumping the sequence ID.
797868 */
869
+ nfs4_slot_sequence_acked(slot, slot->seq_nr);
798870 goto retry_new_seq;
799871 case -NFS4ERR_BADSLOT:
800872 /*
....@@ -805,20 +877,39 @@
805877 goto session_recover;
806878 goto retry_nowait;
807879 case -NFS4ERR_SEQ_MISORDERED:
880
+ nfs4_slot_sequence_record_sent(slot, slot->seq_nr);
808881 /*
809
- * Was the last operation on this sequence interrupted?
810
- * If so, retry after bumping the sequence number.
882
+ * Were one or more calls using this slot interrupted?
883
+ * If the server never received the request, then our
884
+ * transmitted slot sequence number may be too high. However,
885
+ * if the server did receive the request then it might
886
+ * accidentally give us a reply with a mismatched operation.
887
+ * We can sort this out by sending a lone sequence operation
888
+ * to the server on the same slot.
811889 */
812
- if (interrupted)
813
- goto retry_new_seq;
814
- /*
815
- * Could this slot have been previously retired?
816
- * If so, then the server may be expecting seq_nr = 1!
817
- */
818
- if (slot->seq_nr != 1) {
819
- slot->seq_nr = 1;
890
+ if ((s32)(slot->seq_nr - slot->seq_nr_last_acked) > 1) {
891
+ slot->seq_nr--;
892
+ if (task->tk_msg.rpc_proc != &nfs4_procedures[NFSPROC4_CLNT_SEQUENCE]) {
893
+ nfs4_probe_sequence(clp, task->tk_msg.rpc_cred, slot);
894
+ res->sr_slot = NULL;
895
+ }
820896 goto retry_nowait;
821897 }
898
+ /*
899
+ * RFC5661:
900
+ * A retry might be sent while the original request is
901
+ * still in progress on the replier. The replier SHOULD
902
+ * deal with the issue by returning NFS4ERR_DELAY as the
903
+ * reply to SEQUENCE or CB_SEQUENCE operation, but
904
+ * implementations MAY return NFS4ERR_SEQ_MISORDERED.
905
+ *
906
+ * Restart the search after a delay.
907
+ */
908
+ slot->seq_nr = slot->seq_nr_highest_sent;
909
+ goto out_retry;
910
+ case -NFS4ERR_BADSESSION:
911
+ case -NFS4ERR_DEADSESSION:
912
+ case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
822913 goto session_recover;
823914 default:
824915 /* Just update the slot sequence no. */
....@@ -830,8 +921,10 @@
830921 out_noaction:
831922 return ret;
832923 session_recover:
833
- nfs4_schedule_session_recovery(session, res->sr_status);
834
- goto retry_nowait;
924
+ nfs4_schedule_session_recovery(session, status);
925
+ dprintk("%s ERROR: %d Reset session\n", __func__, status);
926
+ nfs41_sequence_free_slot(res);
927
+ goto out;
835928 retry_new_seq:
836929 ++slot->seq_nr;
837930 retry_nowait:
....@@ -910,17 +1003,6 @@
9101003 .rpc_call_done = nfs41_call_sync_done,
9111004 };
9121005
913
-static void
914
-nfs4_sequence_process_interrupted(struct nfs_client *client,
915
- struct nfs4_slot *slot, struct rpc_cred *cred)
916
-{
917
- struct rpc_task *task;
918
-
919
- task = _nfs41_proc_sequence(client, cred, slot, true);
920
- if (!IS_ERR(task))
921
- rpc_put_task_async(task);
922
-}
923
-
9241006 #else /* !CONFIG_NFS_V4_1 */
9251007
9261008 static int nfs4_sequence_process(struct rpc_task *task, struct nfs4_sequence_res *res)
....@@ -940,14 +1022,6 @@
9401022 return nfs40_sequence_done(task, res);
9411023 }
9421024 EXPORT_SYMBOL_GPL(nfs4_sequence_done);
943
-
944
-static void
945
-nfs4_sequence_process_interrupted(struct nfs_client *client,
946
- struct nfs4_slot *slot, struct rpc_cred *cred)
947
-{
948
- WARN_ON_ONCE(1);
949
- slot->interrupted = 0;
950
-}
9511025
9521026 #endif /* !CONFIG_NFS_V4_1 */
9531027
....@@ -984,31 +1058,21 @@
9841058 if (res->sr_slot != NULL)
9851059 goto out_start;
9861060
987
- if (session) {
1061
+ if (session)
9881062 tbl = &session->fc_slot_table;
989
- task->tk_timeout = 0;
1063
+
1064
+ spin_lock(&tbl->slot_tbl_lock);
1065
+ /* The state manager will wait until the slot table is empty */
1066
+ if (nfs4_slot_tbl_draining(tbl) && !args->sa_privileged)
1067
+ goto out_sleep;
1068
+
1069
+ slot = nfs4_alloc_slot(tbl);
1070
+ if (IS_ERR(slot)) {
1071
+ if (slot == ERR_PTR(-ENOMEM))
1072
+ goto out_sleep_timeout;
1073
+ goto out_sleep;
9901074 }
991
-
992
- for (;;) {
993
- spin_lock(&tbl->slot_tbl_lock);
994
- /* The state manager will wait until the slot table is empty */
995
- if (nfs4_slot_tbl_draining(tbl) && !args->sa_privileged)
996
- goto out_sleep;
997
-
998
- slot = nfs4_alloc_slot(tbl);
999
- if (IS_ERR(slot)) {
1000
- /* Try again in 1/4 second */
1001
- if (slot == ERR_PTR(-ENOMEM))
1002
- task->tk_timeout = HZ >> 2;
1003
- goto out_sleep;
1004
- }
1005
- spin_unlock(&tbl->slot_tbl_lock);
1006
-
1007
- if (likely(!slot->interrupted))
1008
- break;
1009
- nfs4_sequence_process_interrupted(client,
1010
- slot, task->tk_msg.rpc_cred);
1011
- }
1075
+ spin_unlock(&tbl->slot_tbl_lock);
10121076
10131077 nfs4_sequence_attach_slot(args, res, slot);
10141078
....@@ -1017,11 +1081,20 @@
10171081 nfs41_sequence_res_init(res);
10181082 rpc_call_start(task);
10191083 return 0;
1020
-
1084
+out_sleep_timeout:
1085
+ /* Try again in 1/4 second */
1086
+ if (args->sa_privileged)
1087
+ rpc_sleep_on_priority_timeout(&tbl->slot_tbl_waitq, task,
1088
+ jiffies + (HZ >> 2), RPC_PRIORITY_PRIVILEGED);
1089
+ else
1090
+ rpc_sleep_on_timeout(&tbl->slot_tbl_waitq, task,
1091
+ NULL, jiffies + (HZ >> 2));
1092
+ spin_unlock(&tbl->slot_tbl_lock);
1093
+ return -EAGAIN;
10211094 out_sleep:
10221095 if (args->sa_privileged)
10231096 rpc_sleep_on_priority(&tbl->slot_tbl_waitq, task,
1024
- NULL, RPC_PRIORITY_PRIVILEGED);
1097
+ RPC_PRIORITY_PRIVILEGED);
10251098 else
10261099 rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL);
10271100 spin_unlock(&tbl->slot_tbl_lock);
....@@ -1047,14 +1120,27 @@
10471120 .rpc_call_done = nfs40_call_sync_done,
10481121 };
10491122
1050
-static int nfs4_call_sync_sequence(struct rpc_clnt *clnt,
1051
- struct nfs_server *server,
1052
- struct rpc_message *msg,
1053
- struct nfs4_sequence_args *args,
1054
- struct nfs4_sequence_res *res)
1123
+static int nfs4_call_sync_custom(struct rpc_task_setup *task_setup)
10551124 {
10561125 int ret;
10571126 struct rpc_task *task;
1127
+
1128
+ task = rpc_run_task(task_setup);
1129
+ if (IS_ERR(task))
1130
+ return PTR_ERR(task);
1131
+
1132
+ ret = task->tk_status;
1133
+ rpc_put_task(task);
1134
+ return ret;
1135
+}
1136
+
1137
+static int nfs4_do_call_sync(struct rpc_clnt *clnt,
1138
+ struct nfs_server *server,
1139
+ struct rpc_message *msg,
1140
+ struct nfs4_sequence_args *args,
1141
+ struct nfs4_sequence_res *res,
1142
+ unsigned short task_flags)
1143
+{
10581144 struct nfs_client *clp = server->nfs_client;
10591145 struct nfs4_call_sync_data data = {
10601146 .seq_server = server,
....@@ -1065,18 +1151,22 @@
10651151 .rpc_client = clnt,
10661152 .rpc_message = msg,
10671153 .callback_ops = clp->cl_mvops->call_sync_ops,
1068
- .callback_data = &data
1154
+ .callback_data = &data,
1155
+ .flags = task_flags,
10691156 };
10701157
1071
- task = rpc_run_task(&task_setup);
1072
- if (IS_ERR(task))
1073
- ret = PTR_ERR(task);
1074
- else {
1075
- ret = task->tk_status;
1076
- rpc_put_task(task);
1077
- }
1078
- return ret;
1158
+ return nfs4_call_sync_custom(&task_setup);
10791159 }
1160
+
1161
+static int nfs4_call_sync_sequence(struct rpc_clnt *clnt,
1162
+ struct nfs_server *server,
1163
+ struct rpc_message *msg,
1164
+ struct nfs4_sequence_args *args,
1165
+ struct nfs4_sequence_res *res)
1166
+{
1167
+ return nfs4_do_call_sync(clnt, server, msg, args, res, 0);
1168
+}
1169
+
10801170
10811171 int nfs4_call_sync(struct rpc_clnt *clnt,
10821172 struct nfs_server *server,
....@@ -1104,37 +1194,49 @@
11041194 }
11051195
11061196 static void
1107
-update_changeattr_locked(struct inode *dir, struct nfs4_change_info *cinfo,
1197
+nfs4_update_changeattr_locked(struct inode *inode,
1198
+ struct nfs4_change_info *cinfo,
11081199 unsigned long timestamp, unsigned long cache_validity)
11091200 {
1110
- struct nfs_inode *nfsi = NFS_I(dir);
1201
+ struct nfs_inode *nfsi = NFS_I(inode);
11111202
11121203 nfsi->cache_validity |= NFS_INO_INVALID_CTIME
11131204 | NFS_INO_INVALID_MTIME
1114
- | NFS_INO_INVALID_DATA
11151205 | cache_validity;
1116
- if (cinfo->atomic && cinfo->before == inode_peek_iversion_raw(dir)) {
1206
+
1207
+ if (cinfo->atomic && cinfo->before == inode_peek_iversion_raw(inode)) {
11171208 nfsi->cache_validity &= ~NFS_INO_REVAL_PAGECACHE;
11181209 nfsi->attrtimeo_timestamp = jiffies;
11191210 } else {
1120
- nfs_force_lookup_revalidate(dir);
1121
- if (cinfo->before != inode_peek_iversion_raw(dir))
1211
+ if (S_ISDIR(inode->i_mode)) {
1212
+ nfsi->cache_validity |= NFS_INO_INVALID_DATA;
1213
+ nfs_force_lookup_revalidate(inode);
1214
+ } else {
1215
+ if (!NFS_PROTO(inode)->have_delegation(inode,
1216
+ FMODE_READ))
1217
+ nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE;
1218
+ }
1219
+
1220
+ if (cinfo->before != inode_peek_iversion_raw(inode))
11221221 nfsi->cache_validity |= NFS_INO_INVALID_ACCESS |
1123
- NFS_INO_INVALID_ACL;
1222
+ NFS_INO_INVALID_ACL |
1223
+ NFS_INO_INVALID_XATTR;
11241224 }
1125
- inode_set_iversion_raw(dir, cinfo->after);
1225
+ inode_set_iversion_raw(inode, cinfo->after);
11261226 nfsi->read_cache_jiffies = timestamp;
11271227 nfsi->attr_gencount = nfs_inc_attr_generation_counter();
11281228 nfsi->cache_validity &= ~NFS_INO_INVALID_CHANGE;
1129
- nfs_fscache_invalidate(dir);
1229
+
1230
+ if (nfsi->cache_validity & NFS_INO_INVALID_DATA)
1231
+ nfs_fscache_invalidate(inode);
11301232 }
11311233
1132
-static void
1133
-update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo,
1234
+void
1235
+nfs4_update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo,
11341236 unsigned long timestamp, unsigned long cache_validity)
11351237 {
11361238 spin_lock(&dir->i_lock);
1137
- update_changeattr_locked(dir, cinfo, timestamp, cache_validity);
1239
+ nfs4_update_changeattr_locked(dir, cinfo, timestamp, cache_validity);
11381240 spin_unlock(&dir->i_lock);
11391241 }
11401242
....@@ -1154,6 +1256,18 @@
11541256 server->caps &= ~NFS_CAP_ATOMIC_OPEN_V1;
11551257 exception->retry = 1;
11561258 return true;
1259
+}
1260
+
1261
+static fmode_t _nfs4_ctx_to_accessmode(const struct nfs_open_context *ctx)
1262
+{
1263
+ return ctx->mode & (FMODE_READ|FMODE_WRITE|FMODE_EXEC);
1264
+}
1265
+
1266
+static fmode_t _nfs4_ctx_to_openmode(const struct nfs_open_context *ctx)
1267
+{
1268
+ fmode_t ret = ctx->mode & (FMODE_READ|FMODE_WRITE);
1269
+
1270
+ return (ctx->mode & FMODE_EXEC) ? FMODE_READ | ret : ret;
11571271 }
11581272
11591273 static u32
....@@ -1275,6 +1389,12 @@
12751389 NFS4_ACCESS_MODIFY |
12761390 NFS4_ACCESS_EXTEND |
12771391 NFS4_ACCESS_EXECUTE;
1392
+#ifdef CONFIG_NFS_V4_2
1393
+ if (server->caps & NFS_CAP_XATTR)
1394
+ p->o_arg.access |= NFS4_ACCESS_XAREAD |
1395
+ NFS4_ACCESS_XAWRITE |
1396
+ NFS4_ACCESS_XALIST;
1397
+#endif
12781398 }
12791399 }
12801400 p->o_arg.clientid = server->nfs_client->cl_clientid;
....@@ -1404,7 +1524,7 @@
14041524 case NFS4_OPEN_CLAIM_PREVIOUS:
14051525 if (!test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags))
14061526 break;
1407
- /* Fall through */
1527
+ fallthrough;
14081528 default:
14091529 return 0;
14101530 }
....@@ -1446,19 +1566,6 @@
14461566 wake_up_all(&state->waitq);
14471567 }
14481568
1449
-static void nfs_state_log_out_of_order_open_stateid(struct nfs4_state *state,
1450
- const nfs4_stateid *stateid)
1451
-{
1452
- u32 state_seqid = be32_to_cpu(state->open_stateid.seqid);
1453
- u32 stateid_seqid = be32_to_cpu(stateid->seqid);
1454
-
1455
- if (stateid_seqid == state_seqid + 1U ||
1456
- (stateid_seqid == 1U && state_seqid == 0xffffffffU))
1457
- nfs_state_log_update_open_stateid(state);
1458
- else
1459
- set_bit(NFS_STATE_CHANGE_WAIT, &state->flags);
1460
-}
1461
-
14621569 static void nfs_test_and_clear_all_open_stateid(struct nfs4_state *state)
14631570 {
14641571 struct nfs_client *clp = state->owner->so_server->nfs_client;
....@@ -1484,22 +1591,21 @@
14841591 * i.e. The stateid seqids have to be initialised to 1, and
14851592 * are then incremented on every state transition.
14861593 */
1487
-static bool nfs_need_update_open_stateid(struct nfs4_state *state,
1594
+static bool nfs_stateid_is_sequential(struct nfs4_state *state,
14881595 const nfs4_stateid *stateid)
14891596 {
1490
- if (test_bit(NFS_OPEN_STATE, &state->flags) == 0 ||
1491
- !nfs4_stateid_match_other(stateid, &state->open_stateid)) {
1492
- if (stateid->seqid == cpu_to_be32(1))
1493
- nfs_state_log_update_open_stateid(state);
1494
- else
1495
- set_bit(NFS_STATE_CHANGE_WAIT, &state->flags);
1496
- return true;
1597
+ if (test_bit(NFS_OPEN_STATE, &state->flags)) {
1598
+ /* The common case - we're updating to a new sequence number */
1599
+ if (nfs4_stateid_match_other(stateid, &state->open_stateid)) {
1600
+ if (nfs4_stateid_is_next(&state->open_stateid, stateid))
1601
+ return true;
1602
+ return false;
1603
+ }
1604
+ /* The server returned a new stateid */
14971605 }
1498
-
1499
- if (nfs4_stateid_is_newer(stateid, &state->open_stateid)) {
1500
- nfs_state_log_out_of_order_open_stateid(state, stateid);
1606
+ /* This is the first OPEN in this generation */
1607
+ if (stateid->seqid == cpu_to_be32(1))
15011608 return true;
1502
- }
15031609 return false;
15041610 }
15051611
....@@ -1563,21 +1669,25 @@
15631669
15641670 static void nfs_set_open_stateid_locked(struct nfs4_state *state,
15651671 const nfs4_stateid *stateid, nfs4_stateid *freeme)
1672
+ __must_hold(&state->owner->so_lock)
1673
+ __must_hold(&state->seqlock)
1674
+ __must_hold(RCU)
1675
+
15661676 {
15671677 DEFINE_WAIT(wait);
15681678 int status = 0;
15691679 for (;;) {
15701680
1571
- if (!nfs_need_update_open_stateid(state, stateid))
1572
- return;
1573
- if (!test_bit(NFS_STATE_CHANGE_WAIT, &state->flags))
1681
+ if (nfs_stateid_is_sequential(state, stateid))
15741682 break;
1683
+
15751684 if (status)
15761685 break;
15771686 /* Rely on seqids for serialisation with NFSv4.0 */
15781687 if (!nfs4_has_session(NFS_SERVER(state->inode)->nfs_client))
15791688 break;
15801689
1690
+ set_bit(NFS_STATE_CHANGE_WAIT, &state->flags);
15811691 prepare_to_wait(&state->waitq, &wait, TASK_KILLABLE);
15821692 /*
15831693 * Ensure we process the state changes in the same order
....@@ -1588,7 +1698,8 @@
15881698 spin_unlock(&state->owner->so_lock);
15891699 rcu_read_unlock();
15901700 trace_nfs4_open_stateid_update_wait(state->inode, stateid, 0);
1591
- if (!signal_pending(current)) {
1701
+
1702
+ if (!fatal_signal_pending(current)) {
15921703 if (schedule_timeout(5*HZ) == 0)
15931704 status = -EAGAIN;
15941705 else
....@@ -1639,6 +1750,14 @@
16391750 write_sequnlock(&state->seqlock);
16401751 }
16411752
1753
+static void nfs_state_clear_open_state_flags(struct nfs4_state *state)
1754
+{
1755
+ clear_bit(NFS_O_RDWR_STATE, &state->flags);
1756
+ clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1757
+ clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1758
+ clear_bit(NFS_OPEN_STATE, &state->flags);
1759
+}
1760
+
16421761 static void nfs_state_set_delegation(struct nfs4_state *state,
16431762 const nfs4_stateid *deleg_stateid,
16441763 fmode_t fmode)
....@@ -1661,7 +1780,7 @@
16611780 write_sequnlock(&state->seqlock);
16621781 }
16631782
1664
-static int update_open_stateid(struct nfs4_state *state,
1783
+int update_open_stateid(struct nfs4_state *state,
16651784 const nfs4_stateid *open_stateid,
16661785 const nfs4_stateid *delegation,
16671786 fmode_t fmode)
....@@ -1682,7 +1801,7 @@
16821801 ret = 1;
16831802 }
16841803
1685
- deleg_cur = rcu_dereference(nfsi->delegation);
1804
+ deleg_cur = nfs4_get_valid_delegation(state->inode);
16861805 if (deleg_cur == NULL)
16871806 goto no_delegation;
16881807
....@@ -1694,7 +1813,7 @@
16941813
16951814 if (delegation == NULL)
16961815 delegation = &deleg_cur->stateid;
1697
- else if (!nfs4_stateid_match(&deleg_cur->stateid, delegation))
1816
+ else if (!nfs4_stateid_match_other(&deleg_cur->stateid, delegation))
16981817 goto no_delegation_unlock;
16991818
17001819 nfs_mark_delegation_referenced(deleg_cur);
....@@ -1741,7 +1860,7 @@
17411860
17421861 fmode &= FMODE_READ|FMODE_WRITE;
17431862 rcu_read_lock();
1744
- delegation = rcu_dereference(NFS_I(inode)->delegation);
1863
+ delegation = nfs4_get_valid_delegation(inode);
17451864 if (delegation == NULL || (delegation->type & fmode) == fmode) {
17461865 rcu_read_unlock();
17471866 return;
....@@ -1792,7 +1911,7 @@
17921911 out:
17931912 return ERR_PTR(ret);
17941913 out_return_state:
1795
- atomic_inc(&state->count);
1914
+ refcount_inc(&state->count);
17961915 return state;
17971916 }
17981917
....@@ -1862,9 +1981,10 @@
18621981 if (data->o_res.delegation_type != 0)
18631982 nfs4_opendata_check_deleg(data, state);
18641983 update:
1865
- update_open_stateid(state, &data->o_res.stateid, NULL,
1866
- data->o_arg.fmode);
1867
- atomic_inc(&state->count);
1984
+ if (!update_open_stateid(state, &data->o_res.stateid,
1985
+ NULL, data->o_arg.fmode))
1986
+ return ERR_PTR(-EAGAIN);
1987
+ refcount_inc(&state->count);
18681988
18691989 return state;
18701990 }
....@@ -1902,7 +2022,7 @@
19022022 return ERR_CAST(inode);
19032023 if (data->state != NULL && data->state->inode == inode) {
19042024 state = data->state;
1905
- atomic_inc(&state->count);
2025
+ refcount_inc(&state->count);
19062026 } else
19072027 state = nfs4_get_open_state(inode, data->owner);
19082028 iput(inode);
....@@ -1928,8 +2048,11 @@
19282048
19292049 if (data->o_res.delegation_type != 0)
19302050 nfs4_opendata_check_deleg(data, state);
1931
- update_open_stateid(state, &data->o_res.stateid, NULL,
1932
- data->o_arg.fmode);
2051
+ if (!update_open_stateid(state, &data->o_res.stateid,
2052
+ NULL, data->o_arg.fmode)) {
2053
+ nfs4_put_open_state(state);
2054
+ state = ERR_PTR(-EAGAIN);
2055
+ }
19332056 out:
19342057 nfs_release_seqid(data->o_arg.seqid);
19352058 return state;
....@@ -1948,21 +2071,39 @@
19482071 return ret;
19492072 }
19502073
1951
-static struct nfs_open_context *nfs4_state_find_open_context(struct nfs4_state *state)
2074
+static struct nfs_open_context *
2075
+nfs4_state_find_open_context_mode(struct nfs4_state *state, fmode_t mode)
19522076 {
19532077 struct nfs_inode *nfsi = NFS_I(state->inode);
19542078 struct nfs_open_context *ctx;
19552079
1956
- spin_lock(&state->inode->i_lock);
1957
- list_for_each_entry(ctx, &nfsi->open_files, list) {
2080
+ rcu_read_lock();
2081
+ list_for_each_entry_rcu(ctx, &nfsi->open_files, list) {
19582082 if (ctx->state != state)
19592083 continue;
1960
- get_nfs_open_context(ctx);
1961
- spin_unlock(&state->inode->i_lock);
2084
+ if ((ctx->mode & mode) != mode)
2085
+ continue;
2086
+ if (!get_nfs_open_context(ctx))
2087
+ continue;
2088
+ rcu_read_unlock();
19622089 return ctx;
19632090 }
1964
- spin_unlock(&state->inode->i_lock);
2091
+ rcu_read_unlock();
19652092 return ERR_PTR(-ENOENT);
2093
+}
2094
+
2095
+static struct nfs_open_context *
2096
+nfs4_state_find_open_context(struct nfs4_state *state)
2097
+{
2098
+ struct nfs_open_context *ctx;
2099
+
2100
+ ctx = nfs4_state_find_open_context_mode(state, FMODE_READ|FMODE_WRITE);
2101
+ if (!IS_ERR(ctx))
2102
+ return ctx;
2103
+ ctx = nfs4_state_find_open_context_mode(state, FMODE_WRITE);
2104
+ if (!IS_ERR(ctx))
2105
+ return ctx;
2106
+ return nfs4_state_find_open_context_mode(state, FMODE_READ);
19662107 }
19672108
19682109 static struct nfs4_opendata *nfs4_open_recoverdata_alloc(struct nfs_open_context *ctx,
....@@ -1975,7 +2116,7 @@
19752116 if (opendata == NULL)
19762117 return ERR_PTR(-ENOMEM);
19772118 opendata->state = state;
1978
- atomic_inc(&state->count);
2119
+ refcount_inc(&state->count);
19792120 return opendata;
19802121 }
19812122
....@@ -2011,13 +2152,7 @@
20112152 {
20122153 int ret;
20132154
2014
- /* Don't trigger recovery in nfs_test_and_clear_all_open_stateid */
2015
- clear_bit(NFS_O_RDWR_STATE, &state->flags);
2016
- clear_bit(NFS_O_WRONLY_STATE, &state->flags);
2017
- clear_bit(NFS_O_RDONLY_STATE, &state->flags);
20182155 /* memory barrier prior to reading state->n_* */
2019
- clear_bit(NFS_DELEGATED_STATE, &state->flags);
2020
- clear_bit(NFS_OPEN_STATE, &state->flags);
20212156 smp_rmb();
20222157 ret = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE);
20232158 if (ret != 0)
....@@ -2093,6 +2228,8 @@
20932228 ctx = nfs4_state_find_open_context(state);
20942229 if (IS_ERR(ctx))
20952230 return -EAGAIN;
2231
+ clear_bit(NFS_DELEGATED_STATE, &state->flags);
2232
+ nfs_state_clear_open_state_flags(state);
20962233 ret = nfs4_do_open_reclaim(ctx, state);
20972234 put_nfs_open_context(ctx);
20982235 return ret;
....@@ -2108,13 +2245,13 @@
21082245 case -ENOENT:
21092246 case -EAGAIN:
21102247 case -ESTALE:
2248
+ case -ETIMEDOUT:
21112249 break;
21122250 case -NFS4ERR_BADSESSION:
21132251 case -NFS4ERR_BADSLOT:
21142252 case -NFS4ERR_BAD_HIGH_SLOT:
21152253 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
21162254 case -NFS4ERR_DEADSESSION:
2117
- nfs4_schedule_session_recovery(server->nfs_client->cl_session, err);
21182255 return -EAGAIN;
21192256 case -NFS4ERR_STALE_CLIENTID:
21202257 case -NFS4ERR_STALE_STATEID:
....@@ -2251,7 +2388,7 @@
22512388 .callback_ops = &nfs4_open_confirm_ops,
22522389 .callback_data = data,
22532390 .workqueue = nfsiod_workqueue,
2254
- .flags = RPC_TASK_ASYNC,
2391
+ .flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF,
22552392 };
22562393 int status;
22572394
....@@ -2308,7 +2445,7 @@
23082445 case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
23092446 case NFS4_OPEN_CLAIM_DELEG_PREV_FH:
23102447 data->o_arg.open_bitmap = &nfs4_open_noattr_bitmap[0];
2311
- /* Fall through */
2448
+ fallthrough;
23122449 case NFS4_OPEN_CLAIM_FH:
23132450 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
23142451 }
....@@ -2416,7 +2553,7 @@
24162553 .callback_ops = &nfs4_open_ops,
24172554 .callback_data = data,
24182555 .workqueue = nfsiod_workqueue,
2419
- .flags = RPC_TASK_ASYNC,
2556
+ .flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF,
24202557 };
24212558 int status;
24222559
....@@ -2428,6 +2565,7 @@
24282565 if (!ctx) {
24292566 nfs4_init_sequence(&o_arg->seq_args, &o_res->seq_res, 1, 1);
24302567 data->is_recover = true;
2568
+ task_setup_data.flags |= RPC_TASK_TIMEOUT;
24312569 } else {
24322570 nfs4_init_sequence(&o_arg->seq_args, &o_res->seq_res, 1, 0);
24332571 pnfs_lgopen_prepare(data, ctx);
....@@ -2472,7 +2610,7 @@
24722610 * Note that in the non-execute case, we want to turn off permission
24732611 * checking if we just created a new file (POSIX open() semantics).
24742612 */
2475
-static int nfs4_opendata_access(struct rpc_cred *cred,
2613
+static int nfs4_opendata_access(const struct cred *cred,
24762614 struct nfs4_opendata *opendata,
24772615 struct nfs4_state *state, fmode_t fmode,
24782616 int openflags)
....@@ -2541,8 +2679,9 @@
25412679 data->file_created = true;
25422680 if (data->file_created ||
25432681 inode_peek_iversion_raw(dir) != o_res->cinfo.after)
2544
- update_changeattr(dir, &o_res->cinfo,
2545
- o_res->f_attr->time_start, 0);
2682
+ nfs4_update_changeattr(dir, &o_res->cinfo,
2683
+ o_res->f_attr->time_start,
2684
+ NFS_INO_INVALID_DATA);
25462685 }
25472686 if ((o_res->rflags & NFS4_OPEN_RESULT_LOCKTYPE_POSIX) == 0)
25482687 server->caps &= ~NFS_CAP_POSIX_LOCK;
....@@ -2634,12 +2773,13 @@
26342773 {
26352774 /* NFSv4.0 doesn't allow for delegation recovery on open expire */
26362775 nfs40_clear_delegation_stateid(state);
2776
+ nfs_state_clear_open_state_flags(state);
26372777 return nfs4_open_expired(sp, state);
26382778 }
26392779
26402780 static int nfs40_test_and_free_expired_stateid(struct nfs_server *server,
26412781 nfs4_stateid *stateid,
2642
- struct rpc_cred *cred)
2782
+ const struct cred *cred)
26432783 {
26442784 return -NFS4ERR_BAD_STATEID;
26452785 }
....@@ -2647,7 +2787,7 @@
26472787 #if defined(CONFIG_NFS_V4_1)
26482788 static int nfs41_test_and_free_expired_stateid(struct nfs_server *server,
26492789 nfs4_stateid *stateid,
2650
- struct rpc_cred *cred)
2790
+ const struct cred *cred)
26512791 {
26522792 int status;
26532793
....@@ -2676,13 +2816,13 @@
26762816 return -NFS4ERR_EXPIRED;
26772817 }
26782818
2679
-static void nfs41_check_delegation_stateid(struct nfs4_state *state)
2819
+static int nfs41_check_delegation_stateid(struct nfs4_state *state)
26802820 {
26812821 struct nfs_server *server = NFS_SERVER(state->inode);
26822822 nfs4_stateid stateid;
26832823 struct nfs_delegation *delegation;
2684
- struct rpc_cred *cred;
2685
- int status;
2824
+ const struct cred *cred = NULL;
2825
+ int status, ret = NFS_OK;
26862826
26872827 /* Get the delegation credential for use by test/free_stateid */
26882828 rcu_read_lock();
....@@ -2690,30 +2830,45 @@
26902830 if (delegation == NULL) {
26912831 rcu_read_unlock();
26922832 nfs_state_clear_delegation(state);
2693
- return;
2833
+ return NFS_OK;
26942834 }
26952835
2836
+ spin_lock(&delegation->lock);
26962837 nfs4_stateid_copy(&stateid, &delegation->stateid);
2697
- if (test_bit(NFS_DELEGATION_REVOKED, &delegation->flags)) {
2698
- rcu_read_unlock();
2699
- nfs_state_clear_delegation(state);
2700
- return;
2701
- }
27022838
27032839 if (!test_and_clear_bit(NFS_DELEGATION_TEST_EXPIRED,
27042840 &delegation->flags)) {
2841
+ spin_unlock(&delegation->lock);
27052842 rcu_read_unlock();
2706
- return;
2843
+ return NFS_OK;
27072844 }
27082845
2709
- cred = get_rpccred(delegation->cred);
2846
+ if (delegation->cred)
2847
+ cred = get_cred(delegation->cred);
2848
+ spin_unlock(&delegation->lock);
27102849 rcu_read_unlock();
27112850 status = nfs41_test_and_free_expired_stateid(server, &stateid, cred);
27122851 trace_nfs4_test_delegation_stateid(state, NULL, status);
27132852 if (status == -NFS4ERR_EXPIRED || status == -NFS4ERR_BAD_STATEID)
27142853 nfs_finish_clear_delegation_stateid(state, &stateid);
2854
+ else
2855
+ ret = status;
27152856
2716
- put_rpccred(cred);
2857
+ put_cred(cred);
2858
+ return ret;
2859
+}
2860
+
2861
+static void nfs41_delegation_recover_stateid(struct nfs4_state *state)
2862
+{
2863
+ nfs4_stateid tmp;
2864
+
2865
+ if (test_bit(NFS_DELEGATED_STATE, &state->flags) &&
2866
+ nfs4_copy_delegation_stateid(state->inode, state->state,
2867
+ &tmp, NULL) &&
2868
+ nfs4_stateid_match_other(&state->stateid, &tmp))
2869
+ nfs_state_set_delegation(state, &tmp, state->state);
2870
+ else
2871
+ nfs_state_clear_delegation(state);
27172872 }
27182873
27192874 /**
....@@ -2736,7 +2891,7 @@
27362891 spin_lock(&state->state_lock);
27372892 list_for_each_entry(lsp, &state->lock_states, ls_locks) {
27382893 if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags)) {
2739
- struct rpc_cred *cred = lsp->ls_state->owner->so_cred;
2894
+ const struct cred *cred = lsp->ls_state->owner->so_cred;
27402895
27412896 refcount_inc(&lsp->ls_count);
27422897 spin_unlock(&state->state_lock);
....@@ -2780,24 +2935,15 @@
27802935 {
27812936 struct nfs_server *server = NFS_SERVER(state->inode);
27822937 nfs4_stateid *stateid = &state->open_stateid;
2783
- struct rpc_cred *cred = state->owner->so_cred;
2938
+ const struct cred *cred = state->owner->so_cred;
27842939 int status;
27852940
2786
- if (test_bit(NFS_OPEN_STATE, &state->flags) == 0) {
2787
- if (test_bit(NFS_DELEGATED_STATE, &state->flags) == 0) {
2788
- if (nfs4_have_delegation(state->inode, state->state))
2789
- return NFS_OK;
2790
- return -NFS4ERR_OPENMODE;
2791
- }
2941
+ if (test_bit(NFS_OPEN_STATE, &state->flags) == 0)
27922942 return -NFS4ERR_BAD_STATEID;
2793
- }
27942943 status = nfs41_test_and_free_expired_stateid(server, stateid, cred);
27952944 trace_nfs4_test_open_stateid(state, NULL, status);
27962945 if (status == -NFS4ERR_EXPIRED || status == -NFS4ERR_BAD_STATEID) {
2797
- clear_bit(NFS_O_RDONLY_STATE, &state->flags);
2798
- clear_bit(NFS_O_WRONLY_STATE, &state->flags);
2799
- clear_bit(NFS_O_RDWR_STATE, &state->flags);
2800
- clear_bit(NFS_OPEN_STATE, &state->flags);
2946
+ nfs_state_clear_open_state_flags(state);
28012947 stateid->type = NFS4_INVALID_STATEID_TYPE;
28022948 return status;
28032949 }
....@@ -2810,7 +2956,11 @@
28102956 {
28112957 int status;
28122958
2813
- nfs41_check_delegation_stateid(state);
2959
+ status = nfs41_check_delegation_stateid(state);
2960
+ if (status != NFS_OK)
2961
+ return status;
2962
+ nfs41_delegation_recover_stateid(state);
2963
+
28142964 status = nfs41_check_expired_locks(state);
28152965 if (status != NFS_OK)
28162966 return status;
....@@ -2863,18 +3013,20 @@
28633013 }
28643014
28653015 static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
2866
- fmode_t fmode,
2867
- int flags,
2868
- struct nfs_open_context *ctx)
3016
+ int flags, struct nfs_open_context *ctx)
28693017 {
28703018 struct nfs4_state_owner *sp = opendata->owner;
28713019 struct nfs_server *server = sp->so_server;
28723020 struct dentry *dentry;
28733021 struct nfs4_state *state;
3022
+ fmode_t acc_mode = _nfs4_ctx_to_accessmode(ctx);
3023
+ struct inode *dir = d_inode(opendata->dir);
3024
+ unsigned long dir_verifier;
28743025 unsigned int seq;
28753026 int ret;
28763027
28773028 seq = raw_seqcount_begin(&sp->so_reclaim_seqcount);
3029
+ dir_verifier = nfs_save_change_attribute(dir);
28783030
28793031 ret = _nfs4_proc_open(opendata, ctx);
28803032 if (ret != 0)
....@@ -2902,14 +3054,26 @@
29023054 dput(ctx->dentry);
29033055 ctx->dentry = dentry = alias;
29043056 }
2905
- nfs_set_verifier(dentry,
2906
- nfs_save_change_attribute(d_inode(opendata->dir)));
3057
+ }
3058
+
3059
+ switch(opendata->o_arg.claim) {
3060
+ default:
3061
+ break;
3062
+ case NFS4_OPEN_CLAIM_NULL:
3063
+ case NFS4_OPEN_CLAIM_DELEGATE_CUR:
3064
+ case NFS4_OPEN_CLAIM_DELEGATE_PREV:
3065
+ if (!opendata->rpc_done)
3066
+ break;
3067
+ if (opendata->o_res.delegation_type != 0)
3068
+ dir_verifier = nfs_save_change_attribute(dir);
3069
+ nfs_set_verifier(dentry, dir_verifier);
29073070 }
29083071
29093072 /* Parse layoutget results before we check for access */
29103073 pnfs_parse_lgopen(state->inode, opendata->lgp, ctx);
29113074
2912
- ret = nfs4_opendata_access(sp->so_cred, opendata, state, fmode, flags);
3075
+ ret = nfs4_opendata_access(sp->so_cred, opendata, state,
3076
+ acc_mode, flags);
29133077 if (ret != 0)
29143078 goto out;
29153079
....@@ -2920,8 +3084,13 @@
29203084 }
29213085
29223086 out:
2923
- if (!opendata->cancelled)
3087
+ if (!opendata->cancelled) {
3088
+ if (opendata->lgp) {
3089
+ nfs4_lgopen_release(opendata->lgp);
3090
+ opendata->lgp = NULL;
3091
+ }
29243092 nfs4_sequence_free_slot(&opendata->o_res.seq_res);
3093
+ }
29253094 return ret;
29263095 }
29273096
....@@ -2939,9 +3108,9 @@
29393108 struct nfs_server *server = NFS_SERVER(dir);
29403109 struct nfs4_opendata *opendata;
29413110 struct dentry *dentry = ctx->dentry;
2942
- struct rpc_cred *cred = ctx->cred;
3111
+ const struct cred *cred = ctx->cred;
29433112 struct nfs4_threshold **ctx_th = &ctx->mdsthreshold;
2944
- fmode_t fmode = ctx->mode & (FMODE_READ|FMODE_WRITE|FMODE_EXEC);
3113
+ fmode_t fmode = _nfs4_ctx_to_openmode(ctx);
29453114 enum open_claim_type4 claim = NFS4_OPEN_CLAIM_NULL;
29463115 struct iattr *sattr = c->sattr;
29473116 struct nfs4_label *label = c->label;
....@@ -2987,7 +3156,7 @@
29873156 if (d_really_is_positive(dentry))
29883157 opendata->state = nfs4_get_open_state(d_inode(dentry), sp);
29893158
2990
- status = _nfs4_open_and_get_state(opendata, fmode, flags, ctx);
3159
+ status = _nfs4_open_and_get_state(opendata, flags, ctx);
29913160 if (status != 0)
29923161 goto err_free_label;
29933162 state = ctx->state;
....@@ -3047,7 +3216,9 @@
30473216 int *opened)
30483217 {
30493218 struct nfs_server *server = NFS_SERVER(dir);
3050
- struct nfs4_exception exception = { };
3219
+ struct nfs4_exception exception = {
3220
+ .interruptible = true,
3221
+ };
30513222 struct nfs4_state *res;
30523223 struct nfs4_open_createattrs c = {
30533224 .label = label,
....@@ -3114,7 +3285,7 @@
31143285 static int _nfs4_do_setattr(struct inode *inode,
31153286 struct nfs_setattrargs *arg,
31163287 struct nfs_setattrres *res,
3117
- struct rpc_cred *cred,
3288
+ const struct cred *cred,
31183289 struct nfs_open_context *ctx)
31193290 {
31203291 struct nfs_server *server = NFS_SERVER(inode);
....@@ -3124,7 +3295,7 @@
31243295 .rpc_resp = res,
31253296 .rpc_cred = cred,
31263297 };
3127
- struct rpc_cred *delegation_cred = NULL;
3298
+ const struct cred *delegation_cred = NULL;
31283299 unsigned long timestamp = jiffies;
31293300 bool truncate;
31303301 int status;
....@@ -3152,6 +3323,8 @@
31523323 nfs_put_lock_context(l_ctx);
31533324 if (status == -EIO)
31543325 return -EBADF;
3326
+ else if (status == -EAGAIN)
3327
+ goto zero_stateid;
31553328 } else {
31563329 zero_stateid:
31573330 nfs4_stateid_copy(&arg->stateid, &zero_stateid);
....@@ -3161,14 +3334,14 @@
31613334
31623335 status = nfs4_call_sync(server->client, server, &msg, &arg->seq_args, &res->seq_res, 1);
31633336
3164
- put_rpccred(delegation_cred);
3337
+ put_cred(delegation_cred);
31653338 if (status == 0 && ctx != NULL)
31663339 renew_lease(server, timestamp);
31673340 trace_nfs4_setattr(inode, &arg->stateid, status);
31683341 return status;
31693342 }
31703343
3171
-static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
3344
+static int nfs4_do_setattr(struct inode *inode, const struct cred *cred,
31723345 struct nfs_fattr *fattr, struct iattr *sattr,
31733346 struct nfs_open_context *ctx, struct nfs4_label *ilabel,
31743347 struct nfs4_label *olabel)
....@@ -3232,6 +3405,102 @@
32323405 return pnfs_wait_on_layoutreturn(inode, task);
32333406 }
32343407
3408
+/*
3409
+ * Update the seqid of an open stateid
3410
+ */
3411
+static void nfs4_sync_open_stateid(nfs4_stateid *dst,
3412
+ struct nfs4_state *state)
3413
+{
3414
+ __be32 seqid_open;
3415
+ u32 dst_seqid;
3416
+ int seq;
3417
+
3418
+ for (;;) {
3419
+ if (!nfs4_valid_open_stateid(state))
3420
+ break;
3421
+ seq = read_seqbegin(&state->seqlock);
3422
+ if (!nfs4_state_match_open_stateid_other(state, dst)) {
3423
+ nfs4_stateid_copy(dst, &state->open_stateid);
3424
+ if (read_seqretry(&state->seqlock, seq))
3425
+ continue;
3426
+ break;
3427
+ }
3428
+ seqid_open = state->open_stateid.seqid;
3429
+ if (read_seqretry(&state->seqlock, seq))
3430
+ continue;
3431
+
3432
+ dst_seqid = be32_to_cpu(dst->seqid);
3433
+ if ((s32)(dst_seqid - be32_to_cpu(seqid_open)) < 0)
3434
+ dst->seqid = seqid_open;
3435
+ break;
3436
+ }
3437
+}
3438
+
3439
+/*
3440
+ * Update the seqid of an open stateid after receiving
3441
+ * NFS4ERR_OLD_STATEID
3442
+ */
3443
+static bool nfs4_refresh_open_old_stateid(nfs4_stateid *dst,
3444
+ struct nfs4_state *state)
3445
+{
3446
+ __be32 seqid_open;
3447
+ u32 dst_seqid;
3448
+ bool ret;
3449
+ int seq, status = -EAGAIN;
3450
+ DEFINE_WAIT(wait);
3451
+
3452
+ for (;;) {
3453
+ ret = false;
3454
+ if (!nfs4_valid_open_stateid(state))
3455
+ break;
3456
+ seq = read_seqbegin(&state->seqlock);
3457
+ if (!nfs4_state_match_open_stateid_other(state, dst)) {
3458
+ if (read_seqretry(&state->seqlock, seq))
3459
+ continue;
3460
+ break;
3461
+ }
3462
+
3463
+ write_seqlock(&state->seqlock);
3464
+ seqid_open = state->open_stateid.seqid;
3465
+
3466
+ dst_seqid = be32_to_cpu(dst->seqid);
3467
+
3468
+ /* Did another OPEN bump the state's seqid? try again: */
3469
+ if ((s32)(be32_to_cpu(seqid_open) - dst_seqid) > 0) {
3470
+ dst->seqid = seqid_open;
3471
+ write_sequnlock(&state->seqlock);
3472
+ ret = true;
3473
+ break;
3474
+ }
3475
+
3476
+ /* server says we're behind but we haven't seen the update yet */
3477
+ set_bit(NFS_STATE_CHANGE_WAIT, &state->flags);
3478
+ prepare_to_wait(&state->waitq, &wait, TASK_KILLABLE);
3479
+ write_sequnlock(&state->seqlock);
3480
+ trace_nfs4_close_stateid_update_wait(state->inode, dst, 0);
3481
+
3482
+ if (fatal_signal_pending(current))
3483
+ status = -EINTR;
3484
+ else
3485
+ if (schedule_timeout(5*HZ) != 0)
3486
+ status = 0;
3487
+
3488
+ finish_wait(&state->waitq, &wait);
3489
+
3490
+ if (!status)
3491
+ continue;
3492
+ if (status == -EINTR)
3493
+ break;
3494
+
3495
+ /* we slept the whole 5 seconds, we must have lost a seqid */
3496
+ dst->seqid = cpu_to_be32(dst_seqid + 1);
3497
+ ret = true;
3498
+ break;
3499
+ }
3500
+
3501
+ return ret;
3502
+}
3503
+
32353504 struct nfs4_closedata {
32363505 struct inode *inode;
32373506 struct nfs4_state *state;
....@@ -3282,32 +3551,9 @@
32823551 trace_nfs4_close(state, &calldata->arg, &calldata->res, task->tk_status);
32833552
32843553 /* Handle Layoutreturn errors */
3285
- if (calldata->arg.lr_args && task->tk_status != 0) {
3286
- switch (calldata->res.lr_ret) {
3287
- default:
3288
- calldata->res.lr_ret = -NFS4ERR_NOMATCHING_LAYOUT;
3289
- break;
3290
- case 0:
3291
- calldata->arg.lr_args = NULL;
3292
- calldata->res.lr_res = NULL;
3293
- break;
3294
- case -NFS4ERR_OLD_STATEID:
3295
- if (nfs4_layoutreturn_refresh_stateid(&calldata->arg.lr_args->stateid,
3296
- &calldata->arg.lr_args->range,
3297
- calldata->inode))
3298
- goto lr_restart;
3299
- /* Fallthrough */
3300
- case -NFS4ERR_ADMIN_REVOKED:
3301
- case -NFS4ERR_DELEG_REVOKED:
3302
- case -NFS4ERR_EXPIRED:
3303
- case -NFS4ERR_BAD_STATEID:
3304
- case -NFS4ERR_UNKNOWN_LAYOUTTYPE:
3305
- case -NFS4ERR_WRONG_CRED:
3306
- calldata->arg.lr_args = NULL;
3307
- calldata->res.lr_res = NULL;
3308
- goto lr_restart;
3309
- }
3310
- }
3554
+ if (pnfs_roc_done(task, &calldata->arg.lr_args, &calldata->res.lr_res,
3555
+ &calldata->res.lr_ret) == -EAGAIN)
3556
+ goto out_restart;
33113557
33123558 /* hmm. we are done with the inode, and in the process of freeing
33133559 * the state_owner. we keep this around to process errors
....@@ -3327,7 +3573,7 @@
33273573 break;
33283574 case -NFS4ERR_OLD_STATEID:
33293575 /* Did we race with OPEN? */
3330
- if (nfs4_refresh_open_stateid(&calldata->arg.stateid,
3576
+ if (nfs4_refresh_open_old_stateid(&calldata->arg.stateid,
33313577 state))
33323578 goto out_restart;
33333579 goto out_release;
....@@ -3337,9 +3583,11 @@
33373583 nfs4_free_revoked_stateid(server,
33383584 &calldata->arg.stateid,
33393585 task->tk_msg.rpc_cred);
3340
- /* Fallthrough */
3586
+ fallthrough;
33413587 case -NFS4ERR_BAD_STATEID:
3342
- break;
3588
+ if (calldata->arg.fmode == 0)
3589
+ break;
3590
+ fallthrough;
33433591 default:
33443592 task->tk_status = nfs4_async_handle_exception(task,
33453593 server, task->tk_status, &exception);
....@@ -3354,8 +3602,6 @@
33543602 nfs_refresh_inode(calldata->inode, &calldata->fattr);
33553603 dprintk("%s: done, ret = %d!\n", __func__, task->tk_status);
33563604 return;
3357
-lr_restart:
3358
- calldata->res.lr_ret = 0;
33593605 out_restart:
33603606 task->tk_status = 0;
33613607 rpc_restart_call_prepare(task);
....@@ -3367,6 +3613,7 @@
33673613 struct nfs4_closedata *calldata = data;
33683614 struct nfs4_state *state = calldata->state;
33693615 struct inode *inode = calldata->inode;
3616
+ struct nfs_server *server = NFS_SERVER(inode);
33703617 struct pnfs_layout_hdr *lo;
33713618 bool is_rdonly, is_wronly, is_rdwr;
33723619 int call_close = 0;
....@@ -3396,8 +3643,8 @@
33963643 } else if (is_rdwr)
33973644 calldata->arg.fmode |= FMODE_READ|FMODE_WRITE;
33983645
3399
- if (!nfs4_valid_open_stateid(state) ||
3400
- !nfs4_refresh_open_stateid(&calldata->arg.stateid, state))
3646
+ nfs4_sync_open_stateid(&calldata->arg.stateid, state);
3647
+ if (!nfs4_valid_open_stateid(state))
34013648 call_close = 0;
34023649 spin_unlock(&state->owner->so_lock);
34033650
....@@ -3422,9 +3669,12 @@
34223669
34233670 if (calldata->arg.fmode == 0 || calldata->arg.fmode == FMODE_READ) {
34243671 /* Close-to-open cache consistency revalidation */
3425
- if (!nfs4_have_delegation(inode, FMODE_READ))
3426
- calldata->arg.bitmask = NFS_SERVER(inode)->cache_consistency_bitmask;
3427
- else
3672
+ if (!nfs4_have_delegation(inode, FMODE_READ)) {
3673
+ nfs4_bitmask_set(calldata->arg.bitmask_store,
3674
+ server->cache_consistency_bitmask,
3675
+ inode, server, NULL);
3676
+ calldata->arg.bitmask = calldata->arg.bitmask_store;
3677
+ } else
34283678 calldata->arg.bitmask = NULL;
34293679 }
34303680
....@@ -3483,7 +3733,7 @@
34833733 .rpc_message = &msg,
34843734 .callback_ops = &nfs4_close_ops,
34853735 .workqueue = nfsiod_workqueue,
3486
- .flags = RPC_TASK_ASYNC,
3736
+ .flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF,
34873737 };
34883738 int status = -ENOMEM;
34893739
....@@ -3562,14 +3812,14 @@
35623812 if (ctx->state == NULL)
35633813 return;
35643814 if (is_sync)
3565
- nfs4_close_sync(ctx->state, ctx->mode);
3815
+ nfs4_close_sync(ctx->state, _nfs4_ctx_to_openmode(ctx));
35663816 else
3567
- nfs4_close_state(ctx->state, ctx->mode);
3817
+ nfs4_close_state(ctx->state, _nfs4_ctx_to_openmode(ctx));
35683818 }
35693819
35703820 #define FATTR4_WORD1_NFS40_MASK (2*FATTR4_WORD1_MOUNTED_ON_FILEID - 1UL)
35713821 #define FATTR4_WORD2_NFS41_MASK (2*FATTR4_WORD2_SUPPATTR_EXCLCREAT - 1UL)
3572
-#define FATTR4_WORD2_NFS42_MASK (2*FATTR4_WORD2_MODE_UMASK - 1UL)
3822
+#define FATTR4_WORD2_NFS42_MASK (2*FATTR4_WORD2_XATTR_SUPPORT - 1UL)
35733823
35743824 static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
35753825 {
....@@ -3667,7 +3917,9 @@
36673917
36683918 int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
36693919 {
3670
- struct nfs4_exception exception = { };
3920
+ struct nfs4_exception exception = {
3921
+ .interruptible = true,
3922
+ };
36713923 int err;
36723924 do {
36733925 err = nfs4_handle_exception(server,
....@@ -3709,7 +3961,9 @@
37093961 static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
37103962 struct nfs_fsinfo *info)
37113963 {
3712
- struct nfs4_exception exception = { };
3964
+ struct nfs4_exception exception = {
3965
+ .interruptible = true,
3966
+ };
37133967 int err;
37143968 do {
37153969 err = _nfs4_lookup_root(server, fhandle, info);
....@@ -3784,7 +4038,7 @@
37844038 }
37854039
37864040 /*
3787
- * -EACCESS could mean that the user doesn't have correct permissions
4041
+ * -EACCES could mean that the user doesn't have correct permissions
37884042 * to access the mount. It could also mean that we tried to mount
37894043 * with a gss auth flavor, but rpc.gssd isn't running. Either way,
37904044 * existing mount programs don't handle -EACCES very well so it should
....@@ -3830,7 +4084,7 @@
38304084 {
38314085 int error;
38324086 struct nfs_fattr *fattr = info->fattr;
3833
- struct nfs4_label *label = NULL;
4087
+ struct nfs4_label *label = fattr->label;
38344088
38354089 error = nfs4_server_capabilities(server, mntfh);
38364090 if (error < 0) {
....@@ -3838,23 +4092,17 @@
38384092 return error;
38394093 }
38404094
3841
- label = nfs4_label_alloc(server, GFP_KERNEL);
3842
- if (IS_ERR(label))
3843
- return PTR_ERR(label);
3844
-
38454095 error = nfs4_proc_getattr(server, mntfh, fattr, label, NULL);
38464096 if (error < 0) {
38474097 dprintk("nfs4_get_root: getattr error = %d\n", -error);
3848
- goto err_free_label;
4098
+ goto out;
38494099 }
38504100
38514101 if (fattr->valid & NFS_ATTR_FATTR_FSID &&
38524102 !nfs_fsid_equal(&server->fsid, &fattr->fsid))
38534103 memcpy(&server->fsid, &fattr->fsid, sizeof(server->fsid));
38544104
3855
-err_free_label:
3856
- nfs4_label_free(label);
3857
-
4105
+out:
38584106 return error;
38594107 }
38604108
....@@ -3925,18 +4173,27 @@
39254173 .rpc_argp = &args,
39264174 .rpc_resp = &res,
39274175 };
4176
+ unsigned short task_flags = 0;
4177
+
4178
+ /* Is this is an attribute revalidation, subject to softreval? */
4179
+ if (inode && (server->flags & NFS_MOUNT_SOFTREVAL))
4180
+ task_flags |= RPC_TASK_TIMEOUT;
39284181
39294182 nfs4_bitmap_copy_adjust(bitmask, nfs4_bitmask(server, label), inode);
39304183
39314184 nfs_fattr_init(fattr);
3932
- return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
4185
+ nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
4186
+ return nfs4_do_call_sync(server->client, server, &msg,
4187
+ &args.seq_args, &res.seq_res, task_flags);
39334188 }
39344189
3935
-static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
4190
+int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
39364191 struct nfs_fattr *fattr, struct nfs4_label *label,
39374192 struct inode *inode)
39384193 {
3939
- struct nfs4_exception exception = { };
4194
+ struct nfs4_exception exception = {
4195
+ .interruptible = true,
4196
+ };
39404197 int err;
39414198 do {
39424199 err = _nfs4_proc_getattr(server, fhandle, fattr, label, inode);
....@@ -3969,7 +4226,7 @@
39694226 struct iattr *sattr)
39704227 {
39714228 struct inode *inode = d_inode(dentry);
3972
- struct rpc_cred *cred = NULL;
4229
+ const struct cred *cred = NULL;
39734230 struct nfs_open_context *ctx = NULL;
39744231 struct nfs4_label *label = NULL;
39754232 int status;
....@@ -4015,7 +4272,7 @@
40154272 }
40164273
40174274 static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
4018
- const struct qstr *name, struct nfs_fh *fhandle,
4275
+ struct dentry *dentry, struct nfs_fh *fhandle,
40194276 struct nfs_fattr *fattr, struct nfs4_label *label)
40204277 {
40214278 struct nfs_server *server = NFS_SERVER(dir);
....@@ -4023,7 +4280,7 @@
40234280 struct nfs4_lookup_arg args = {
40244281 .bitmask = server->attr_bitmask,
40254282 .dir_fh = NFS_FH(dir),
4026
- .name = name,
4283
+ .name = &dentry->d_name,
40274284 };
40284285 struct nfs4_lookup_res res = {
40294286 .server = server,
....@@ -4036,13 +4293,20 @@
40364293 .rpc_argp = &args,
40374294 .rpc_resp = &res,
40384295 };
4296
+ unsigned short task_flags = 0;
4297
+
4298
+ /* Is this is an attribute revalidation, subject to softreval? */
4299
+ if (nfs_lookup_is_soft_revalidate(dentry))
4300
+ task_flags |= RPC_TASK_TIMEOUT;
40394301
40404302 args.bitmask = nfs4_bitmask(server, label);
40414303
40424304 nfs_fattr_init(fattr);
40434305
4044
- dprintk("NFS call lookup %s\n", name->name);
4045
- status = nfs4_call_sync(clnt, server, &msg, &args.seq_args, &res.seq_res, 0);
4306
+ dprintk("NFS call lookup %pd2\n", dentry);
4307
+ nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
4308
+ status = nfs4_do_call_sync(clnt, server, &msg,
4309
+ &args.seq_args, &res.seq_res, task_flags);
40464310 dprintk("NFS reply lookup: %d\n", status);
40474311 return status;
40484312 }
....@@ -4056,14 +4320,17 @@
40564320 }
40574321
40584322 static int nfs4_proc_lookup_common(struct rpc_clnt **clnt, struct inode *dir,
4059
- const struct qstr *name, struct nfs_fh *fhandle,
4323
+ struct dentry *dentry, struct nfs_fh *fhandle,
40604324 struct nfs_fattr *fattr, struct nfs4_label *label)
40614325 {
4062
- struct nfs4_exception exception = { };
4326
+ struct nfs4_exception exception = {
4327
+ .interruptible = true,
4328
+ };
40634329 struct rpc_clnt *client = *clnt;
4330
+ const struct qstr *name = &dentry->d_name;
40644331 int err;
40654332 do {
4066
- err = _nfs4_proc_lookup(client, dir, name, fhandle, fattr, label);
4333
+ err = _nfs4_proc_lookup(client, dir, dentry, fhandle, fattr, label);
40674334 trace_nfs4_lookup(dir, name, err);
40684335 switch (err) {
40694336 case -NFS4ERR_BADNAME:
....@@ -4098,14 +4365,14 @@
40984365 return err;
40994366 }
41004367
4101
-static int nfs4_proc_lookup(struct inode *dir, const struct qstr *name,
4368
+static int nfs4_proc_lookup(struct inode *dir, struct dentry *dentry,
41024369 struct nfs_fh *fhandle, struct nfs_fattr *fattr,
41034370 struct nfs4_label *label)
41044371 {
41054372 int status;
41064373 struct rpc_clnt *client = NFS_CLIENT(dir);
41074374
4108
- status = nfs4_proc_lookup_common(&client, dir, name, fhandle, fattr, label);
4375
+ status = nfs4_proc_lookup_common(&client, dir, dentry, fhandle, fattr, label);
41094376 if (client != NFS_CLIENT(dir)) {
41104377 rpc_shutdown_client(client);
41114378 nfs_fixup_secinfo_attributes(fattr);
....@@ -4114,13 +4381,13 @@
41144381 }
41154382
41164383 struct rpc_clnt *
4117
-nfs4_proc_lookup_mountpoint(struct inode *dir, const struct qstr *name,
4384
+nfs4_proc_lookup_mountpoint(struct inode *dir, struct dentry *dentry,
41184385 struct nfs_fh *fhandle, struct nfs_fattr *fattr)
41194386 {
41204387 struct rpc_clnt *client = NFS_CLIENT(dir);
41214388 int status;
41224389
4123
- status = nfs4_proc_lookup_common(&client, dir, name, fhandle, fattr, NULL);
4390
+ status = nfs4_proc_lookup_common(&client, dir, dentry, fhandle, fattr, NULL);
41244391 if (status < 0)
41254392 return ERR_PTR(status);
41264393 return (client == NFS_CLIENT(dir)) ? rpc_clone_client(client) : client;
....@@ -4163,7 +4430,9 @@
41634430 static int nfs4_proc_lookupp(struct inode *inode, struct nfs_fh *fhandle,
41644431 struct nfs_fattr *fattr, struct nfs4_label *label)
41654432 {
4166
- struct nfs4_exception exception = { };
4433
+ struct nfs4_exception exception = {
4434
+ .interruptible = true,
4435
+ };
41674436 int err;
41684437 do {
41694438 err = _nfs4_proc_lookupp(inode, fhandle, fattr, label);
....@@ -4198,7 +4467,6 @@
41984467 return -ENOMEM;
41994468 args.bitmask = server->cache_consistency_bitmask;
42004469 }
4201
-
42024470 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
42034471 if (!status) {
42044472 nfs_access_set_mask(entry, res.access);
....@@ -4211,7 +4479,9 @@
42114479
42124480 static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
42134481 {
4214
- struct nfs4_exception exception = { };
4482
+ struct nfs4_exception exception = {
4483
+ .interruptible = true,
4484
+ };
42154485 int err;
42164486 do {
42174487 err = _nfs4_proc_access(inode, entry);
....@@ -4266,7 +4536,9 @@
42664536 static int nfs4_proc_readlink(struct inode *inode, struct page *page,
42674537 unsigned int pgbase, unsigned int pglen)
42684538 {
4269
- struct nfs4_exception exception = { };
4539
+ struct nfs4_exception exception = {
4540
+ .interruptible = true,
4541
+ };
42704542 int err;
42714543 do {
42724544 err = _nfs4_proc_readlink(inode, page, pgbase, pglen);
....@@ -4331,7 +4603,8 @@
43314603 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 1);
43324604 if (status == 0) {
43334605 spin_lock(&dir->i_lock);
4334
- update_changeattr_locked(dir, &res.cinfo, timestamp, 0);
4606
+ nfs4_update_changeattr_locked(dir, &res.cinfo, timestamp,
4607
+ NFS_INO_INVALID_DATA);
43354608 /* Removing a directory decrements nlink in the parent */
43364609 if (ftype == NF4DIR && dir->i_nlink > 2)
43374610 nfs4_dec_nlink_locked(dir);
....@@ -4342,7 +4615,9 @@
43424615
43434616 static int nfs4_proc_remove(struct inode *dir, struct dentry *dentry)
43444617 {
4345
- struct nfs4_exception exception = { };
4618
+ struct nfs4_exception exception = {
4619
+ .interruptible = true,
4620
+ };
43464621 struct inode *inode = d_inode(dentry);
43474622 int err;
43484623
....@@ -4363,7 +4638,9 @@
43634638
43644639 static int nfs4_proc_rmdir(struct inode *dir, const struct qstr *name)
43654640 {
4366
- struct nfs4_exception exception = { };
4641
+ struct nfs4_exception exception = {
4642
+ .interruptible = true,
4643
+ };
43674644 int err;
43684645
43694646 do {
....@@ -4411,8 +4688,9 @@
44114688 &data->timeout) == -EAGAIN)
44124689 return 0;
44134690 if (task->tk_status == 0)
4414
- update_changeattr(dir, &res->cinfo,
4415
- res->dir_attr->time_start, 0);
4691
+ nfs4_update_changeattr(dir, &res->cinfo,
4692
+ res->dir_attr->time_start,
4693
+ NFS_INO_INVALID_DATA);
44164694 return 1;
44174695 }
44184696
....@@ -4456,16 +4734,18 @@
44564734 if (task->tk_status == 0) {
44574735 if (new_dir != old_dir) {
44584736 /* Note: If we moved a directory, nlink will change */
4459
- update_changeattr(old_dir, &res->old_cinfo,
4737
+ nfs4_update_changeattr(old_dir, &res->old_cinfo,
44604738 res->old_fattr->time_start,
4461
- NFS_INO_INVALID_OTHER);
4462
- update_changeattr(new_dir, &res->new_cinfo,
4739
+ NFS_INO_INVALID_OTHER |
4740
+ NFS_INO_INVALID_DATA);
4741
+ nfs4_update_changeattr(new_dir, &res->new_cinfo,
44634742 res->new_fattr->time_start,
4464
- NFS_INO_INVALID_OTHER);
4743
+ NFS_INO_INVALID_OTHER |
4744
+ NFS_INO_INVALID_DATA);
44654745 } else
4466
- update_changeattr(old_dir, &res->old_cinfo,
4746
+ nfs4_update_changeattr(old_dir, &res->old_cinfo,
44674747 res->old_fattr->time_start,
4468
- 0);
4748
+ NFS_INO_INVALID_DATA);
44694749 }
44704750 return 1;
44714751 }
....@@ -4506,7 +4786,8 @@
45064786
45074787 status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
45084788 if (!status) {
4509
- update_changeattr(dir, &res.cinfo, res.fattr->time_start, 0);
4789
+ nfs4_update_changeattr(dir, &res.cinfo, res.fattr->time_start,
4790
+ NFS_INO_INVALID_DATA);
45104791 status = nfs_post_op_update_inode(inode, res.fattr);
45114792 if (!status)
45124793 nfs_setsecurity(inode, res.fattr, res.label);
....@@ -4522,7 +4803,9 @@
45224803
45234804 static int nfs4_proc_link(struct inode *inode, struct inode *dir, const struct qstr *name)
45244805 {
4525
- struct nfs4_exception exception = { };
4806
+ struct nfs4_exception exception = {
4807
+ .interruptible = true,
4808
+ };
45264809 int err;
45274810 do {
45284811 err = nfs4_handle_exception(NFS_SERVER(inode),
....@@ -4582,8 +4865,9 @@
45824865 &data->arg.seq_args, &data->res.seq_res, 1);
45834866 if (status == 0) {
45844867 spin_lock(&dir->i_lock);
4585
- update_changeattr_locked(dir, &data->res.dir_cinfo,
4586
- data->res.fattr->time_start, 0);
4868
+ nfs4_update_changeattr_locked(dir, &data->res.dir_cinfo,
4869
+ data->res.fattr->time_start,
4870
+ NFS_INO_INVALID_DATA);
45874871 /* Creating a directory bumps nlink in the parent */
45884872 if (data->arg.ftype == NF4DIR)
45894873 nfs4_inc_nlink_locked(dir);
....@@ -4629,7 +4913,9 @@
46294913 static int nfs4_proc_symlink(struct inode *dir, struct dentry *dentry,
46304914 struct page *page, unsigned int len, struct iattr *sattr)
46314915 {
4632
- struct nfs4_exception exception = { };
4916
+ struct nfs4_exception exception = {
4917
+ .interruptible = true,
4918
+ };
46334919 struct nfs4_label l, *label = NULL;
46344920 int err;
46354921
....@@ -4668,7 +4954,9 @@
46684954 struct iattr *sattr)
46694955 {
46704956 struct nfs_server *server = NFS_SERVER(dir);
4671
- struct nfs4_exception exception = { };
4957
+ struct nfs4_exception exception = {
4958
+ .interruptible = true,
4959
+ };
46724960 struct nfs4_label l, *label = NULL;
46734961 int err;
46744962
....@@ -4687,7 +4975,7 @@
46874975 return err;
46884976 }
46894977
4690
-static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
4978
+static int _nfs4_proc_readdir(struct dentry *dentry, const struct cred *cred,
46914979 u64 cookie, struct page **pages, unsigned int count, bool plus)
46924980 {
46934981 struct inode *dir = d_inode(dentry);
....@@ -4731,10 +5019,12 @@
47315019 return status;
47325020 }
47335021
4734
-static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
5022
+static int nfs4_proc_readdir(struct dentry *dentry, const struct cred *cred,
47355023 u64 cookie, struct page **pages, unsigned int count, bool plus)
47365024 {
4737
- struct nfs4_exception exception = { };
5025
+ struct nfs4_exception exception = {
5026
+ .interruptible = true,
5027
+ };
47385028 int err;
47395029 do {
47405030 err = _nfs4_proc_readdir(dentry, cred, cookie,
....@@ -4785,7 +5075,9 @@
47855075 struct iattr *sattr, dev_t rdev)
47865076 {
47875077 struct nfs_server *server = NFS_SERVER(dir);
4788
- struct nfs4_exception exception = { };
5078
+ struct nfs4_exception exception = {
5079
+ .interruptible = true,
5080
+ };
47895081 struct nfs4_label l, *label = NULL;
47905082 int err;
47915083
....@@ -4827,7 +5119,9 @@
48275119
48285120 static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat)
48295121 {
4830
- struct nfs4_exception exception = { };
5122
+ struct nfs4_exception exception = {
5123
+ .interruptible = true,
5124
+ };
48315125 int err;
48325126 do {
48335127 err = nfs4_handle_exception(server,
....@@ -4858,17 +5152,16 @@
48585152
48595153 static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
48605154 {
4861
- struct nfs4_exception exception = { };
4862
- unsigned long now = jiffies;
5155
+ struct nfs4_exception exception = {
5156
+ .interruptible = true,
5157
+ };
48635158 int err;
48645159
48655160 do {
48665161 err = _nfs4_do_fsinfo(server, fhandle, fsinfo);
48675162 trace_nfs4_fsinfo(server, fhandle, fsinfo->fattr, err);
48685163 if (err == 0) {
4869
- nfs4_set_lease_period(server->nfs_client,
4870
- fsinfo->lease_time * HZ,
4871
- now);
5164
+ nfs4_set_lease_period(server->nfs_client, fsinfo->lease_time * HZ);
48725165 break;
48735166 }
48745167 err = nfs4_handle_exception(server, err, &exception);
....@@ -4920,7 +5213,9 @@
49205213 static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
49215214 struct nfs_pathconf *pathconf)
49225215 {
4923
- struct nfs4_exception exception = { };
5216
+ struct nfs4_exception exception = {
5217
+ .interruptible = true,
5218
+ };
49245219 int err;
49255220
49265221 do {
....@@ -4945,12 +5240,12 @@
49455240 const struct nfs_lock_context *l_ctx,
49465241 fmode_t fmode)
49475242 {
4948
- nfs4_stateid current_stateid;
5243
+ nfs4_stateid _current_stateid;
49495244
49505245 /* If the current stateid represents a lost lock, then exit */
4951
- if (nfs4_set_rw_stateid(&current_stateid, ctx, l_ctx, fmode) == -EIO)
5246
+ if (nfs4_set_rw_stateid(&_current_stateid, ctx, l_ctx, fmode) == -EIO)
49525247 return true;
4953
- return nfs4_stateid_match(stateid, &current_stateid);
5248
+ return nfs4_stateid_match(stateid, &_current_stateid);
49545249 }
49555250
49565251 static bool nfs4_error_stateid_expired(int err)
....@@ -5006,14 +5301,31 @@
50065301 return true;
50075302 }
50085303
5304
+static bool nfs4_read_plus_not_supported(struct rpc_task *task,
5305
+ struct nfs_pgio_header *hdr)
5306
+{
5307
+ struct nfs_server *server = NFS_SERVER(hdr->inode);
5308
+ struct rpc_message *msg = &task->tk_msg;
5309
+
5310
+ if (msg->rpc_proc == &nfs4_procedures[NFSPROC4_CLNT_READ_PLUS] &&
5311
+ server->caps & NFS_CAP_READ_PLUS && task->tk_status == -ENOTSUPP) {
5312
+ server->caps &= ~NFS_CAP_READ_PLUS;
5313
+ msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
5314
+ rpc_restart_call_prepare(task);
5315
+ return true;
5316
+ }
5317
+ return false;
5318
+}
5319
+
50095320 static int nfs4_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
50105321 {
5011
-
50125322 dprintk("--> %s\n", __func__);
50135323
50145324 if (!nfs4_sequence_done(task, &hdr->res.seq_res))
50155325 return -EAGAIN;
50165326 if (nfs4_read_stateid_changed(task, &hdr->args))
5327
+ return -EAGAIN;
5328
+ if (nfs4_read_plus_not_supported(task, hdr))
50175329 return -EAGAIN;
50185330 if (task->tk_status > 0)
50195331 nfs_invalidate_atime(hdr->inode);
....@@ -5021,13 +5333,28 @@
50215333 nfs4_read_done_cb(task, hdr);
50225334 }
50235335
5336
+#if defined CONFIG_NFS_V4_2 && defined CONFIG_NFS_V4_2_READ_PLUS
5337
+static void nfs42_read_plus_support(struct nfs_server *server, struct rpc_message *msg)
5338
+{
5339
+ if (server->caps & NFS_CAP_READ_PLUS)
5340
+ msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ_PLUS];
5341
+ else
5342
+ msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
5343
+}
5344
+#else
5345
+static void nfs42_read_plus_support(struct nfs_server *server, struct rpc_message *msg)
5346
+{
5347
+ msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
5348
+}
5349
+#endif /* CONFIG_NFS_V4_2 */
5350
+
50245351 static void nfs4_proc_read_setup(struct nfs_pgio_header *hdr,
50255352 struct rpc_message *msg)
50265353 {
50275354 hdr->timestamp = jiffies;
50285355 if (!hdr->pgio_done_cb)
50295356 hdr->pgio_done_cb = nfs4_read_done_cb;
5030
- msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
5357
+ nfs42_read_plus_support(NFS_SERVER(hdr->inode), msg);
50315358 nfs4_init_sequence(&hdr->args.seq_args, &hdr->res.seq_res, 0, 0);
50325359 }
50335360
....@@ -5111,6 +5438,43 @@
51115438 return nfs4_have_delegation(hdr->inode, FMODE_READ) == 0;
51125439 }
51135440
5441
+static void nfs4_bitmask_set(__u32 bitmask[NFS4_BITMASK_SZ], const __u32 *src,
5442
+ struct inode *inode, struct nfs_server *server,
5443
+ struct nfs4_label *label)
5444
+{
5445
+ unsigned long cache_validity = READ_ONCE(NFS_I(inode)->cache_validity);
5446
+ unsigned int i;
5447
+
5448
+ memcpy(bitmask, src, sizeof(*bitmask) * NFS4_BITMASK_SZ);
5449
+
5450
+ if (cache_validity & (NFS_INO_INVALID_CHANGE | NFS_INO_REVAL_PAGECACHE))
5451
+ bitmask[0] |= FATTR4_WORD0_CHANGE;
5452
+ if (cache_validity & NFS_INO_INVALID_ATIME)
5453
+ bitmask[1] |= FATTR4_WORD1_TIME_ACCESS;
5454
+ if (cache_validity & NFS_INO_INVALID_OTHER)
5455
+ bitmask[1] |= FATTR4_WORD1_MODE | FATTR4_WORD1_OWNER |
5456
+ FATTR4_WORD1_OWNER_GROUP |
5457
+ FATTR4_WORD1_NUMLINKS;
5458
+ if (label && label->len && cache_validity & NFS_INO_INVALID_LABEL)
5459
+ bitmask[2] |= FATTR4_WORD2_SECURITY_LABEL;
5460
+ if (cache_validity & NFS_INO_INVALID_CTIME)
5461
+ bitmask[1] |= FATTR4_WORD1_TIME_METADATA;
5462
+ if (cache_validity & NFS_INO_INVALID_MTIME)
5463
+ bitmask[1] |= FATTR4_WORD1_TIME_MODIFY;
5464
+ if (cache_validity & NFS_INO_INVALID_BLOCKS)
5465
+ bitmask[1] |= FATTR4_WORD1_SPACE_USED;
5466
+
5467
+ if (nfs4_have_delegation(inode, FMODE_READ) &&
5468
+ !(cache_validity & NFS_INO_REVAL_FORCED))
5469
+ bitmask[0] &= ~FATTR4_WORD0_SIZE;
5470
+ else if (cache_validity &
5471
+ (NFS_INO_INVALID_SIZE | NFS_INO_REVAL_PAGECACHE))
5472
+ bitmask[0] |= FATTR4_WORD0_SIZE;
5473
+
5474
+ for (i = 0; i < NFS4_BITMASK_SZ; i++)
5475
+ bitmask[i] &= server->attr_bitmask[i];
5476
+}
5477
+
51145478 static void nfs4_proc_write_setup(struct nfs_pgio_header *hdr,
51155479 struct rpc_message *msg,
51165480 struct rpc_clnt **clnt)
....@@ -5120,8 +5484,12 @@
51205484 if (!nfs4_write_need_cache_consistency_data(hdr)) {
51215485 hdr->args.bitmask = NULL;
51225486 hdr->res.fattr = NULL;
5123
- } else
5124
- hdr->args.bitmask = server->cache_consistency_bitmask;
5487
+ } else {
5488
+ nfs4_bitmask_set(hdr->args.bitmask_store,
5489
+ server->cache_consistency_bitmask,
5490
+ hdr->inode, server, NULL);
5491
+ hdr->args.bitmask = hdr->args.bitmask_store;
5492
+ }
51255493
51265494 if (!hdr->pgio_done_cb)
51275495 hdr->pgio_done_cb = nfs4_write_done_cb;
....@@ -5259,7 +5627,7 @@
52595627 .rpc_release = nfs4_renew_release,
52605628 };
52615629
5262
-static int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred, unsigned renew_flags)
5630
+static int nfs4_proc_async_renew(struct nfs_client *clp, const struct cred *cred, unsigned renew_flags)
52635631 {
52645632 struct rpc_message msg = {
52655633 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
....@@ -5283,7 +5651,7 @@
52835651 &nfs4_renew_ops, data);
52845652 }
52855653
5286
-static int nfs4_proc_renew(struct nfs_client *clp, struct rpc_cred *cred)
5654
+static int nfs4_proc_renew(struct nfs_client *clp, const struct cred *cred)
52875655 {
52885656 struct rpc_message msg = {
52895657 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
....@@ -5311,7 +5679,7 @@
53115679 */
53125680 #define NFS4ACL_MAXPAGES DIV_ROUND_UP(XATTR_SIZE_MAX, PAGE_SIZE)
53135681
5314
-static int buf_to_pages_noslab(const void *buf, size_t buflen,
5682
+int nfs4_buf_to_pages_noslab(const void *buf, size_t buflen,
53155683 struct page **pages)
53165684 {
53175685 struct page *newpage, **spages;
....@@ -5343,7 +5711,7 @@
53435711 struct nfs4_cached_acl {
53445712 int cached;
53455713 size_t len;
5346
- char data[0];
5714
+ char data[];
53475715 };
53485716
53495717 static void nfs4_set_cached_acl(struct inode *inode, struct nfs4_cached_acl *acl)
....@@ -5420,10 +5788,9 @@
54205788 */
54215789 static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
54225790 {
5423
- struct page *pages[NFS4ACL_MAXPAGES + 1] = {NULL, };
5791
+ struct page **pages;
54245792 struct nfs_getaclargs args = {
54255793 .fh = NFS_FH(inode),
5426
- .acl_pages = pages,
54275794 .acl_len = buflen,
54285795 };
54295796 struct nfs_getaclres res = {
....@@ -5434,11 +5801,19 @@
54345801 .rpc_argp = &args,
54355802 .rpc_resp = &res,
54365803 };
5437
- unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE) + 1;
5804
+ unsigned int npages;
54385805 int ret = -ENOMEM, i;
5806
+ struct nfs_server *server = NFS_SERVER(inode);
54395807
5440
- if (npages > ARRAY_SIZE(pages))
5441
- return -ERANGE;
5808
+ if (buflen == 0)
5809
+ buflen = server->rsize;
5810
+
5811
+ npages = DIV_ROUND_UP(buflen, PAGE_SIZE) + 1;
5812
+ pages = kmalloc_array(npages, sizeof(struct page *), GFP_NOFS);
5813
+ if (!pages)
5814
+ return -ENOMEM;
5815
+
5816
+ args.acl_pages = pages;
54425817
54435818 for (i = 0; i < npages; i++) {
54445819 pages[i] = alloc_page(GFP_KERNEL);
....@@ -5484,12 +5859,15 @@
54845859 __free_page(pages[i]);
54855860 if (res.acl_scratch)
54865861 __free_page(res.acl_scratch);
5862
+ kfree(pages);
54875863 return ret;
54885864 }
54895865
54905866 static ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
54915867 {
5492
- struct nfs4_exception exception = { };
5868
+ struct nfs4_exception exception = {
5869
+ .interruptible = true,
5870
+ };
54935871 ssize_t ret;
54945872 do {
54955873 ret = __nfs4_get_acl_uncached(inode, buf, buflen);
....@@ -5546,7 +5924,7 @@
55465924 return -EOPNOTSUPP;
55475925 if (npages > ARRAY_SIZE(pages))
55485926 return -ERANGE;
5549
- i = buf_to_pages_noslab(buf, buflen, arg.acl_pages);
5927
+ i = nfs4_buf_to_pages_noslab(buf, buflen, arg.acl_pages);
55505928 if (i < 0)
55515929 return i;
55525930 nfs4_inode_make_writeable(inode);
....@@ -5632,7 +6010,9 @@
56326010 static int nfs4_get_security_label(struct inode *inode, void *buf,
56336011 size_t buflen)
56346012 {
5635
- struct nfs4_exception exception = { };
6013
+ struct nfs4_exception exception = {
6014
+ .interruptible = true,
6015
+ };
56366016 int err;
56376017
56386018 if (!nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL))
....@@ -5707,7 +6087,6 @@
57076087 {
57086088 struct nfs4_label ilabel, *olabel = NULL;
57096089 struct nfs_fattr fattr;
5710
- struct rpc_cred *cred;
57116090 int status;
57126091
57136092 if (!nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL))
....@@ -5719,10 +6098,6 @@
57196098 ilabel.lfs = 0;
57206099 ilabel.label = (char *)buf;
57216100 ilabel.len = buflen;
5722
-
5723
- cred = rpc_lookup_cred();
5724
- if (IS_ERR(cred))
5725
- return PTR_ERR(cred);
57266101
57276102 olabel = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL);
57286103 if (IS_ERR(olabel)) {
....@@ -5736,7 +6111,6 @@
57366111
57376112 nfs4_label_free(olabel);
57386113 out:
5739
- put_rpccred(cred);
57406114 return status;
57416115 }
57426116 #endif /* CONFIG_NFS_V4_SECURITY_LABEL */
....@@ -5762,9 +6136,34 @@
57626136 memcpy(bootverf->data, verf, sizeof(bootverf->data));
57636137 }
57646138
6139
+static size_t
6140
+nfs4_get_uniquifier(struct nfs_client *clp, char *buf, size_t buflen)
6141
+{
6142
+ struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id);
6143
+ struct nfs_netns_client *nn_clp = nn->nfs_client;
6144
+ const char *id;
6145
+
6146
+ buf[0] = '\0';
6147
+
6148
+ if (nn_clp) {
6149
+ rcu_read_lock();
6150
+ id = rcu_dereference(nn_clp->identifier);
6151
+ if (id)
6152
+ strscpy(buf, id, buflen);
6153
+ rcu_read_unlock();
6154
+ }
6155
+
6156
+ if (nfs4_client_id_uniquifier[0] != '\0' && buf[0] == '\0')
6157
+ strscpy(buf, nfs4_client_id_uniquifier, buflen);
6158
+
6159
+ return strlen(buf);
6160
+}
6161
+
57656162 static int
57666163 nfs4_init_nonuniform_client_string(struct nfs_client *clp)
57676164 {
6165
+ char buf[NFS4_CLIENT_ID_UNIQ_LEN];
6166
+ size_t buflen;
57686167 size_t len;
57696168 char *str;
57706169
....@@ -5778,8 +6177,11 @@
57786177 strlen(rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_ADDR)) +
57796178 1;
57806179 rcu_read_unlock();
5781
- if (nfs4_client_id_uniquifier[0] != '\0')
5782
- len += strlen(nfs4_client_id_uniquifier) + 1;
6180
+
6181
+ buflen = nfs4_get_uniquifier(clp, buf, sizeof(buf));
6182
+ if (buflen)
6183
+ len += buflen + 1;
6184
+
57836185 if (len > NFS4_OPAQUE_LIMIT + 1)
57846186 return -EINVAL;
57856187
....@@ -5793,10 +6195,9 @@
57936195 return -ENOMEM;
57946196
57956197 rcu_read_lock();
5796
- if (nfs4_client_id_uniquifier[0] != '\0')
6198
+ if (buflen)
57976199 scnprintf(str, len, "Linux NFSv4.0 %s/%s/%s",
5798
- clp->cl_rpcclient->cl_nodename,
5799
- nfs4_client_id_uniquifier,
6200
+ clp->cl_rpcclient->cl_nodename, buf,
58006201 rpc_peeraddr2str(clp->cl_rpcclient,
58016202 RPC_DISPLAY_ADDR));
58026203 else
....@@ -5811,49 +6212,22 @@
58116212 }
58126213
58136214 static int
5814
-nfs4_init_uniquifier_client_string(struct nfs_client *clp)
5815
-{
5816
- size_t len;
5817
- char *str;
5818
-
5819
- len = 10 + 10 + 1 + 10 + 1 +
5820
- strlen(nfs4_client_id_uniquifier) + 1 +
5821
- strlen(clp->cl_rpcclient->cl_nodename) + 1;
5822
-
5823
- if (len > NFS4_OPAQUE_LIMIT + 1)
5824
- return -EINVAL;
5825
-
5826
- /*
5827
- * Since this string is allocated at mount time, and held until the
5828
- * nfs_client is destroyed, we can use GFP_KERNEL here w/o worrying
5829
- * about a memory-reclaim deadlock.
5830
- */
5831
- str = kmalloc(len, GFP_KERNEL);
5832
- if (!str)
5833
- return -ENOMEM;
5834
-
5835
- scnprintf(str, len, "Linux NFSv%u.%u %s/%s",
5836
- clp->rpc_ops->version, clp->cl_minorversion,
5837
- nfs4_client_id_uniquifier,
5838
- clp->cl_rpcclient->cl_nodename);
5839
- clp->cl_owner_id = str;
5840
- return 0;
5841
-}
5842
-
5843
-static int
58446215 nfs4_init_uniform_client_string(struct nfs_client *clp)
58456216 {
6217
+ char buf[NFS4_CLIENT_ID_UNIQ_LEN];
6218
+ size_t buflen;
58466219 size_t len;
58476220 char *str;
58486221
58496222 if (clp->cl_owner_id != NULL)
58506223 return 0;
58516224
5852
- if (nfs4_client_id_uniquifier[0] != '\0')
5853
- return nfs4_init_uniquifier_client_string(clp);
5854
-
58556225 len = 10 + 10 + 1 + 10 + 1 +
58566226 strlen(clp->cl_rpcclient->cl_nodename) + 1;
6227
+
6228
+ buflen = nfs4_get_uniquifier(clp, buf, sizeof(buf));
6229
+ if (buflen)
6230
+ len += buflen + 1;
58576231
58586232 if (len > NFS4_OPAQUE_LIMIT + 1)
58596233 return -EINVAL;
....@@ -5867,9 +6241,14 @@
58676241 if (!str)
58686242 return -ENOMEM;
58696243
5870
- scnprintf(str, len, "Linux NFSv%u.%u %s",
5871
- clp->rpc_ops->version, clp->cl_minorversion,
5872
- clp->cl_rpcclient->cl_nodename);
6244
+ if (buflen)
6245
+ scnprintf(str, len, "Linux NFSv%u.%u %s/%s",
6246
+ clp->rpc_ops->version, clp->cl_minorversion,
6247
+ buf, clp->cl_rpcclient->cl_nodename);
6248
+ else
6249
+ scnprintf(str, len, "Linux NFSv%u.%u %s",
6250
+ clp->rpc_ops->version, clp->cl_minorversion,
6251
+ clp->cl_rpcclient->cl_nodename);
58736252 clp->cl_owner_id = str;
58746253 return 0;
58756254 }
....@@ -5905,13 +6284,13 @@
59056284 * @clp: state data structure
59066285 * @program: RPC program for NFSv4 callback service
59076286 * @port: IP port number for NFS4 callback service
5908
- * @cred: RPC credential to use for this call
6287
+ * @cred: credential to use for this call
59096288 * @res: where to place the result
59106289 *
59116290 * Returns zero, a negative errno, or a negative NFS4ERR status code.
59126291 */
59136292 int nfs4_proc_setclientid(struct nfs_client *clp, u32 program,
5914
- unsigned short port, struct rpc_cred *cred,
6293
+ unsigned short port, const struct cred *cred,
59156294 struct nfs4_setclientid_res *res)
59166295 {
59176296 nfs4_verifier sc_verifier;
....@@ -5926,14 +6305,14 @@
59266305 .rpc_resp = res,
59276306 .rpc_cred = cred,
59286307 };
5929
- struct rpc_task *task;
59306308 struct rpc_task_setup task_setup_data = {
59316309 .rpc_client = clp->cl_rpcclient,
59326310 .rpc_message = &msg,
59336311 .callback_ops = &nfs4_setclientid_ops,
59346312 .callback_data = &setclientid,
5935
- .flags = RPC_TASK_TIMEOUT,
6313
+ .flags = RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN,
59366314 };
6315
+ unsigned long now = jiffies;
59376316 int status;
59386317
59396318 /* nfs_client_id4 */
....@@ -5959,18 +6338,16 @@
59596338 dprintk("NFS call setclientid auth=%s, '%s'\n",
59606339 clp->cl_rpcclient->cl_auth->au_ops->au_name,
59616340 clp->cl_owner_id);
5962
- task = rpc_run_task(&task_setup_data);
5963
- if (IS_ERR(task)) {
5964
- status = PTR_ERR(task);
5965
- goto out;
5966
- }
5967
- status = task->tk_status;
6341
+
6342
+ status = nfs4_call_sync_custom(&task_setup_data);
59686343 if (setclientid.sc_cred) {
59696344 kfree(clp->cl_acceptor);
59706345 clp->cl_acceptor = rpcauth_stringify_acceptor(setclientid.sc_cred);
59716346 put_rpccred(setclientid.sc_cred);
59726347 }
5973
- rpc_put_task(task);
6348
+
6349
+ if (status == 0)
6350
+ do_renew_lease(clp, now);
59746351 out:
59756352 trace_nfs4_setclientid(clp, status);
59766353 dprintk("NFS reply setclientid: %d\n", status);
....@@ -5980,14 +6357,14 @@
59806357 /**
59816358 * nfs4_proc_setclientid_confirm - Confirm client ID
59826359 * @clp: state data structure
5983
- * @res: result of a previous SETCLIENTID
5984
- * @cred: RPC credential to use for this call
6360
+ * @arg: result of a previous SETCLIENTID
6361
+ * @cred: credential to use for this call
59856362 *
59866363 * Returns zero, a negative errno, or a negative NFS4ERR status code.
59876364 */
59886365 int nfs4_proc_setclientid_confirm(struct nfs_client *clp,
59896366 struct nfs4_setclientid_res *arg,
5990
- struct rpc_cred *cred)
6367
+ const struct cred *cred)
59916368 {
59926369 struct rpc_message msg = {
59936370 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID_CONFIRM],
....@@ -5999,7 +6376,8 @@
59996376 dprintk("NFS call setclientid_confirm auth=%s, (client ID %llx)\n",
60006377 clp->cl_rpcclient->cl_auth->au_ops->au_name,
60016378 clp->cl_clientid);
6002
- status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
6379
+ status = rpc_call_sync(clp->cl_rpcclient, &msg,
6380
+ RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN);
60036381 trace_nfs4_setclientid_confirm(clp, status);
60046382 dprintk("NFS reply setclientid_confirm: %d\n", status);
60056383 return status;
....@@ -6038,32 +6416,9 @@
60386416 trace_nfs4_delegreturn_exit(&data->args, &data->res, task->tk_status);
60396417
60406418 /* Handle Layoutreturn errors */
6041
- if (data->args.lr_args && task->tk_status != 0) {
6042
- switch(data->res.lr_ret) {
6043
- default:
6044
- data->res.lr_ret = -NFS4ERR_NOMATCHING_LAYOUT;
6045
- break;
6046
- case 0:
6047
- data->args.lr_args = NULL;
6048
- data->res.lr_res = NULL;
6049
- break;
6050
- case -NFS4ERR_OLD_STATEID:
6051
- if (nfs4_layoutreturn_refresh_stateid(&data->args.lr_args->stateid,
6052
- &data->args.lr_args->range,
6053
- data->inode))
6054
- goto lr_restart;
6055
- /* Fallthrough */
6056
- case -NFS4ERR_ADMIN_REVOKED:
6057
- case -NFS4ERR_DELEG_REVOKED:
6058
- case -NFS4ERR_EXPIRED:
6059
- case -NFS4ERR_BAD_STATEID:
6060
- case -NFS4ERR_UNKNOWN_LAYOUTTYPE:
6061
- case -NFS4ERR_WRONG_CRED:
6062
- data->args.lr_args = NULL;
6063
- data->res.lr_res = NULL;
6064
- goto lr_restart;
6065
- }
6066
- }
6419
+ if (pnfs_roc_done(task, &data->args.lr_args, &data->res.lr_res,
6420
+ &data->res.lr_ret) == -EAGAIN)
6421
+ goto out_restart;
60676422
60686423 switch (task->tk_status) {
60696424 case 0:
....@@ -6075,23 +6430,27 @@
60756430 nfs4_free_revoked_stateid(data->res.server,
60766431 data->args.stateid,
60776432 task->tk_msg.rpc_cred);
6078
- /* Fallthrough */
6433
+ fallthrough;
60796434 case -NFS4ERR_BAD_STATEID:
60806435 case -NFS4ERR_STALE_STATEID:
6436
+ case -ETIMEDOUT:
60816437 task->tk_status = 0;
60826438 break;
60836439 case -NFS4ERR_OLD_STATEID:
6084
- if (nfs4_refresh_delegation_stateid(&data->stateid, data->inode))
6085
- goto out_restart;
6086
- task->tk_status = 0;
6087
- break;
6440
+ if (!nfs4_refresh_delegation_stateid(&data->stateid, data->inode))
6441
+ nfs4_stateid_seqid_inc(&data->stateid);
6442
+ if (data->args.bitmask) {
6443
+ data->args.bitmask = NULL;
6444
+ data->res.fattr = NULL;
6445
+ }
6446
+ goto out_restart;
60886447 case -NFS4ERR_ACCESS:
60896448 if (data->args.bitmask) {
60906449 data->args.bitmask = NULL;
60916450 data->res.fattr = NULL;
60926451 goto out_restart;
60936452 }
6094
- /* Fallthrough */
6453
+ fallthrough;
60956454 default:
60966455 task->tk_status = nfs4_async_handle_exception(task,
60976456 data->res.server, task->tk_status,
....@@ -6099,10 +6458,9 @@
60996458 if (exception.retry)
61006459 goto out_restart;
61016460 }
6461
+ nfs_delegation_mark_returned(data->inode, data->args.stateid);
61026462 data->rpc_status = task->tk_status;
61036463 return;
6104
-lr_restart:
6105
- data->res.lr_ret = 0;
61066464 out_restart:
61076465 task->tk_status = 0;
61086466 rpc_restart_call_prepare(task);
....@@ -6113,11 +6471,13 @@
61136471 struct nfs4_delegreturndata *data = calldata;
61146472 struct inode *inode = data->inode;
61156473
6474
+ if (data->lr.roc)
6475
+ pnfs_roc_release(&data->lr.arg, &data->lr.res,
6476
+ data->res.lr_ret);
61166477 if (inode) {
6117
- if (data->lr.roc)
6118
- pnfs_roc_release(&data->lr.arg, &data->lr.res,
6119
- data->res.lr_ret);
6120
- nfs_post_op_update_inode_force_wcc(inode, &data->fattr);
6478
+ nfs4_fattr_set_prechange(&data->fattr,
6479
+ inode_peek_iversion_raw(inode));
6480
+ nfs_refresh_inode(inode, &data->fattr);
61216481 nfs_iput_and_deactive(inode);
61226482 }
61236483 kfree(calldata);
....@@ -6153,7 +6513,7 @@
61536513 .rpc_release = nfs4_delegreturn_release,
61546514 };
61556515
6156
-static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync)
6516
+static int _nfs4_proc_delegreturn(struct inode *inode, const struct cred *cred, const nfs4_stateid *stateid, int issync)
61576517 {
61586518 struct nfs4_delegreturndata *data;
61596519 struct nfs_server *server = NFS_SERVER(inode);
....@@ -6166,7 +6526,7 @@
61666526 .rpc_client = server->client,
61676527 .rpc_message = &msg,
61686528 .callback_ops = &nfs4_delegreturn_ops,
6169
- .flags = RPC_TASK_ASYNC,
6529
+ .flags = RPC_TASK_ASYNC | RPC_TASK_TIMEOUT,
61706530 };
61716531 int status = 0;
61726532
....@@ -6180,7 +6540,10 @@
61806540
61816541 data->args.fhandle = &data->fh;
61826542 data->args.stateid = &data->stateid;
6183
- data->args.bitmask = server->cache_consistency_bitmask;
6543
+ nfs4_bitmask_set(data->args.bitmask_store,
6544
+ server->cache_consistency_bitmask, inode, server,
6545
+ NULL);
6546
+ data->args.bitmask = data->args.bitmask_store;
61846547 nfs_copy_fh(&data->fh, NFS_FH(inode));
61856548 nfs4_stateid_copy(&data->stateid, stateid);
61866549 data->res.fattr = &data->fattr;
....@@ -6190,16 +6553,14 @@
61906553 nfs_fattr_init(data->res.fattr);
61916554 data->timestamp = jiffies;
61926555 data->rpc_status = 0;
6193
- data->lr.roc = pnfs_roc(inode, &data->lr.arg, &data->lr.res, cred);
61946556 data->inode = nfs_igrab_and_active(inode);
6195
- if (data->inode) {
6557
+ if (data->inode || issync) {
6558
+ data->lr.roc = pnfs_roc(inode, &data->lr.arg, &data->lr.res,
6559
+ cred);
61966560 if (data->lr.roc) {
61976561 data->args.lr_args = &data->lr.arg;
61986562 data->res.lr_res = &data->lr.res;
61996563 }
6200
- } else if (data->lr.roc) {
6201
- pnfs_roc_release(&data->lr.arg, &data->lr.res, 0);
6202
- data->lr.roc = false;
62036564 }
62046565
62056566 if (!data->inode)
....@@ -6225,7 +6586,7 @@
62256586 return status;
62266587 }
62276588
6228
-int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync)
6589
+int nfs4_proc_delegreturn(struct inode *inode, const struct cred *cred, const nfs4_stateid *stateid, int issync)
62296590 {
62306591 struct nfs_server *server = NFS_SERVER(inode);
62316592 struct nfs4_exception exception = { };
....@@ -6288,7 +6649,9 @@
62886649
62896650 static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
62906651 {
6291
- struct nfs4_exception exception = { };
6652
+ struct nfs4_exception exception = {
6653
+ .interruptible = true,
6654
+ };
62926655 int err;
62936656
62946657 do {
....@@ -6298,6 +6661,42 @@
62986661 &exception);
62996662 } while (exception.retry);
63006663 return err;
6664
+}
6665
+
6666
+/*
6667
+ * Update the seqid of a lock stateid after receiving
6668
+ * NFS4ERR_OLD_STATEID
6669
+ */
6670
+static bool nfs4_refresh_lock_old_stateid(nfs4_stateid *dst,
6671
+ struct nfs4_lock_state *lsp)
6672
+{
6673
+ struct nfs4_state *state = lsp->ls_state;
6674
+ bool ret = false;
6675
+
6676
+ spin_lock(&state->state_lock);
6677
+ if (!nfs4_stateid_match_other(dst, &lsp->ls_stateid))
6678
+ goto out;
6679
+ if (!nfs4_stateid_is_newer(&lsp->ls_stateid, dst))
6680
+ nfs4_stateid_seqid_inc(dst);
6681
+ else
6682
+ dst->seqid = lsp->ls_stateid.seqid;
6683
+ ret = true;
6684
+out:
6685
+ spin_unlock(&state->state_lock);
6686
+ return ret;
6687
+}
6688
+
6689
+static bool nfs4_sync_lock_stateid(nfs4_stateid *dst,
6690
+ struct nfs4_lock_state *lsp)
6691
+{
6692
+ struct nfs4_state *state = lsp->ls_state;
6693
+ bool ret;
6694
+
6695
+ spin_lock(&state->state_lock);
6696
+ ret = !nfs4_stateid_match_other(dst, &lsp->ls_stateid);
6697
+ nfs4_stateid_copy(dst, &lsp->ls_stateid);
6698
+ spin_unlock(&state->state_lock);
6699
+ return ret;
63016700 }
63026701
63036702 struct nfs4_unlockdata {
....@@ -6317,7 +6716,8 @@
63176716 struct nfs_seqid *seqid)
63186717 {
63196718 struct nfs4_unlockdata *p;
6320
- struct inode *inode = lsp->ls_state->inode;
6719
+ struct nfs4_state *state = lsp->ls_state;
6720
+ struct inode *inode = state->inode;
63216721
63226722 p = kzalloc(sizeof(*p), GFP_NOFS);
63236723 if (p == NULL)
....@@ -6327,12 +6727,15 @@
63276727 p->arg.seqid = seqid;
63286728 p->res.seqid = seqid;
63296729 p->lsp = lsp;
6330
- refcount_inc(&lsp->ls_count);
63316730 /* Ensure we don't close file until we're done freeing locks! */
63326731 p->ctx = get_nfs_open_context(ctx);
63336732 p->l_ctx = nfs_get_lock_context(ctx);
6334
- memcpy(&p->fl, fl, sizeof(p->fl));
6733
+ locks_init_lock(&p->fl);
6734
+ locks_copy_lock(&p->fl, fl);
63356735 p->server = NFS_SERVER(inode);
6736
+ spin_lock(&state->state_lock);
6737
+ nfs4_stateid_copy(&p->arg.stateid, &lsp->ls_stateid);
6738
+ spin_unlock(&state->state_lock);
63366739 return p;
63376740 }
63386741
....@@ -6363,18 +6766,22 @@
63636766 if (nfs4_update_lock_stateid(calldata->lsp,
63646767 &calldata->res.stateid))
63656768 break;
6366
- /* Fall through */
6769
+ fallthrough;
63676770 case -NFS4ERR_ADMIN_REVOKED:
63686771 case -NFS4ERR_EXPIRED:
63696772 nfs4_free_revoked_stateid(calldata->server,
63706773 &calldata->arg.stateid,
63716774 task->tk_msg.rpc_cred);
6372
- /* Fall through */
6775
+ fallthrough;
63736776 case -NFS4ERR_BAD_STATEID:
6374
- case -NFS4ERR_OLD_STATEID:
63756777 case -NFS4ERR_STALE_STATEID:
6376
- if (!nfs4_stateid_match(&calldata->arg.stateid,
6377
- &calldata->lsp->ls_stateid))
6778
+ if (nfs4_sync_lock_stateid(&calldata->arg.stateid,
6779
+ calldata->lsp))
6780
+ rpc_restart_call_prepare(task);
6781
+ break;
6782
+ case -NFS4ERR_OLD_STATEID:
6783
+ if (nfs4_refresh_lock_old_stateid(&calldata->arg.stateid,
6784
+ calldata->lsp))
63786785 rpc_restart_call_prepare(task);
63796786 break;
63806787 default:
....@@ -6397,7 +6804,6 @@
63976804
63986805 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
63996806 goto out_wait;
6400
- nfs4_stateid_copy(&calldata->arg.stateid, &calldata->lsp->ls_stateid);
64016807 if (test_bit(NFS_LOCK_INITIALIZED, &calldata->lsp->ls_flags) == 0) {
64026808 /* Note: exit _without_ running nfs4_locku_done */
64036809 goto out_no_action;
....@@ -6551,9 +6957,9 @@
65516957 p->res.lock_seqid = p->arg.lock_seqid;
65526958 p->lsp = lsp;
65536959 p->server = server;
6554
- refcount_inc(&lsp->ls_count);
65556960 p->ctx = get_nfs_open_context(ctx);
6556
- memcpy(&p->fl, fl, sizeof(p->fl));
6961
+ locks_init_lock(&p->fl);
6962
+ locks_copy_lock(&p->fl, fl);
65576963 return p;
65586964 out_free_seqid:
65596965 nfs_free_seqid(p->arg.open_seqid);
....@@ -6608,6 +7014,7 @@
66087014 {
66097015 struct nfs4_lockdata *data = calldata;
66107016 struct nfs4_lock_state *lsp = data->lsp;
7017
+ struct nfs_server *server = NFS_SERVER(d_inode(data->ctx->dentry));
66117018
66127019 dprintk("%s: begin!\n", __func__);
66137020
....@@ -6617,8 +7024,7 @@
66177024 data->rpc_status = task->tk_status;
66187025 switch (task->tk_status) {
66197026 case 0:
6620
- renew_lease(NFS_SERVER(d_inode(data->ctx->dentry)),
6621
- data->timestamp);
7027
+ renew_lease(server, data->timestamp);
66227028 if (data->arg.new_lock && !data->cancelled) {
66237029 data->fl.fl_flags &= ~(FL_SLEEP | FL_ACCESS);
66247030 if (locks_lock_inode_wait(lsp->ls_state->inode, &data->fl) < 0)
....@@ -6638,6 +7044,8 @@
66387044 if (data->arg.new_lock_owner != 0) {
66397045 if (!nfs4_stateid_match(&data->arg.open_stateid,
66407046 &lsp->ls_state->open_stateid))
7047
+ goto out_restart;
7048
+ else if (nfs4_async_handle_error(task, server, lsp->ls_state, NULL) == -EAGAIN)
66417049 goto out_restart;
66427050 } else if (!nfs4_stateid_match(&data->arg.lock_stateid,
66437051 &lsp->ls_stateid))
....@@ -6693,7 +7101,7 @@
66937101 case -NFS4ERR_STALE_STATEID:
66947102 lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED;
66957103 nfs4_schedule_lease_recovery(server->nfs_client);
6696
- };
7104
+ }
66977105 }
66987106
66997107 static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int recovery_type)
....@@ -6709,7 +7117,7 @@
67097117 .rpc_message = &msg,
67107118 .callback_ops = &nfs4_lock_ops,
67117119 .workqueue = nfsiod_workqueue,
6712
- .flags = RPC_TASK_ASYNC,
7120
+ .flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF,
67137121 };
67147122 int ret;
67157123
....@@ -6852,6 +7260,7 @@
68527260 struct nfs4_exception exception = {
68537261 .state = state,
68547262 .inode = state->inode,
7263
+ .interruptible = true,
68557264 };
68567265 int err;
68577266
....@@ -7136,7 +7545,8 @@
71367545
71377546 static int nfs4_xattr_get_nfs4_acl(const struct xattr_handler *handler,
71387547 struct dentry *unused, struct inode *inode,
7139
- const char *key, void *buf, size_t buflen)
7548
+ const char *key, void *buf, size_t buflen,
7549
+ int flags)
71407550 {
71417551 return nfs4_proc_get_acl(inode, buf, buflen);
71427552 }
....@@ -7161,7 +7571,8 @@
71617571
71627572 static int nfs4_xattr_get_nfs4_label(const struct xattr_handler *handler,
71637573 struct dentry *unused, struct inode *inode,
7164
- const char *key, void *buf, size_t buflen)
7574
+ const char *key, void *buf, size_t buflen,
7575
+ int flags)
71657576 {
71667577 if (security_ismaclabel(key))
71677578 return nfs4_get_security_label(inode, buf, buflen);
....@@ -7175,7 +7586,7 @@
71757586
71767587 if (nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL)) {
71777588 len = security_inode_listsecurity(inode, list, list_len);
7178
- if (list_len && len > list_len)
7589
+ if (len >= 0 && list_len && len > list_len)
71797590 return -ERANGE;
71807591 }
71817592 return len;
....@@ -7196,6 +7607,134 @@
71967607 }
71977608
71987609 #endif
7610
+
7611
+#ifdef CONFIG_NFS_V4_2
7612
+static int nfs4_xattr_set_nfs4_user(const struct xattr_handler *handler,
7613
+ struct dentry *unused, struct inode *inode,
7614
+ const char *key, const void *buf,
7615
+ size_t buflen, int flags)
7616
+{
7617
+ u32 mask;
7618
+ int ret;
7619
+
7620
+ if (!nfs_server_capable(inode, NFS_CAP_XATTR))
7621
+ return -EOPNOTSUPP;
7622
+
7623
+ /*
7624
+ * There is no mapping from the MAY_* flags to the NFS_ACCESS_XA*
7625
+ * flags right now. Handling of xattr operations use the normal
7626
+ * file read/write permissions.
7627
+ *
7628
+ * Just in case the server has other ideas (which RFC 8276 allows),
7629
+ * do a cached access check for the XA* flags to possibly avoid
7630
+ * doing an RPC and getting EACCES back.
7631
+ */
7632
+ if (!nfs_access_get_cached(inode, current_cred(), &mask, true)) {
7633
+ if (!(mask & NFS_ACCESS_XAWRITE))
7634
+ return -EACCES;
7635
+ }
7636
+
7637
+ if (buf == NULL) {
7638
+ ret = nfs42_proc_removexattr(inode, key);
7639
+ if (!ret)
7640
+ nfs4_xattr_cache_remove(inode, key);
7641
+ } else {
7642
+ ret = nfs42_proc_setxattr(inode, key, buf, buflen, flags);
7643
+ if (!ret)
7644
+ nfs4_xattr_cache_add(inode, key, buf, NULL, buflen);
7645
+ }
7646
+
7647
+ return ret;
7648
+}
7649
+
7650
+static int nfs4_xattr_get_nfs4_user(const struct xattr_handler *handler,
7651
+ struct dentry *unused, struct inode *inode,
7652
+ const char *key, void *buf, size_t buflen,
7653
+ int flags)
7654
+{
7655
+ u32 mask;
7656
+ ssize_t ret;
7657
+
7658
+ if (!nfs_server_capable(inode, NFS_CAP_XATTR))
7659
+ return -EOPNOTSUPP;
7660
+
7661
+ if (!nfs_access_get_cached(inode, current_cred(), &mask, true)) {
7662
+ if (!(mask & NFS_ACCESS_XAREAD))
7663
+ return -EACCES;
7664
+ }
7665
+
7666
+ ret = nfs_revalidate_inode(NFS_SERVER(inode), inode);
7667
+ if (ret)
7668
+ return ret;
7669
+
7670
+ ret = nfs4_xattr_cache_get(inode, key, buf, buflen);
7671
+ if (ret >= 0 || (ret < 0 && ret != -ENOENT))
7672
+ return ret;
7673
+
7674
+ ret = nfs42_proc_getxattr(inode, key, buf, buflen);
7675
+
7676
+ return ret;
7677
+}
7678
+
7679
+static ssize_t
7680
+nfs4_listxattr_nfs4_user(struct inode *inode, char *list, size_t list_len)
7681
+{
7682
+ u64 cookie;
7683
+ bool eof;
7684
+ ssize_t ret, size;
7685
+ char *buf;
7686
+ size_t buflen;
7687
+ u32 mask;
7688
+
7689
+ if (!nfs_server_capable(inode, NFS_CAP_XATTR))
7690
+ return 0;
7691
+
7692
+ if (!nfs_access_get_cached(inode, current_cred(), &mask, true)) {
7693
+ if (!(mask & NFS_ACCESS_XALIST))
7694
+ return 0;
7695
+ }
7696
+
7697
+ ret = nfs_revalidate_inode(NFS_SERVER(inode), inode);
7698
+ if (ret)
7699
+ return ret;
7700
+
7701
+ ret = nfs4_xattr_cache_list(inode, list, list_len);
7702
+ if (ret >= 0 || (ret < 0 && ret != -ENOENT))
7703
+ return ret;
7704
+
7705
+ cookie = 0;
7706
+ eof = false;
7707
+ buflen = list_len ? list_len : XATTR_LIST_MAX;
7708
+ buf = list_len ? list : NULL;
7709
+ size = 0;
7710
+
7711
+ while (!eof) {
7712
+ ret = nfs42_proc_listxattrs(inode, buf, buflen,
7713
+ &cookie, &eof);
7714
+ if (ret < 0)
7715
+ return ret;
7716
+
7717
+ if (list_len) {
7718
+ buf += ret;
7719
+ buflen -= ret;
7720
+ }
7721
+ size += ret;
7722
+ }
7723
+
7724
+ if (list_len)
7725
+ nfs4_xattr_cache_set_list(inode, list, size);
7726
+
7727
+ return size;
7728
+}
7729
+
7730
+#else
7731
+
7732
+static ssize_t
7733
+nfs4_listxattr_nfs4_user(struct inode *inode, char *list, size_t list_len)
7734
+{
7735
+ return 0;
7736
+}
7737
+#endif /* CONFIG_NFS_V4_2 */
71997738
72007739 /*
72017740 * nfs_fhget will use either the mounted_on_fileid or the fileid
....@@ -7262,7 +7801,9 @@
72627801 struct nfs4_fs_locations *fs_locations,
72637802 struct page *page)
72647803 {
7265
- struct nfs4_exception exception = { };
7804
+ struct nfs4_exception exception = {
7805
+ .interruptible = true,
7806
+ };
72667807 int err;
72677808 do {
72687809 err = _nfs4_proc_fs_locations(client, dir, name,
....@@ -7283,7 +7824,7 @@
72837824 */
72847825 static int _nfs40_proc_get_locations(struct inode *inode,
72857826 struct nfs4_fs_locations *locations,
7286
- struct page *page, struct rpc_cred *cred)
7827
+ struct page *page, const struct cred *cred)
72877828 {
72887829 struct nfs_server *server = NFS_SERVER(inode);
72897830 struct rpc_clnt *clnt = server->client;
....@@ -7340,7 +7881,7 @@
73407881 */
73417882 static int _nfs41_proc_get_locations(struct inode *inode,
73427883 struct nfs4_fs_locations *locations,
7343
- struct page *page, struct rpc_cred *cred)
7884
+ struct page *page, const struct cred *cred)
73447885 {
73457886 struct nfs_server *server = NFS_SERVER(inode);
73467887 struct rpc_clnt *clnt = server->client;
....@@ -7399,13 +7940,15 @@
73997940 */
74007941 int nfs4_proc_get_locations(struct inode *inode,
74017942 struct nfs4_fs_locations *locations,
7402
- struct page *page, struct rpc_cred *cred)
7943
+ struct page *page, const struct cred *cred)
74037944 {
74047945 struct nfs_server *server = NFS_SERVER(inode);
74057946 struct nfs_client *clp = server->nfs_client;
74067947 const struct nfs4_mig_recovery_ops *ops =
74077948 clp->cl_mvops->mig_recovery_ops;
7408
- struct nfs4_exception exception = { };
7949
+ struct nfs4_exception exception = {
7950
+ .interruptible = true,
7951
+ };
74097952 int status;
74107953
74117954 dprintk("%s: FSID %llx:%llx on \"%s\"\n", __func__,
....@@ -7430,7 +7973,7 @@
74307973 * is appended to this compound to identify the client ID which is
74317974 * performing recovery.
74327975 */
7433
-static int _nfs40_proc_fsid_present(struct inode *inode, struct rpc_cred *cred)
7976
+static int _nfs40_proc_fsid_present(struct inode *inode, const struct cred *cred)
74347977 {
74357978 struct nfs_server *server = NFS_SERVER(inode);
74367979 struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
....@@ -7476,7 +8019,7 @@
74768019 * this operation is identified in the SEQUENCE operation in this
74778020 * compound.
74788021 */
7479
-static int _nfs41_proc_fsid_present(struct inode *inode, struct rpc_cred *cred)
8022
+static int _nfs41_proc_fsid_present(struct inode *inode, const struct cred *cred)
74808023 {
74818024 struct nfs_server *server = NFS_SERVER(inode);
74828025 struct rpc_clnt *clnt = server->client;
....@@ -7523,13 +8066,15 @@
75238066 * NFS4ERR code if some error occurred on the server, or a
75248067 * negative errno if a local failure occurred.
75258068 */
7526
-int nfs4_proc_fsid_present(struct inode *inode, struct rpc_cred *cred)
8069
+int nfs4_proc_fsid_present(struct inode *inode, const struct cred *cred)
75278070 {
75288071 struct nfs_server *server = NFS_SERVER(inode);
75298072 struct nfs_client *clp = server->nfs_client;
75308073 const struct nfs4_mig_recovery_ops *ops =
75318074 clp->cl_mvops->mig_recovery_ops;
7532
- struct nfs4_exception exception = { };
8075
+ struct nfs4_exception exception = {
8076
+ .interruptible = true,
8077
+ };
75338078 int status;
75348079
75358080 dprintk("%s: FSID %llx:%llx on \"%s\"\n", __func__,
....@@ -7547,7 +8092,7 @@
75478092 return status;
75488093 }
75498094
7550
-/**
8095
+/*
75518096 * If 'use_integrity' is true and the state managment nfs_client
75528097 * cl_rpcclient is using krb5i/p, use the integrity protected cl_rpcclient
75538098 * and the machine credential as per RFC3530bis and RFC5661 Security
....@@ -7557,6 +8102,8 @@
75578102 static int _nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct nfs4_secinfo_flavors *flavors, bool use_integrity)
75588103 {
75598104 int status;
8105
+ struct rpc_clnt *clnt = NFS_SERVER(dir)->client;
8106
+ struct nfs_client *clp = NFS_SERVER(dir)->nfs_client;
75608107 struct nfs4_secinfo_arg args = {
75618108 .dir_fh = NFS_FH(dir),
75628109 .name = name,
....@@ -7569,34 +8116,46 @@
75698116 .rpc_argp = &args,
75708117 .rpc_resp = &res,
75718118 };
7572
- struct rpc_clnt *clnt = NFS_SERVER(dir)->client;
7573
- struct rpc_cred *cred = NULL;
8119
+ struct nfs4_call_sync_data data = {
8120
+ .seq_server = NFS_SERVER(dir),
8121
+ .seq_args = &args.seq_args,
8122
+ .seq_res = &res.seq_res,
8123
+ };
8124
+ struct rpc_task_setup task_setup = {
8125
+ .rpc_client = clnt,
8126
+ .rpc_message = &msg,
8127
+ .callback_ops = clp->cl_mvops->call_sync_ops,
8128
+ .callback_data = &data,
8129
+ .flags = RPC_TASK_NO_ROUND_ROBIN,
8130
+ };
8131
+ const struct cred *cred = NULL;
75748132
75758133 if (use_integrity) {
7576
- clnt = NFS_SERVER(dir)->nfs_client->cl_rpcclient;
7577
- cred = nfs4_get_clid_cred(NFS_SERVER(dir)->nfs_client);
8134
+ clnt = clp->cl_rpcclient;
8135
+ task_setup.rpc_client = clnt;
8136
+
8137
+ cred = nfs4_get_clid_cred(clp);
75788138 msg.rpc_cred = cred;
75798139 }
75808140
75818141 dprintk("NFS call secinfo %s\n", name->name);
75828142
7583
- nfs4_state_protect(NFS_SERVER(dir)->nfs_client,
7584
- NFS_SP4_MACH_CRED_SECINFO, &clnt, &msg);
8143
+ nfs4_state_protect(clp, NFS_SP4_MACH_CRED_SECINFO, &clnt, &msg);
8144
+ nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
8145
+ status = nfs4_call_sync_custom(&task_setup);
75858146
7586
- status = nfs4_call_sync(clnt, NFS_SERVER(dir), &msg, &args.seq_args,
7587
- &res.seq_res, 0);
75888147 dprintk("NFS reply secinfo: %d\n", status);
75898148
7590
- if (cred)
7591
- put_rpccred(cred);
7592
-
8149
+ put_cred(cred);
75938150 return status;
75948151 }
75958152
75968153 int nfs4_proc_secinfo(struct inode *dir, const struct qstr *name,
75978154 struct nfs4_secinfo_flavors *flavors)
75988155 {
7599
- struct nfs4_exception exception = { };
8156
+ struct nfs4_exception exception = {
8157
+ .interruptible = true,
8158
+ };
76008159 int err;
76018160 do {
76028161 err = -NFS4ERR_WRONGSEC;
....@@ -7655,6 +8214,23 @@
76558214 static void
76568215 nfs4_bind_one_conn_to_session_done(struct rpc_task *task, void *calldata)
76578216 {
8217
+ struct nfs41_bind_conn_to_session_args *args = task->tk_msg.rpc_argp;
8218
+ struct nfs41_bind_conn_to_session_res *res = task->tk_msg.rpc_resp;
8219
+ struct nfs_client *clp = args->client;
8220
+
8221
+ switch (task->tk_status) {
8222
+ case -NFS4ERR_BADSESSION:
8223
+ case -NFS4ERR_DEADSESSION:
8224
+ nfs4_schedule_session_recovery(clp->cl_session,
8225
+ task->tk_status);
8226
+ return;
8227
+ }
8228
+ if (args->dir == NFS4_CDFC4_FORE_OR_BOTH &&
8229
+ res->dir != NFS4_CDFS4_BOTH) {
8230
+ rpc_task_close_connection(task);
8231
+ if (args->retries++ < MAX_BIND_CONN_TO_SESSION_RETRIES)
8232
+ rpc_restart_call(task);
8233
+ }
76588234 }
76598235
76608236 static const struct rpc_call_ops nfs4_bind_one_conn_to_session_ops = {
....@@ -7671,12 +8247,13 @@
76718247 int nfs4_proc_bind_one_conn_to_session(struct rpc_clnt *clnt,
76728248 struct rpc_xprt *xprt,
76738249 struct nfs_client *clp,
7674
- struct rpc_cred *cred)
8250
+ const struct cred *cred)
76758251 {
76768252 int status;
76778253 struct nfs41_bind_conn_to_session_args args = {
76788254 .client = clp,
76798255 .dir = NFS4_CDFC4_FORE_OR_BOTH,
8256
+ .retries = 0,
76808257 };
76818258 struct nfs41_bind_conn_to_session_res res;
76828259 struct rpc_message msg = {
....@@ -7733,7 +8310,7 @@
77338310
77348311 struct rpc_bind_conn_calldata {
77358312 struct nfs_client *clp;
7736
- struct rpc_cred *cred;
8313
+ const struct cred *cred;
77378314 };
77388315
77398316 static int
....@@ -7746,7 +8323,7 @@
77468323 return nfs4_proc_bind_one_conn_to_session(clnt, xprt, p->clp, p->cred);
77478324 }
77488325
7749
-int nfs4_proc_bind_conn_to_session(struct nfs_client *clp, struct rpc_cred *cred)
8326
+int nfs4_proc_bind_conn_to_session(struct nfs_client *clp, const struct cred *cred)
77508327 {
77518328 struct rpc_bind_conn_calldata data = {
77528329 .clp = clp,
....@@ -7912,7 +8489,7 @@
79128489 * Wrapper for EXCHANGE_ID operation.
79138490 */
79148491 static struct rpc_task *
7915
-nfs4_run_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
8492
+nfs4_run_exchange_id(struct nfs_client *clp, const struct cred *cred,
79168493 u32 sp4_how, struct rpc_xprt *xprt)
79178494 {
79188495 struct rpc_message msg = {
....@@ -7923,7 +8500,7 @@
79238500 .rpc_client = clp->cl_rpcclient,
79248501 .callback_ops = &nfs4_exchange_id_call_ops,
79258502 .rpc_message = &msg,
7926
- .flags = RPC_TASK_TIMEOUT,
8503
+ .flags = RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN,
79278504 };
79288505 struct nfs41_exchange_id_data *calldata;
79298506 int status;
....@@ -8008,12 +8585,13 @@
80088585 *
80098586 * Wrapper for EXCHANGE_ID operation.
80108587 */
8011
-static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
8588
+static int _nfs4_proc_exchange_id(struct nfs_client *clp, const struct cred *cred,
80128589 u32 sp4_how)
80138590 {
80148591 struct rpc_task *task;
80158592 struct nfs41_exchange_id_args *argp;
80168593 struct nfs41_exchange_id_res *resp;
8594
+ unsigned long now = jiffies;
80178595 int status;
80188596
80198597 task = nfs4_run_exchange_id(clp, cred, sp4_how, NULL);
....@@ -8034,6 +8612,8 @@
80348612 status = nfs4_sp4_select_mode(clp, &resp->state_protect);
80358613 if (status != 0)
80368614 goto out;
8615
+
8616
+ do_renew_lease(clp, now);
80378617
80388618 clp->cl_clientid = resp->clientid;
80398619 clp->cl_exchange_flags = resp->flags;
....@@ -8076,7 +8656,7 @@
80768656 *
80778657 * Will attempt to negotiate SP4_MACH_CRED if krb5i / krb5p auth is used.
80788658 */
8079
-int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
8659
+int nfs4_proc_exchange_id(struct nfs_client *clp, const struct cred *cred)
80808660 {
80818661 rpc_authflavor_t authflavor = clp->cl_rpcclient->cl_auth->au_flavor;
80828662 int status;
....@@ -8108,7 +8688,7 @@
81088688 * @xprt: the rpc_xprt to test
81098689 * @data: call data for _nfs4_proc_exchange_id.
81108690 */
8111
-int nfs4_test_session_trunk(struct rpc_clnt *clnt, struct rpc_xprt *xprt,
8691
+void nfs4_test_session_trunk(struct rpc_clnt *clnt, struct rpc_xprt *xprt,
81128692 void *data)
81138693 {
81148694 struct nfs4_add_xprt_data *adata = (struct nfs4_add_xprt_data *)data;
....@@ -8125,20 +8705,22 @@
81258705 /* Test connection for session trunking. Async exchange_id call */
81268706 task = nfs4_run_exchange_id(adata->clp, adata->cred, sp4_how, xprt);
81278707 if (IS_ERR(task))
8128
- return PTR_ERR(task);
8708
+ return;
81298709
81308710 status = task->tk_status;
81318711 if (status == 0)
81328712 status = nfs4_detect_session_trunking(adata->clp,
81338713 task->tk_msg.rpc_resp, xprt);
81348714
8715
+ if (status == 0)
8716
+ rpc_clnt_xprt_switch_add_xprt(clnt, xprt);
8717
+
81358718 rpc_put_task(task);
8136
- return status;
81378719 }
81388720 EXPORT_SYMBOL_GPL(nfs4_test_session_trunk);
81398721
81408722 static int _nfs4_proc_destroy_clientid(struct nfs_client *clp,
8141
- struct rpc_cred *cred)
8723
+ const struct cred *cred)
81428724 {
81438725 struct rpc_message msg = {
81448726 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DESTROY_CLIENTID],
....@@ -8147,7 +8729,8 @@
81478729 };
81488730 int status;
81498731
8150
- status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
8732
+ status = rpc_call_sync(clp->cl_rpcclient, &msg,
8733
+ RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN);
81518734 trace_nfs4_destroy_clientid(clp, status);
81528735 if (status)
81538736 dprintk("NFS: Got error %d from the server %s on "
....@@ -8156,7 +8739,7 @@
81568739 }
81578740
81588741 static int nfs4_proc_destroy_clientid(struct nfs_client *clp,
8159
- struct rpc_cred *cred)
8742
+ const struct cred *cred)
81608743 {
81618744 unsigned int loop;
81628745 int ret;
....@@ -8177,7 +8760,7 @@
81778760
81788761 int nfs4_destroy_clientid(struct nfs_client *clp)
81798762 {
8180
- struct rpc_cred *cred;
8763
+ const struct cred *cred;
81818764 int ret = 0;
81828765
81838766 if (clp->cl_mvops->minor_version < 1)
....@@ -8188,8 +8771,7 @@
81888771 goto out;
81898772 cred = nfs4_get_clid_cred(clp);
81908773 ret = nfs4_proc_destroy_clientid(clp, cred);
8191
- if (cred)
8192
- put_rpccred(cred);
8774
+ put_cred(cred);
81938775 switch (ret) {
81948776 case 0:
81958777 case -NFS4ERR_STALE_CLIENTID:
....@@ -8198,6 +8780,8 @@
81988780 out:
81998781 return ret;
82008782 }
8783
+
8784
+#endif /* CONFIG_NFS_V4_1 */
82018785
82028786 struct nfs4_get_lease_time_data {
82038787 struct nfs4_get_lease_time_args *args;
....@@ -8231,7 +8815,7 @@
82318815 (struct nfs4_get_lease_time_data *)calldata;
82328816
82338817 dprintk("--> %s\n", __func__);
8234
- if (!nfs41_sequence_done(task, &data->res->lr_seq_res))
8818
+ if (!nfs4_sequence_done(task, &data->res->lr_seq_res))
82358819 return;
82368820 switch (task->tk_status) {
82378821 case -NFS4ERR_DELAY:
....@@ -8239,7 +8823,7 @@
82398823 dprintk("%s Retry: tk_status %d\n", __func__, task->tk_status);
82408824 rpc_delay(task, NFS4_POLL_RETRY_MIN);
82418825 task->tk_status = 0;
8242
- /* fall through */
8826
+ fallthrough;
82438827 case -NFS4ERR_RETRY_UNCACHED_REP:
82448828 rpc_restart_call_prepare(task);
82458829 return;
....@@ -8254,7 +8838,6 @@
82548838
82558839 int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo)
82568840 {
8257
- struct rpc_task *task;
82588841 struct nfs4_get_lease_time_args args;
82598842 struct nfs4_get_lease_time_res res = {
82608843 .lr_fsinfo = fsinfo,
....@@ -8276,18 +8859,12 @@
82768859 .callback_data = &data,
82778860 .flags = RPC_TASK_TIMEOUT,
82788861 };
8279
- int status;
82808862
82818863 nfs4_init_sequence(&args.la_seq_args, &res.lr_seq_res, 0, 1);
8282
- task = rpc_run_task(&task_setup);
8283
-
8284
- if (IS_ERR(task))
8285
- return PTR_ERR(task);
8286
-
8287
- status = task->tk_status;
8288
- rpc_put_task(task);
8289
- return status;
8864
+ return nfs4_call_sync_custom(&task_setup);
82908865 }
8866
+
8867
+#ifdef CONFIG_NFS_V4_1
82918868
82928869 /*
82938870 * Initialize the values to be used by the client in CREATE_SESSION
....@@ -8303,6 +8880,7 @@
83038880 {
83048881 unsigned int max_rqst_sz, max_resp_sz;
83058882 unsigned int max_bc_payload = rpc_max_bc_payload(clnt);
8883
+ unsigned int max_bc_slots = rpc_num_bc_slots(clnt);
83068884
83078885 max_rqst_sz = NFS_MAX_FILE_IO_SIZE + nfs41_maxwrite_overhead;
83088886 max_resp_sz = NFS_MAX_FILE_IO_SIZE + nfs41_maxread_overhead;
....@@ -8325,6 +8903,8 @@
83258903 args->bc_attrs.max_resp_sz_cached = 0;
83268904 args->bc_attrs.max_ops = NFS4_MAX_BACK_CHANNEL_OPS;
83278905 args->bc_attrs.max_reqs = max_t(unsigned short, max_session_cb_slots, 1);
8906
+ if (args->bc_attrs.max_reqs > max_bc_slots)
8907
+ args->bc_attrs.max_reqs = max_bc_slots;
83288908
83298909 dprintk("%s: Back Channel : max_rqst_sz=%u max_resp_sz=%u "
83308910 "max_resp_sz_cached=%u max_ops=%u max_reqs=%u\n",
....@@ -8405,7 +8985,7 @@
84058985 }
84068986
84078987 static int _nfs4_proc_create_session(struct nfs_client *clp,
8408
- struct rpc_cred *cred)
8988
+ const struct cred *cred)
84098989 {
84108990 struct nfs4_session *session = clp->cl_session;
84118991 struct nfs41_create_session_args args = {
....@@ -8427,7 +9007,8 @@
84279007 nfs4_init_channel_attrs(&args, clp->cl_rpcclient);
84289008 args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN);
84299009
8430
- status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
9010
+ status = rpc_call_sync(session->clp->cl_rpcclient, &msg,
9011
+ RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN);
84319012 trace_nfs4_create_session(clp, status);
84329013
84339014 switch (status) {
....@@ -8437,7 +9018,7 @@
84379018 case -EACCES:
84389019 case -EAGAIN:
84399020 goto out;
8440
- };
9021
+ }
84419022
84429023 clp->cl_seqid++;
84439024 if (!status) {
....@@ -8457,7 +9038,7 @@
84579038 * It is the responsibility of the caller to verify the session is
84589039 * expired before calling this routine.
84599040 */
8460
-int nfs4_proc_create_session(struct nfs_client *clp, struct rpc_cred *cred)
9041
+int nfs4_proc_create_session(struct nfs_client *clp, const struct cred *cred)
84619042 {
84629043 int status;
84639044 unsigned *ptr;
....@@ -8488,7 +9069,7 @@
84889069 * The caller must serialize access to this routine.
84899070 */
84909071 int nfs4_proc_destroy_session(struct nfs4_session *session,
8491
- struct rpc_cred *cred)
9072
+ const struct cred *cred)
84929073 {
84939074 struct rpc_message msg = {
84949075 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DESTROY_SESSION],
....@@ -8503,7 +9084,8 @@
85039084 if (!test_and_clear_bit(NFS4_SESSION_ESTABLISHED, &session->session_state))
85049085 return 0;
85059086
8506
- status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
9087
+ status = rpc_call_sync(session->clp->cl_rpcclient, &msg,
9088
+ RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN);
85079089 trace_nfs4_destroy_session(session->clp, status);
85089090
85099091 if (status)
....@@ -8590,7 +9172,7 @@
85909172 };
85919173
85929174 static struct rpc_task *_nfs41_proc_sequence(struct nfs_client *clp,
8593
- struct rpc_cred *cred,
9175
+ const struct cred *cred,
85949176 struct nfs4_slot *slot,
85959177 bool is_privileged)
85969178 {
....@@ -8633,7 +9215,7 @@
86339215 return ret;
86349216 }
86359217
8636
-static int nfs41_proc_async_sequence(struct nfs_client *clp, struct rpc_cred *cred, unsigned renew_flags)
9218
+static int nfs41_proc_async_sequence(struct nfs_client *clp, const struct cred *cred, unsigned renew_flags)
86379219 {
86389220 struct rpc_task *task;
86399221 int ret = 0;
....@@ -8649,7 +9231,7 @@
86499231 return ret;
86509232 }
86519233
8652
-static int nfs4_proc_sequence(struct nfs_client *clp, struct rpc_cred *cred)
9234
+static int nfs4_proc_sequence(struct nfs_client *clp, const struct cred *cred)
86539235 {
86549236 struct rpc_task *task;
86559237 int ret;
....@@ -8689,20 +9271,21 @@
86899271 switch(task->tk_status) {
86909272 case 0:
86919273 wake_up_all(&clp->cl_lock_waitq);
8692
- /* Fallthrough */
9274
+ fallthrough;
86939275 case -NFS4ERR_COMPLETE_ALREADY:
86949276 case -NFS4ERR_WRONG_CRED: /* What to do here? */
86959277 break;
86969278 case -NFS4ERR_DELAY:
86979279 rpc_delay(task, NFS4_POLL_RETRY_MAX);
8698
- /* fall through */
9280
+ fallthrough;
86999281 case -NFS4ERR_RETRY_UNCACHED_REP:
9282
+ case -EACCES:
9283
+ dprintk("%s: failed to reclaim complete error %d for server %s, retrying\n",
9284
+ __func__, task->tk_status, clp->cl_hostname);
87009285 return -EAGAIN;
87019286 case -NFS4ERR_BADSESSION:
87029287 case -NFS4ERR_DEADSESSION:
87039288 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
8704
- nfs4_schedule_session_recovery(clp->cl_session,
8705
- task->tk_status);
87069289 break;
87079290 default:
87089291 nfs4_schedule_lease_recovery(clp);
....@@ -8745,10 +9328,9 @@
87459328 * Issue a global reclaim complete.
87469329 */
87479330 static int nfs41_proc_reclaim_complete(struct nfs_client *clp,
8748
- struct rpc_cred *cred)
9331
+ const struct cred *cred)
87499332 {
87509333 struct nfs4_reclaim_complete_data *calldata;
8751
- struct rpc_task *task;
87529334 struct rpc_message msg = {
87539335 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RECLAIM_COMPLETE],
87549336 .rpc_cred = cred,
....@@ -8757,7 +9339,7 @@
87579339 .rpc_client = clp->cl_rpcclient,
87589340 .rpc_message = &msg,
87599341 .callback_ops = &nfs4_reclaim_complete_call_ops,
8760
- .flags = RPC_TASK_ASYNC,
9342
+ .flags = RPC_TASK_NO_ROUND_ROBIN,
87619343 };
87629344 int status = -ENOMEM;
87639345
....@@ -8772,15 +9354,7 @@
87729354 msg.rpc_argp = &calldata->arg;
87739355 msg.rpc_resp = &calldata->res;
87749356 task_setup_data.callback_data = calldata;
8775
- task = rpc_run_task(&task_setup_data);
8776
- if (IS_ERR(task)) {
8777
- status = PTR_ERR(task);
8778
- goto out;
8779
- }
8780
- status = rpc_wait_for_completion_task(task);
8781
- if (status == 0)
8782
- status = task->tk_status;
8783
- rpc_put_task(task);
9357
+ status = nfs4_call_sync_custom(&task_setup_data);
87849358 out:
87859359 dprintk("<-- %s status=%d\n", __func__, status);
87869360 return status;
....@@ -8937,7 +9511,7 @@
89379511 .rpc_message = &msg,
89389512 .callback_ops = &nfs4_layoutget_call_ops,
89399513 .callback_data = lgp,
8940
- .flags = RPC_TASK_ASYNC,
9514
+ .flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF,
89419515 };
89429516 struct pnfs_layout_segment *lseg = NULL;
89439517 struct nfs4_exception exception = {
....@@ -8954,16 +9528,17 @@
89549528 nfs4_init_sequence(&lgp->args.seq_args, &lgp->res.seq_res, 0, 0);
89559529
89569530 task = rpc_run_task(&task_setup_data);
8957
- if (IS_ERR(task))
8958
- return ERR_CAST(task);
9531
+
89599532 status = rpc_wait_for_completion_task(task);
89609533 if (status != 0)
89619534 goto out;
89629535
8963
- /* if layoutp->len is 0, nfs4_layoutget_prepare called rpc_exit */
8964
- if (task->tk_status < 0 || lgp->res.layoutp->len == 0) {
9536
+ if (task->tk_status < 0) {
89659537 status = nfs4_layoutget_handle_exception(task, lgp, &exception);
89669538 *timeout = exception.timeout;
9539
+ } else if (lgp->res.layoutp->len == 0) {
9540
+ status = -EAGAIN;
9541
+ *timeout = nfs4_update_delay(&exception.timeout);
89679542 } else
89689543 lseg = pnfs_layout_process(lgp);
89699544 out:
....@@ -9004,17 +9579,26 @@
90049579 if (!nfs41_sequence_process(task, &lrp->res.seq_res))
90059580 return;
90069581
9582
+ /*
9583
+ * Was there an RPC level error? Assume the call succeeded,
9584
+ * and that we need to release the layout
9585
+ */
9586
+ if (task->tk_rpc_status != 0 && RPC_WAS_SENT(task)) {
9587
+ lrp->res.lrs_present = 0;
9588
+ return;
9589
+ }
9590
+
90079591 server = NFS_SERVER(lrp->args.inode);
90089592 switch (task->tk_status) {
90099593 case -NFS4ERR_OLD_STATEID:
9010
- if (nfs4_layoutreturn_refresh_stateid(&lrp->args.stateid,
9594
+ if (nfs4_layout_refresh_old_stateid(&lrp->args.stateid,
90119595 &lrp->args.range,
90129596 lrp->args.inode))
90139597 goto out_restart;
9014
- /* Fallthrough */
9598
+ fallthrough;
90159599 default:
90169600 task->tk_status = 0;
9017
- /* Fallthrough */
9601
+ fallthrough;
90189602 case 0:
90199603 break;
90209604 case -NFS4ERR_DELAY:
....@@ -9043,6 +9627,7 @@
90439627 lrp->ld_private.ops->free(&lrp->ld_private);
90449628 pnfs_put_layout_hdr(lrp->args.layout);
90459629 nfs_iput_and_deactive(lrp->inode);
9630
+ put_cred(lrp->cred);
90469631 kfree(calldata);
90479632 dprintk("<-- %s\n", __func__);
90489633 }
....@@ -9103,7 +9688,7 @@
91039688 static int
91049689 _nfs4_proc_getdeviceinfo(struct nfs_server *server,
91059690 struct pnfs_device *pdev,
9106
- struct rpc_cred *cred)
9691
+ const struct cred *cred)
91079692 {
91089693 struct nfs4_getdeviceinfo_args args = {
91099694 .pdev = pdev,
....@@ -9135,7 +9720,7 @@
91359720
91369721 int nfs4_proc_getdeviceinfo(struct nfs_server *server,
91379722 struct pnfs_device *pdev,
9138
- struct rpc_cred *cred)
9723
+ const struct cred *cred)
91399724 {
91409725 struct nfs4_exception exception = { };
91419726 int err;
....@@ -9192,7 +9777,7 @@
91929777 pnfs_cleanup_layoutcommit(data);
91939778 nfs_post_op_update_inode_force_wcc(data->args.inode,
91949779 data->res.fattr);
9195
- put_rpccred(data->cred);
9780
+ put_cred(data->cred);
91969781 nfs_iput_and_deactive(data->inode);
91979782 kfree(data);
91989783 }
....@@ -9247,7 +9832,7 @@
92479832 return status;
92489833 }
92499834
9250
-/**
9835
+/*
92519836 * Use the state managment nfs_client cl_rpcclient, which uses krb5i (if
92529837 * possible) as per RFC3530bis and RFC5661 Security Considerations sections
92539838 */
....@@ -9267,23 +9852,34 @@
92679852 .rpc_argp = &args,
92689853 .rpc_resp = &res,
92699854 };
9270
- struct rpc_clnt *clnt = server->client;
9271
- struct rpc_cred *cred = NULL;
9855
+ struct nfs4_call_sync_data data = {
9856
+ .seq_server = server,
9857
+ .seq_args = &args.seq_args,
9858
+ .seq_res = &res.seq_res,
9859
+ };
9860
+ struct rpc_task_setup task_setup = {
9861
+ .rpc_client = server->client,
9862
+ .rpc_message = &msg,
9863
+ .callback_ops = server->nfs_client->cl_mvops->call_sync_ops,
9864
+ .callback_data = &data,
9865
+ .flags = RPC_TASK_NO_ROUND_ROBIN,
9866
+ };
9867
+ const struct cred *cred = NULL;
92729868 int status;
92739869
92749870 if (use_integrity) {
9275
- clnt = server->nfs_client->cl_rpcclient;
9871
+ task_setup.rpc_client = server->nfs_client->cl_rpcclient;
9872
+
92769873 cred = nfs4_get_clid_cred(server->nfs_client);
92779874 msg.rpc_cred = cred;
92789875 }
92799876
92809877 dprintk("--> %s\n", __func__);
9281
- status = nfs4_call_sync(clnt, server, &msg, &args.seq_args,
9282
- &res.seq_res, 0);
9878
+ nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
9879
+ status = nfs4_call_sync_custom(&task_setup);
92839880 dprintk("<-- %s status=%d\n", __func__, status);
92849881
9285
- if (cred)
9286
- put_rpccred(cred);
9882
+ put_cred(cred);
92879883
92889884 return status;
92899885 }
....@@ -9292,7 +9888,9 @@
92929888 nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle,
92939889 struct nfs_fsinfo *info, struct nfs4_secinfo_flavors *flavors)
92949890 {
9295
- struct nfs4_exception exception = { };
9891
+ struct nfs4_exception exception = {
9892
+ .interruptible = true,
9893
+ };
92969894 int err;
92979895 do {
92989896 /* first try using integrity protection */
....@@ -9396,7 +9994,7 @@
93969994
93979995 static int _nfs41_test_stateid(struct nfs_server *server,
93989996 nfs4_stateid *stateid,
9399
- struct rpc_cred *cred)
9997
+ const struct cred *cred)
94009998 {
94019999 int status;
940210000 struct nfs41_test_stateid_args args = {
....@@ -9457,9 +10055,11 @@
945710055 */
945810056 static int nfs41_test_stateid(struct nfs_server *server,
945910057 nfs4_stateid *stateid,
9460
- struct rpc_cred *cred)
10058
+ const struct cred *cred)
946110059 {
9462
- struct nfs4_exception exception = { };
10060
+ struct nfs4_exception exception = {
10061
+ .interruptible = true,
10062
+ };
946310063 int err;
946410064 do {
946510065 err = _nfs41_test_stateid(server, stateid, cred);
....@@ -9513,13 +10113,13 @@
951310113 * @server: server / transport on which to perform the operation
951410114 * @stateid: state ID to release
951510115 * @cred: credential
9516
- * @is_recovery: set to true if this call needs to be privileged
10116
+ * @privileged: set to true if this call needs to be privileged
951710117 *
951810118 * Note: this function is always asynchronous.
951910119 */
952010120 static int nfs41_free_stateid(struct nfs_server *server,
952110121 const nfs4_stateid *stateid,
9522
- struct rpc_cred *cred,
10122
+ const struct cred *cred,
952310123 bool privileged)
952410124 {
952510125 struct rpc_message msg = {
....@@ -9560,7 +10160,7 @@
956010160 static void
956110161 nfs41_free_lock_state(struct nfs_server *server, struct nfs4_lock_state *lsp)
956210162 {
9563
- struct rpc_cred *cred = lsp->ls_state->owner->so_cred;
10163
+ const struct cred *cred = lsp->ls_state->owner->so_cred;
956410164
956510165 nfs41_free_stateid(server, &lsp->ls_stateid, cred, false);
956610166 nfs4_free_lock_state(server, lsp);
....@@ -9631,14 +10231,14 @@
963110231
963210232 static const struct nfs4_state_maintenance_ops nfs40_state_renewal_ops = {
963310233 .sched_state_renewal = nfs4_proc_async_renew,
9634
- .get_state_renewal_cred_locked = nfs4_get_renew_cred_locked,
10234
+ .get_state_renewal_cred = nfs4_get_renew_cred,
963510235 .renew_lease = nfs4_proc_renew,
963610236 };
963710237
963810238 #if defined(CONFIG_NFS_V4_1)
963910239 static const struct nfs4_state_maintenance_ops nfs41_state_renewal_ops = {
964010240 .sched_state_renewal = nfs41_proc_async_sequence,
9641
- .get_state_renewal_cred_locked = nfs4_get_machine_cred_locked,
10241
+ .get_state_renewal_cred = nfs4_get_machine_cred,
964210242 .renew_lease = nfs4_proc_sequence,
964310243 };
964410244 #endif
....@@ -9717,10 +10317,13 @@
971710317 | NFS_CAP_ALLOCATE
971810318 | NFS_CAP_COPY
971910319 | NFS_CAP_OFFLOAD_CANCEL
10320
+ | NFS_CAP_COPY_NOTIFY
972010321 | NFS_CAP_DEALLOCATE
972110322 | NFS_CAP_SEEK
972210323 | NFS_CAP_LAYOUTSTATS
9723
- | NFS_CAP_CLONE,
10324
+ | NFS_CAP_CLONE
10325
+ | NFS_CAP_LAYOUTERROR
10326
+ | NFS_CAP_READ_PLUS,
972410327 .init_client = nfs41_init_client,
972510328 .shutdown_client = nfs41_shutdown_client,
972610329 .match_stateid = nfs41_match_stateid,
....@@ -9749,7 +10352,7 @@
974910352
975010353 static ssize_t nfs4_listxattr(struct dentry *dentry, char *list, size_t size)
975110354 {
9752
- ssize_t error, error2;
10355
+ ssize_t error, error2, error3;
975310356
975410357 error = generic_listxattr(dentry, list, size);
975510358 if (error < 0)
....@@ -9762,7 +10365,17 @@
976210365 error2 = nfs4_listxattr_nfs4_label(d_inode(dentry), list, size);
976310366 if (error2 < 0)
976410367 return error2;
9765
- return error + error2;
10368
+
10369
+ if (list) {
10370
+ list += error2;
10371
+ size -= error2;
10372
+ }
10373
+
10374
+ error3 = nfs4_listxattr_nfs4_user(d_inode(dentry), list, size);
10375
+ if (error3 < 0)
10376
+ return error3;
10377
+
10378
+ return error + error2 + error3;
976610379 }
976710380
976810381 static const struct inode_operations nfs4_dir_inode_operations = {
....@@ -9797,7 +10410,7 @@
979710410 .file_ops = &nfs4_file_operations,
979810411 .getroot = nfs4_proc_get_root,
979910412 .submount = nfs4_submount,
9800
- .try_mount = nfs4_try_mount,
10413
+ .try_get_tree = nfs4_try_get_tree,
980110414 .getattr = nfs4_proc_getattr,
980210415 .setattr = nfs4_proc_setattr,
980310416 .lookup = nfs4_proc_lookup,
....@@ -9850,11 +10463,22 @@
985010463 .set = nfs4_xattr_set_nfs4_acl,
985110464 };
985210465
10466
+#ifdef CONFIG_NFS_V4_2
10467
+static const struct xattr_handler nfs4_xattr_nfs4_user_handler = {
10468
+ .prefix = XATTR_USER_PREFIX,
10469
+ .get = nfs4_xattr_get_nfs4_user,
10470
+ .set = nfs4_xattr_set_nfs4_user,
10471
+};
10472
+#endif
10473
+
985310474 const struct xattr_handler *nfs4_xattr_handlers[] = {
985410475 &nfs4_xattr_nfs4_acl_handler,
985510476 #ifdef CONFIG_NFS_V4_SECURITY_LABEL
985610477 &nfs4_xattr_nfs4_label_handler,
985710478 #endif
10479
+#ifdef CONFIG_NFS_V4_2
10480
+ &nfs4_xattr_nfs4_user_handler,
10481
+#endif
985810482 NULL
985910483 };
986010484