hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
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 *
....@@ -120,6 +129,11 @@
120129
121130 if (nfs_server_capable(dir, NFS_CAP_SECURITY_LABEL) == 0)
122131 return NULL;
132
+
133
+ label->lfs = 0;
134
+ label->pi = 0;
135
+ label->len = 0;
136
+ label->label = NULL;
123137
124138 err = security_dentry_init_security(dentry, sattr->ia_mode,
125139 &dentry->d_name, (void **)&label->label, &label->len);
....@@ -257,6 +271,7 @@
257271 | FATTR4_WORD1_FS_LAYOUT_TYPES,
258272 FATTR4_WORD2_LAYOUT_BLKSIZE
259273 | FATTR4_WORD2_CLONE_BLKSIZE
274
+ | FATTR4_WORD2_XATTR_SUPPORT
260275 };
261276
262277 const u32 nfs4_fs_locations_bitmap[3] = {
....@@ -359,9 +374,17 @@
359374 kunmap_atomic(start);
360375 }
361376
377
+static void nfs4_fattr_set_prechange(struct nfs_fattr *fattr, u64 version)
378
+{
379
+ if (!(fattr->valid & NFS_ATTR_FATTR_PRECHANGE)) {
380
+ fattr->pre_change_attr = version;
381
+ fattr->valid |= NFS_ATTR_FATTR_PRECHANGE;
382
+ }
383
+}
384
+
362385 static void nfs4_test_and_free_stateid(struct nfs_server *server,
363386 nfs4_stateid *stateid,
364
- struct rpc_cred *cred)
387
+ const struct cred *cred)
365388 {
366389 const struct nfs4_minor_version_ops *ops = server->nfs_client->cl_mvops;
367390
....@@ -370,7 +393,7 @@
370393
371394 static void __nfs4_free_revoked_stateid(struct nfs_server *server,
372395 nfs4_stateid *stateid,
373
- struct rpc_cred *cred)
396
+ const struct cred *cred)
374397 {
375398 stateid->type = NFS4_REVOKED_STATEID_TYPE;
376399 nfs4_test_and_free_stateid(server, stateid, cred);
....@@ -378,7 +401,7 @@
378401
379402 static void nfs4_free_revoked_stateid(struct nfs_server *server,
380403 const nfs4_stateid *stateid,
381
- struct rpc_cred *cred)
404
+ const struct cred *cred)
382405 {
383406 nfs4_stateid tmp;
384407
....@@ -400,17 +423,48 @@
400423 return ret;
401424 }
402425
403
-static int nfs4_delay(struct rpc_clnt *clnt, long *timeout)
426
+static int nfs4_delay_killable(long *timeout)
404427 {
405
- int res = 0;
406
-
407428 might_sleep();
408429
409430 freezable_schedule_timeout_killable_unsafe(
410431 nfs4_update_delay(timeout));
411
- if (fatal_signal_pending(current))
412
- res = -ERESTARTSYS;
413
- return res;
432
+ if (!__fatal_signal_pending(current))
433
+ return 0;
434
+ return -EINTR;
435
+}
436
+
437
+static int nfs4_delay_interruptible(long *timeout)
438
+{
439
+ might_sleep();
440
+
441
+ freezable_schedule_timeout_interruptible_unsafe(nfs4_update_delay(timeout));
442
+ if (!signal_pending(current))
443
+ return 0;
444
+ return __fatal_signal_pending(current) ? -EINTR :-ERESTARTSYS;
445
+}
446
+
447
+static int nfs4_delay(long *timeout, bool interruptible)
448
+{
449
+ if (interruptible)
450
+ return nfs4_delay_interruptible(timeout);
451
+ return nfs4_delay_killable(timeout);
452
+}
453
+
454
+static const nfs4_stateid *
455
+nfs4_recoverable_stateid(const nfs4_stateid *stateid)
456
+{
457
+ if (!stateid)
458
+ return NULL;
459
+ switch (stateid->type) {
460
+ case NFS4_OPEN_STATEID_TYPE:
461
+ case NFS4_LOCK_STATEID_TYPE:
462
+ case NFS4_DELEGATION_STATEID_TYPE:
463
+ return stateid;
464
+ default:
465
+ break;
466
+ }
467
+ return NULL;
414468 }
415469
416470 /* This is the error handling routine for processes that are allowed
....@@ -421,7 +475,7 @@
421475 {
422476 struct nfs_client *clp = server->nfs_client;
423477 struct nfs4_state *state = exception->state;
424
- const nfs4_stateid *stateid = exception->stateid;
478
+ const nfs4_stateid *stateid;
425479 struct inode *inode = exception->inode;
426480 int ret = errorcode;
427481
....@@ -429,8 +483,9 @@
429483 exception->recovering = 0;
430484 exception->retry = 0;
431485
486
+ stateid = nfs4_recoverable_stateid(exception->stateid);
432487 if (stateid == NULL && state != NULL)
433
- stateid = &state->stateid;
488
+ stateid = nfs4_recoverable_stateid(&state->stateid);
434489
435490 switch(errorcode) {
436491 case 0:
....@@ -444,12 +499,13 @@
444499 case -NFS4ERR_ADMIN_REVOKED:
445500 case -NFS4ERR_EXPIRED:
446501 case -NFS4ERR_BAD_STATEID:
502
+ case -NFS4ERR_PARTNER_NO_AUTH:
447503 if (inode != NULL && stateid != NULL) {
448504 nfs_inode_find_state_and_recover(inode,
449505 stateid);
450506 goto wait_on_recovery;
451507 }
452
- /* Fall through */
508
+ fallthrough;
453509 case -NFS4ERR_OPENMODE:
454510 if (inode) {
455511 int err;
....@@ -489,9 +545,7 @@
489545 case -NFS4ERR_DEADSESSION:
490546 case -NFS4ERR_SEQ_FALSE_RETRY:
491547 case -NFS4ERR_SEQ_MISORDERED:
492
- dprintk("%s ERROR: %d Reset session\n", __func__,
493
- errorcode);
494
- nfs4_schedule_session_recovery(clp->cl_session, errorcode);
548
+ /* Handled in nfs41_sequence_process() */
495549 goto wait_on_recovery;
496550 #endif /* defined(CONFIG_NFS_V4_1) */
497551 case -NFS4ERR_FILE_OPEN:
....@@ -502,10 +556,10 @@
502556 ret = -EBUSY;
503557 break;
504558 }
505
- /* Fall through */
559
+ fallthrough;
506560 case -NFS4ERR_DELAY:
507561 nfs_inc_server_stats(server, NFSIOS_DELAY);
508
- /* Fall through */
562
+ fallthrough;
509563 case -NFS4ERR_GRACE:
510564 case -NFS4ERR_LAYOUTTRYLATER:
511565 case -NFS4ERR_RECALLCONFLICT:
....@@ -546,7 +600,8 @@
546600
547601 ret = nfs4_do_handle_exception(server, errorcode, exception);
548602 if (exception->delay) {
549
- ret = nfs4_delay(server->client, &exception->timeout);
603
+ ret = nfs4_delay(&exception->timeout,
604
+ exception->interruptible);
550605 goto out_retry;
551606 }
552607 if (exception->recovering) {
....@@ -734,36 +789,57 @@
734789 res->sr_slot = NULL;
735790 }
736791
792
+static void nfs4_slot_sequence_record_sent(struct nfs4_slot *slot,
793
+ u32 seqnr)
794
+{
795
+ if ((s32)(seqnr - slot->seq_nr_highest_sent) > 0)
796
+ slot->seq_nr_highest_sent = seqnr;
797
+}
798
+static void nfs4_slot_sequence_acked(struct nfs4_slot *slot, u32 seqnr)
799
+{
800
+ nfs4_slot_sequence_record_sent(slot, seqnr);
801
+ slot->seq_nr_last_acked = seqnr;
802
+}
803
+
804
+static void nfs4_probe_sequence(struct nfs_client *client, const struct cred *cred,
805
+ struct nfs4_slot *slot)
806
+{
807
+ struct rpc_task *task = _nfs41_proc_sequence(client, cred, slot, true);
808
+ if (!IS_ERR(task))
809
+ rpc_put_task_async(task);
810
+}
811
+
737812 static int nfs41_sequence_process(struct rpc_task *task,
738813 struct nfs4_sequence_res *res)
739814 {
740815 struct nfs4_session *session;
741816 struct nfs4_slot *slot = res->sr_slot;
742817 struct nfs_client *clp;
743
- bool interrupted = false;
818
+ int status;
744819 int ret = 1;
745820
746821 if (slot == NULL)
747822 goto out_noaction;
748823 /* don't increment the sequence number if the task wasn't sent */
749
- if (!RPC_WAS_SENT(task))
824
+ if (!RPC_WAS_SENT(task) || slot->seq_done)
750825 goto out;
751826
752827 session = slot->table->session;
753
-
754
- if (slot->interrupted) {
755
- if (res->sr_status != -NFS4ERR_DELAY)
756
- slot->interrupted = 0;
757
- interrupted = true;
758
- }
828
+ clp = session->clp;
759829
760830 trace_nfs4_sequence_done(session, res);
831
+
832
+ status = res->sr_status;
833
+ if (task->tk_status == -NFS4ERR_DEADSESSION)
834
+ status = -NFS4ERR_DEADSESSION;
835
+
761836 /* Check the SEQUENCE operation status */
762
- switch (res->sr_status) {
837
+ switch (status) {
763838 case 0:
839
+ /* Mark this sequence number as having been acked */
840
+ nfs4_slot_sequence_acked(slot, slot->seq_nr);
764841 /* Update the slot's sequence and clientid lease timer */
765842 slot->seq_done = 1;
766
- clp = session->clp;
767843 do_renew_lease(clp, res->sr_timestamp);
768844 /* Check sequence flags */
769845 nfs41_handle_sequence_flag_errors(clp, res->sr_status_flags,
....@@ -775,9 +851,9 @@
775851 * sr_status remains 1 if an RPC level error occurred.
776852 * The server may or may not have processed the sequence
777853 * operation..
778
- * Mark the slot as having hosted an interrupted RPC call.
779854 */
780
- slot->interrupted = 1;
855
+ nfs4_slot_sequence_record_sent(slot, slot->seq_nr);
856
+ slot->seq_done = 1;
781857 goto out;
782858 case -NFS4ERR_DELAY:
783859 /* The server detected a resend of the RPC call and
....@@ -795,6 +871,7 @@
795871 * The server thinks we tried to replay a request.
796872 * Retry the call after bumping the sequence ID.
797873 */
874
+ nfs4_slot_sequence_acked(slot, slot->seq_nr);
798875 goto retry_new_seq;
799876 case -NFS4ERR_BADSLOT:
800877 /*
....@@ -805,20 +882,39 @@
805882 goto session_recover;
806883 goto retry_nowait;
807884 case -NFS4ERR_SEQ_MISORDERED:
885
+ nfs4_slot_sequence_record_sent(slot, slot->seq_nr);
808886 /*
809
- * Was the last operation on this sequence interrupted?
810
- * If so, retry after bumping the sequence number.
887
+ * Were one or more calls using this slot interrupted?
888
+ * If the server never received the request, then our
889
+ * transmitted slot sequence number may be too high. However,
890
+ * if the server did receive the request then it might
891
+ * accidentally give us a reply with a mismatched operation.
892
+ * We can sort this out by sending a lone sequence operation
893
+ * to the server on the same slot.
811894 */
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;
895
+ if ((s32)(slot->seq_nr - slot->seq_nr_last_acked) > 1) {
896
+ slot->seq_nr--;
897
+ if (task->tk_msg.rpc_proc != &nfs4_procedures[NFSPROC4_CLNT_SEQUENCE]) {
898
+ nfs4_probe_sequence(clp, task->tk_msg.rpc_cred, slot);
899
+ res->sr_slot = NULL;
900
+ }
820901 goto retry_nowait;
821902 }
903
+ /*
904
+ * RFC5661:
905
+ * A retry might be sent while the original request is
906
+ * still in progress on the replier. The replier SHOULD
907
+ * deal with the issue by returning NFS4ERR_DELAY as the
908
+ * reply to SEQUENCE or CB_SEQUENCE operation, but
909
+ * implementations MAY return NFS4ERR_SEQ_MISORDERED.
910
+ *
911
+ * Restart the search after a delay.
912
+ */
913
+ slot->seq_nr = slot->seq_nr_highest_sent;
914
+ goto out_retry;
915
+ case -NFS4ERR_BADSESSION:
916
+ case -NFS4ERR_DEADSESSION:
917
+ case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
822918 goto session_recover;
823919 default:
824920 /* Just update the slot sequence no. */
....@@ -830,8 +926,11 @@
830926 out_noaction:
831927 return ret;
832928 session_recover:
833
- nfs4_schedule_session_recovery(session, res->sr_status);
834
- goto retry_nowait;
929
+ set_bit(NFS4_SLOT_TBL_DRAINING, &session->fc_slot_table.slot_tbl_state);
930
+ nfs4_schedule_session_recovery(session, status);
931
+ dprintk("%s ERROR: %d Reset session\n", __func__, status);
932
+ nfs41_sequence_free_slot(res);
933
+ goto out;
835934 retry_new_seq:
836935 ++slot->seq_nr;
837936 retry_nowait:
....@@ -910,17 +1009,6 @@
9101009 .rpc_call_done = nfs41_call_sync_done,
9111010 };
9121011
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
-
9241012 #else /* !CONFIG_NFS_V4_1 */
9251013
9261014 static int nfs4_sequence_process(struct rpc_task *task, struct nfs4_sequence_res *res)
....@@ -940,14 +1028,6 @@
9401028 return nfs40_sequence_done(task, res);
9411029 }
9421030 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
-}
9511031
9521032 #endif /* !CONFIG_NFS_V4_1 */
9531033
....@@ -984,31 +1064,21 @@
9841064 if (res->sr_slot != NULL)
9851065 goto out_start;
9861066
987
- if (session) {
1067
+ if (session)
9881068 tbl = &session->fc_slot_table;
989
- task->tk_timeout = 0;
1069
+
1070
+ spin_lock(&tbl->slot_tbl_lock);
1071
+ /* The state manager will wait until the slot table is empty */
1072
+ if (nfs4_slot_tbl_draining(tbl) && !args->sa_privileged)
1073
+ goto out_sleep;
1074
+
1075
+ slot = nfs4_alloc_slot(tbl);
1076
+ if (IS_ERR(slot)) {
1077
+ if (slot == ERR_PTR(-ENOMEM))
1078
+ goto out_sleep_timeout;
1079
+ goto out_sleep;
9901080 }
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
- }
1081
+ spin_unlock(&tbl->slot_tbl_lock);
10121082
10131083 nfs4_sequence_attach_slot(args, res, slot);
10141084
....@@ -1017,11 +1087,20 @@
10171087 nfs41_sequence_res_init(res);
10181088 rpc_call_start(task);
10191089 return 0;
1020
-
1090
+out_sleep_timeout:
1091
+ /* Try again in 1/4 second */
1092
+ if (args->sa_privileged)
1093
+ rpc_sleep_on_priority_timeout(&tbl->slot_tbl_waitq, task,
1094
+ jiffies + (HZ >> 2), RPC_PRIORITY_PRIVILEGED);
1095
+ else
1096
+ rpc_sleep_on_timeout(&tbl->slot_tbl_waitq, task,
1097
+ NULL, jiffies + (HZ >> 2));
1098
+ spin_unlock(&tbl->slot_tbl_lock);
1099
+ return -EAGAIN;
10211100 out_sleep:
10221101 if (args->sa_privileged)
10231102 rpc_sleep_on_priority(&tbl->slot_tbl_waitq, task,
1024
- NULL, RPC_PRIORITY_PRIVILEGED);
1103
+ RPC_PRIORITY_PRIVILEGED);
10251104 else
10261105 rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL);
10271106 spin_unlock(&tbl->slot_tbl_lock);
....@@ -1047,14 +1126,27 @@
10471126 .rpc_call_done = nfs40_call_sync_done,
10481127 };
10491128
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)
1129
+static int nfs4_call_sync_custom(struct rpc_task_setup *task_setup)
10551130 {
10561131 int ret;
10571132 struct rpc_task *task;
1133
+
1134
+ task = rpc_run_task(task_setup);
1135
+ if (IS_ERR(task))
1136
+ return PTR_ERR(task);
1137
+
1138
+ ret = task->tk_status;
1139
+ rpc_put_task(task);
1140
+ return ret;
1141
+}
1142
+
1143
+static int nfs4_do_call_sync(struct rpc_clnt *clnt,
1144
+ struct nfs_server *server,
1145
+ struct rpc_message *msg,
1146
+ struct nfs4_sequence_args *args,
1147
+ struct nfs4_sequence_res *res,
1148
+ unsigned short task_flags)
1149
+{
10581150 struct nfs_client *clp = server->nfs_client;
10591151 struct nfs4_call_sync_data data = {
10601152 .seq_server = server,
....@@ -1065,18 +1157,22 @@
10651157 .rpc_client = clnt,
10661158 .rpc_message = msg,
10671159 .callback_ops = clp->cl_mvops->call_sync_ops,
1068
- .callback_data = &data
1160
+ .callback_data = &data,
1161
+ .flags = task_flags,
10691162 };
10701163
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;
1164
+ return nfs4_call_sync_custom(&task_setup);
10791165 }
1166
+
1167
+static int nfs4_call_sync_sequence(struct rpc_clnt *clnt,
1168
+ struct nfs_server *server,
1169
+ struct rpc_message *msg,
1170
+ struct nfs4_sequence_args *args,
1171
+ struct nfs4_sequence_res *res)
1172
+{
1173
+ return nfs4_do_call_sync(clnt, server, msg, args, res, 0);
1174
+}
1175
+
10801176
10811177 int nfs4_call_sync(struct rpc_clnt *clnt,
10821178 struct nfs_server *server,
....@@ -1104,37 +1200,49 @@
11041200 }
11051201
11061202 static void
1107
-update_changeattr_locked(struct inode *dir, struct nfs4_change_info *cinfo,
1203
+nfs4_update_changeattr_locked(struct inode *inode,
1204
+ struct nfs4_change_info *cinfo,
11081205 unsigned long timestamp, unsigned long cache_validity)
11091206 {
1110
- struct nfs_inode *nfsi = NFS_I(dir);
1207
+ struct nfs_inode *nfsi = NFS_I(inode);
11111208
11121209 nfsi->cache_validity |= NFS_INO_INVALID_CTIME
11131210 | NFS_INO_INVALID_MTIME
1114
- | NFS_INO_INVALID_DATA
11151211 | cache_validity;
1116
- if (cinfo->atomic && cinfo->before == inode_peek_iversion_raw(dir)) {
1212
+
1213
+ if (cinfo->atomic && cinfo->before == inode_peek_iversion_raw(inode)) {
11171214 nfsi->cache_validity &= ~NFS_INO_REVAL_PAGECACHE;
11181215 nfsi->attrtimeo_timestamp = jiffies;
11191216 } else {
1120
- nfs_force_lookup_revalidate(dir);
1121
- if (cinfo->before != inode_peek_iversion_raw(dir))
1217
+ if (S_ISDIR(inode->i_mode)) {
1218
+ nfsi->cache_validity |= NFS_INO_INVALID_DATA;
1219
+ nfs_force_lookup_revalidate(inode);
1220
+ } else {
1221
+ if (!NFS_PROTO(inode)->have_delegation(inode,
1222
+ FMODE_READ))
1223
+ nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE;
1224
+ }
1225
+
1226
+ if (cinfo->before != inode_peek_iversion_raw(inode))
11221227 nfsi->cache_validity |= NFS_INO_INVALID_ACCESS |
1123
- NFS_INO_INVALID_ACL;
1228
+ NFS_INO_INVALID_ACL |
1229
+ NFS_INO_INVALID_XATTR;
11241230 }
1125
- inode_set_iversion_raw(dir, cinfo->after);
1231
+ inode_set_iversion_raw(inode, cinfo->after);
11261232 nfsi->read_cache_jiffies = timestamp;
11271233 nfsi->attr_gencount = nfs_inc_attr_generation_counter();
11281234 nfsi->cache_validity &= ~NFS_INO_INVALID_CHANGE;
1129
- nfs_fscache_invalidate(dir);
1235
+
1236
+ if (nfsi->cache_validity & NFS_INO_INVALID_DATA)
1237
+ nfs_fscache_invalidate(inode);
11301238 }
11311239
1132
-static void
1133
-update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo,
1240
+void
1241
+nfs4_update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo,
11341242 unsigned long timestamp, unsigned long cache_validity)
11351243 {
11361244 spin_lock(&dir->i_lock);
1137
- update_changeattr_locked(dir, cinfo, timestamp, cache_validity);
1245
+ nfs4_update_changeattr_locked(dir, cinfo, timestamp, cache_validity);
11381246 spin_unlock(&dir->i_lock);
11391247 }
11401248
....@@ -1154,6 +1262,18 @@
11541262 server->caps &= ~NFS_CAP_ATOMIC_OPEN_V1;
11551263 exception->retry = 1;
11561264 return true;
1265
+}
1266
+
1267
+static fmode_t _nfs4_ctx_to_accessmode(const struct nfs_open_context *ctx)
1268
+{
1269
+ return ctx->mode & (FMODE_READ|FMODE_WRITE|FMODE_EXEC);
1270
+}
1271
+
1272
+static fmode_t _nfs4_ctx_to_openmode(const struct nfs_open_context *ctx)
1273
+{
1274
+ fmode_t ret = ctx->mode & (FMODE_READ|FMODE_WRITE);
1275
+
1276
+ return (ctx->mode & FMODE_EXEC) ? FMODE_READ | ret : ret;
11571277 }
11581278
11591279 static u32
....@@ -1275,6 +1395,12 @@
12751395 NFS4_ACCESS_MODIFY |
12761396 NFS4_ACCESS_EXTEND |
12771397 NFS4_ACCESS_EXECUTE;
1398
+#ifdef CONFIG_NFS_V4_2
1399
+ if (server->caps & NFS_CAP_XATTR)
1400
+ p->o_arg.access |= NFS4_ACCESS_XAREAD |
1401
+ NFS4_ACCESS_XAWRITE |
1402
+ NFS4_ACCESS_XALIST;
1403
+#endif
12781404 }
12791405 }
12801406 p->o_arg.clientid = server->nfs_client->cl_clientid;
....@@ -1404,7 +1530,7 @@
14041530 case NFS4_OPEN_CLAIM_PREVIOUS:
14051531 if (!test_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags))
14061532 break;
1407
- /* Fall through */
1533
+ fallthrough;
14081534 default:
14091535 return 0;
14101536 }
....@@ -1446,19 +1572,6 @@
14461572 wake_up_all(&state->waitq);
14471573 }
14481574
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
-
14621575 static void nfs_test_and_clear_all_open_stateid(struct nfs4_state *state)
14631576 {
14641577 struct nfs_client *clp = state->owner->so_server->nfs_client;
....@@ -1484,22 +1597,21 @@
14841597 * i.e. The stateid seqids have to be initialised to 1, and
14851598 * are then incremented on every state transition.
14861599 */
1487
-static bool nfs_need_update_open_stateid(struct nfs4_state *state,
1600
+static bool nfs_stateid_is_sequential(struct nfs4_state *state,
14881601 const nfs4_stateid *stateid)
14891602 {
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;
1603
+ if (test_bit(NFS_OPEN_STATE, &state->flags)) {
1604
+ /* The common case - we're updating to a new sequence number */
1605
+ if (nfs4_stateid_match_other(stateid, &state->open_stateid)) {
1606
+ if (nfs4_stateid_is_next(&state->open_stateid, stateid))
1607
+ return true;
1608
+ return false;
1609
+ }
1610
+ /* The server returned a new stateid */
14971611 }
1498
-
1499
- if (nfs4_stateid_is_newer(stateid, &state->open_stateid)) {
1500
- nfs_state_log_out_of_order_open_stateid(state, stateid);
1612
+ /* This is the first OPEN in this generation */
1613
+ if (stateid->seqid == cpu_to_be32(1))
15011614 return true;
1502
- }
15031615 return false;
15041616 }
15051617
....@@ -1563,21 +1675,25 @@
15631675
15641676 static void nfs_set_open_stateid_locked(struct nfs4_state *state,
15651677 const nfs4_stateid *stateid, nfs4_stateid *freeme)
1678
+ __must_hold(&state->owner->so_lock)
1679
+ __must_hold(&state->seqlock)
1680
+ __must_hold(RCU)
1681
+
15661682 {
15671683 DEFINE_WAIT(wait);
15681684 int status = 0;
15691685 for (;;) {
15701686
1571
- if (!nfs_need_update_open_stateid(state, stateid))
1572
- return;
1573
- if (!test_bit(NFS_STATE_CHANGE_WAIT, &state->flags))
1687
+ if (nfs_stateid_is_sequential(state, stateid))
15741688 break;
1689
+
15751690 if (status)
15761691 break;
15771692 /* Rely on seqids for serialisation with NFSv4.0 */
15781693 if (!nfs4_has_session(NFS_SERVER(state->inode)->nfs_client))
15791694 break;
15801695
1696
+ set_bit(NFS_STATE_CHANGE_WAIT, &state->flags);
15811697 prepare_to_wait(&state->waitq, &wait, TASK_KILLABLE);
15821698 /*
15831699 * Ensure we process the state changes in the same order
....@@ -1588,7 +1704,8 @@
15881704 spin_unlock(&state->owner->so_lock);
15891705 rcu_read_unlock();
15901706 trace_nfs4_open_stateid_update_wait(state->inode, stateid, 0);
1591
- if (!signal_pending(current)) {
1707
+
1708
+ if (!fatal_signal_pending(current)) {
15921709 if (schedule_timeout(5*HZ) == 0)
15931710 status = -EAGAIN;
15941711 else
....@@ -1639,6 +1756,14 @@
16391756 write_sequnlock(&state->seqlock);
16401757 }
16411758
1759
+static void nfs_state_clear_open_state_flags(struct nfs4_state *state)
1760
+{
1761
+ clear_bit(NFS_O_RDWR_STATE, &state->flags);
1762
+ clear_bit(NFS_O_WRONLY_STATE, &state->flags);
1763
+ clear_bit(NFS_O_RDONLY_STATE, &state->flags);
1764
+ clear_bit(NFS_OPEN_STATE, &state->flags);
1765
+}
1766
+
16421767 static void nfs_state_set_delegation(struct nfs4_state *state,
16431768 const nfs4_stateid *deleg_stateid,
16441769 fmode_t fmode)
....@@ -1661,7 +1786,7 @@
16611786 write_sequnlock(&state->seqlock);
16621787 }
16631788
1664
-static int update_open_stateid(struct nfs4_state *state,
1789
+int update_open_stateid(struct nfs4_state *state,
16651790 const nfs4_stateid *open_stateid,
16661791 const nfs4_stateid *delegation,
16671792 fmode_t fmode)
....@@ -1682,7 +1807,7 @@
16821807 ret = 1;
16831808 }
16841809
1685
- deleg_cur = rcu_dereference(nfsi->delegation);
1810
+ deleg_cur = nfs4_get_valid_delegation(state->inode);
16861811 if (deleg_cur == NULL)
16871812 goto no_delegation;
16881813
....@@ -1694,7 +1819,7 @@
16941819
16951820 if (delegation == NULL)
16961821 delegation = &deleg_cur->stateid;
1697
- else if (!nfs4_stateid_match(&deleg_cur->stateid, delegation))
1822
+ else if (!nfs4_stateid_match_other(&deleg_cur->stateid, delegation))
16981823 goto no_delegation_unlock;
16991824
17001825 nfs_mark_delegation_referenced(deleg_cur);
....@@ -1741,7 +1866,7 @@
17411866
17421867 fmode &= FMODE_READ|FMODE_WRITE;
17431868 rcu_read_lock();
1744
- delegation = rcu_dereference(NFS_I(inode)->delegation);
1869
+ delegation = nfs4_get_valid_delegation(inode);
17451870 if (delegation == NULL || (delegation->type & fmode) == fmode) {
17461871 rcu_read_unlock();
17471872 return;
....@@ -1792,7 +1917,7 @@
17921917 out:
17931918 return ERR_PTR(ret);
17941919 out_return_state:
1795
- atomic_inc(&state->count);
1920
+ refcount_inc(&state->count);
17961921 return state;
17971922 }
17981923
....@@ -1851,8 +1976,7 @@
18511976 if (!data->rpc_done) {
18521977 if (data->rpc_status)
18531978 return ERR_PTR(data->rpc_status);
1854
- /* cached opens have already been processed */
1855
- goto update;
1979
+ return nfs4_try_open_cached(data);
18561980 }
18571981
18581982 ret = nfs_refresh_inode(inode, &data->f_attr);
....@@ -1861,10 +1985,11 @@
18611985
18621986 if (data->o_res.delegation_type != 0)
18631987 nfs4_opendata_check_deleg(data, state);
1864
-update:
1865
- update_open_stateid(state, &data->o_res.stateid, NULL,
1866
- data->o_arg.fmode);
1867
- atomic_inc(&state->count);
1988
+
1989
+ if (!update_open_stateid(state, &data->o_res.stateid,
1990
+ NULL, data->o_arg.fmode))
1991
+ return ERR_PTR(-EAGAIN);
1992
+ refcount_inc(&state->count);
18681993
18691994 return state;
18701995 }
....@@ -1902,7 +2027,7 @@
19022027 return ERR_CAST(inode);
19032028 if (data->state != NULL && data->state->inode == inode) {
19042029 state = data->state;
1905
- atomic_inc(&state->count);
2030
+ refcount_inc(&state->count);
19062031 } else
19072032 state = nfs4_get_open_state(inode, data->owner);
19082033 iput(inode);
....@@ -1928,8 +2053,11 @@
19282053
19292054 if (data->o_res.delegation_type != 0)
19302055 nfs4_opendata_check_deleg(data, state);
1931
- update_open_stateid(state, &data->o_res.stateid, NULL,
1932
- data->o_arg.fmode);
2056
+ if (!update_open_stateid(state, &data->o_res.stateid,
2057
+ NULL, data->o_arg.fmode)) {
2058
+ nfs4_put_open_state(state);
2059
+ state = ERR_PTR(-EAGAIN);
2060
+ }
19332061 out:
19342062 nfs_release_seqid(data->o_arg.seqid);
19352063 return state;
....@@ -1948,21 +2076,39 @@
19482076 return ret;
19492077 }
19502078
1951
-static struct nfs_open_context *nfs4_state_find_open_context(struct nfs4_state *state)
2079
+static struct nfs_open_context *
2080
+nfs4_state_find_open_context_mode(struct nfs4_state *state, fmode_t mode)
19522081 {
19532082 struct nfs_inode *nfsi = NFS_I(state->inode);
19542083 struct nfs_open_context *ctx;
19552084
1956
- spin_lock(&state->inode->i_lock);
1957
- list_for_each_entry(ctx, &nfsi->open_files, list) {
2085
+ rcu_read_lock();
2086
+ list_for_each_entry_rcu(ctx, &nfsi->open_files, list) {
19582087 if (ctx->state != state)
19592088 continue;
1960
- get_nfs_open_context(ctx);
1961
- spin_unlock(&state->inode->i_lock);
2089
+ if ((ctx->mode & mode) != mode)
2090
+ continue;
2091
+ if (!get_nfs_open_context(ctx))
2092
+ continue;
2093
+ rcu_read_unlock();
19622094 return ctx;
19632095 }
1964
- spin_unlock(&state->inode->i_lock);
2096
+ rcu_read_unlock();
19652097 return ERR_PTR(-ENOENT);
2098
+}
2099
+
2100
+static struct nfs_open_context *
2101
+nfs4_state_find_open_context(struct nfs4_state *state)
2102
+{
2103
+ struct nfs_open_context *ctx;
2104
+
2105
+ ctx = nfs4_state_find_open_context_mode(state, FMODE_READ|FMODE_WRITE);
2106
+ if (!IS_ERR(ctx))
2107
+ return ctx;
2108
+ ctx = nfs4_state_find_open_context_mode(state, FMODE_WRITE);
2109
+ if (!IS_ERR(ctx))
2110
+ return ctx;
2111
+ return nfs4_state_find_open_context_mode(state, FMODE_READ);
19662112 }
19672113
19682114 static struct nfs4_opendata *nfs4_open_recoverdata_alloc(struct nfs_open_context *ctx,
....@@ -1975,23 +2121,23 @@
19752121 if (opendata == NULL)
19762122 return ERR_PTR(-ENOMEM);
19772123 opendata->state = state;
1978
- atomic_inc(&state->count);
2124
+ refcount_inc(&state->count);
19792125 return opendata;
19802126 }
19812127
19822128 static int nfs4_open_recover_helper(struct nfs4_opendata *opendata,
1983
- fmode_t fmode)
2129
+ fmode_t fmode)
19842130 {
19852131 struct nfs4_state *newstate;
2132
+ struct nfs_server *server = NFS_SB(opendata->dentry->d_sb);
2133
+ int openflags = opendata->o_arg.open_flags;
19862134 int ret;
19872135
19882136 if (!nfs4_mode_match_open_stateid(opendata->state, fmode))
19892137 return 0;
1990
- opendata->o_arg.open_flags = 0;
19912138 opendata->o_arg.fmode = fmode;
1992
- opendata->o_arg.share_access = nfs4_map_atomic_open_share(
1993
- NFS_SB(opendata->dentry->d_sb),
1994
- fmode, 0);
2139
+ opendata->o_arg.share_access =
2140
+ nfs4_map_atomic_open_share(server, fmode, openflags);
19952141 memset(&opendata->o_res, 0, sizeof(opendata->o_res));
19962142 memset(&opendata->c_res, 0, sizeof(opendata->c_res));
19972143 nfs4_init_opendata_res(opendata);
....@@ -2011,13 +2157,7 @@
20112157 {
20122158 int ret;
20132159
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);
20182160 /* memory barrier prior to reading state->n_* */
2019
- clear_bit(NFS_DELEGATED_STATE, &state->flags);
2020
- clear_bit(NFS_OPEN_STATE, &state->flags);
20212161 smp_rmb();
20222162 ret = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE);
20232163 if (ret != 0)
....@@ -2093,6 +2233,8 @@
20932233 ctx = nfs4_state_find_open_context(state);
20942234 if (IS_ERR(ctx))
20952235 return -EAGAIN;
2236
+ clear_bit(NFS_DELEGATED_STATE, &state->flags);
2237
+ nfs_state_clear_open_state_flags(state);
20962238 ret = nfs4_do_open_reclaim(ctx, state);
20972239 put_nfs_open_context(ctx);
20982240 return ret;
....@@ -2108,13 +2250,13 @@
21082250 case -ENOENT:
21092251 case -EAGAIN:
21102252 case -ESTALE:
2253
+ case -ETIMEDOUT:
21112254 break;
21122255 case -NFS4ERR_BADSESSION:
21132256 case -NFS4ERR_BADSLOT:
21142257 case -NFS4ERR_BAD_HIGH_SLOT:
21152258 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
21162259 case -NFS4ERR_DEADSESSION:
2117
- nfs4_schedule_session_recovery(server->nfs_client->cl_session, err);
21182260 return -EAGAIN;
21192261 case -NFS4ERR_STALE_CLIENTID:
21202262 case -NFS4ERR_STALE_STATEID:
....@@ -2251,7 +2393,7 @@
22512393 .callback_ops = &nfs4_open_confirm_ops,
22522394 .callback_data = data,
22532395 .workqueue = nfsiod_workqueue,
2254
- .flags = RPC_TASK_ASYNC,
2396
+ .flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF,
22552397 };
22562398 int status;
22572399
....@@ -2308,7 +2450,7 @@
23082450 case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
23092451 case NFS4_OPEN_CLAIM_DELEG_PREV_FH:
23102452 data->o_arg.open_bitmap = &nfs4_open_noattr_bitmap[0];
2311
- /* Fall through */
2453
+ fallthrough;
23122454 case NFS4_OPEN_CLAIM_FH:
23132455 task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_OPEN_NOATTR];
23142456 }
....@@ -2416,7 +2558,7 @@
24162558 .callback_ops = &nfs4_open_ops,
24172559 .callback_data = data,
24182560 .workqueue = nfsiod_workqueue,
2419
- .flags = RPC_TASK_ASYNC,
2561
+ .flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF,
24202562 };
24212563 int status;
24222564
....@@ -2428,6 +2570,7 @@
24282570 if (!ctx) {
24292571 nfs4_init_sequence(&o_arg->seq_args, &o_res->seq_res, 1, 1);
24302572 data->is_recover = true;
2573
+ task_setup_data.flags |= RPC_TASK_TIMEOUT;
24312574 } else {
24322575 nfs4_init_sequence(&o_arg->seq_args, &o_res->seq_res, 1, 0);
24332576 pnfs_lgopen_prepare(data, ctx);
....@@ -2472,7 +2615,7 @@
24722615 * Note that in the non-execute case, we want to turn off permission
24732616 * checking if we just created a new file (POSIX open() semantics).
24742617 */
2475
-static int nfs4_opendata_access(struct rpc_cred *cred,
2618
+static int nfs4_opendata_access(const struct cred *cred,
24762619 struct nfs4_opendata *opendata,
24772620 struct nfs4_state *state, fmode_t fmode,
24782621 int openflags)
....@@ -2541,8 +2684,9 @@
25412684 data->file_created = true;
25422685 if (data->file_created ||
25432686 inode_peek_iversion_raw(dir) != o_res->cinfo.after)
2544
- update_changeattr(dir, &o_res->cinfo,
2545
- o_res->f_attr->time_start, 0);
2687
+ nfs4_update_changeattr(dir, &o_res->cinfo,
2688
+ o_res->f_attr->time_start,
2689
+ NFS_INO_INVALID_DATA);
25462690 }
25472691 if ((o_res->rflags & NFS4_OPEN_RESULT_LOCKTYPE_POSIX) == 0)
25482692 server->caps &= ~NFS_CAP_POSIX_LOCK;
....@@ -2569,10 +2713,15 @@
25692713 struct nfs4_opendata *opendata;
25702714 int ret;
25712715
2572
- opendata = nfs4_open_recoverdata_alloc(ctx, state,
2573
- NFS4_OPEN_CLAIM_FH);
2716
+ opendata = nfs4_open_recoverdata_alloc(ctx, state, NFS4_OPEN_CLAIM_FH);
25742717 if (IS_ERR(opendata))
25752718 return PTR_ERR(opendata);
2719
+ /*
2720
+ * We're not recovering a delegation, so ask for no delegation.
2721
+ * Otherwise the recovery thread could deadlock with an outstanding
2722
+ * delegation return.
2723
+ */
2724
+ opendata->o_arg.open_flags = O_DIRECT;
25762725 ret = nfs4_open_recover(opendata, state);
25772726 if (ret == -ESTALE)
25782727 d_drop(ctx->dentry);
....@@ -2634,12 +2783,13 @@
26342783 {
26352784 /* NFSv4.0 doesn't allow for delegation recovery on open expire */
26362785 nfs40_clear_delegation_stateid(state);
2786
+ nfs_state_clear_open_state_flags(state);
26372787 return nfs4_open_expired(sp, state);
26382788 }
26392789
26402790 static int nfs40_test_and_free_expired_stateid(struct nfs_server *server,
26412791 nfs4_stateid *stateid,
2642
- struct rpc_cred *cred)
2792
+ const struct cred *cred)
26432793 {
26442794 return -NFS4ERR_BAD_STATEID;
26452795 }
....@@ -2647,7 +2797,7 @@
26472797 #if defined(CONFIG_NFS_V4_1)
26482798 static int nfs41_test_and_free_expired_stateid(struct nfs_server *server,
26492799 nfs4_stateid *stateid,
2650
- struct rpc_cred *cred)
2800
+ const struct cred *cred)
26512801 {
26522802 int status;
26532803
....@@ -2676,13 +2826,13 @@
26762826 return -NFS4ERR_EXPIRED;
26772827 }
26782828
2679
-static void nfs41_check_delegation_stateid(struct nfs4_state *state)
2829
+static int nfs41_check_delegation_stateid(struct nfs4_state *state)
26802830 {
26812831 struct nfs_server *server = NFS_SERVER(state->inode);
26822832 nfs4_stateid stateid;
26832833 struct nfs_delegation *delegation;
2684
- struct rpc_cred *cred;
2685
- int status;
2834
+ const struct cred *cred = NULL;
2835
+ int status, ret = NFS_OK;
26862836
26872837 /* Get the delegation credential for use by test/free_stateid */
26882838 rcu_read_lock();
....@@ -2690,30 +2840,45 @@
26902840 if (delegation == NULL) {
26912841 rcu_read_unlock();
26922842 nfs_state_clear_delegation(state);
2693
- return;
2843
+ return NFS_OK;
26942844 }
26952845
2846
+ spin_lock(&delegation->lock);
26962847 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
- }
27022848
27032849 if (!test_and_clear_bit(NFS_DELEGATION_TEST_EXPIRED,
27042850 &delegation->flags)) {
2851
+ spin_unlock(&delegation->lock);
27052852 rcu_read_unlock();
2706
- return;
2853
+ return NFS_OK;
27072854 }
27082855
2709
- cred = get_rpccred(delegation->cred);
2856
+ if (delegation->cred)
2857
+ cred = get_cred(delegation->cred);
2858
+ spin_unlock(&delegation->lock);
27102859 rcu_read_unlock();
27112860 status = nfs41_test_and_free_expired_stateid(server, &stateid, cred);
27122861 trace_nfs4_test_delegation_stateid(state, NULL, status);
27132862 if (status == -NFS4ERR_EXPIRED || status == -NFS4ERR_BAD_STATEID)
27142863 nfs_finish_clear_delegation_stateid(state, &stateid);
2864
+ else
2865
+ ret = status;
27152866
2716
- put_rpccred(cred);
2867
+ put_cred(cred);
2868
+ return ret;
2869
+}
2870
+
2871
+static void nfs41_delegation_recover_stateid(struct nfs4_state *state)
2872
+{
2873
+ nfs4_stateid tmp;
2874
+
2875
+ if (test_bit(NFS_DELEGATED_STATE, &state->flags) &&
2876
+ nfs4_copy_delegation_stateid(state->inode, state->state,
2877
+ &tmp, NULL) &&
2878
+ nfs4_stateid_match_other(&state->stateid, &tmp))
2879
+ nfs_state_set_delegation(state, &tmp, state->state);
2880
+ else
2881
+ nfs_state_clear_delegation(state);
27172882 }
27182883
27192884 /**
....@@ -2736,7 +2901,7 @@
27362901 spin_lock(&state->state_lock);
27372902 list_for_each_entry(lsp, &state->lock_states, ls_locks) {
27382903 if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags)) {
2739
- struct rpc_cred *cred = lsp->ls_state->owner->so_cred;
2904
+ const struct cred *cred = lsp->ls_state->owner->so_cred;
27402905
27412906 refcount_inc(&lsp->ls_count);
27422907 spin_unlock(&state->state_lock);
....@@ -2780,24 +2945,15 @@
27802945 {
27812946 struct nfs_server *server = NFS_SERVER(state->inode);
27822947 nfs4_stateid *stateid = &state->open_stateid;
2783
- struct rpc_cred *cred = state->owner->so_cred;
2948
+ const struct cred *cred = state->owner->so_cred;
27842949 int status;
27852950
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
- }
2951
+ if (test_bit(NFS_OPEN_STATE, &state->flags) == 0)
27922952 return -NFS4ERR_BAD_STATEID;
2793
- }
27942953 status = nfs41_test_and_free_expired_stateid(server, stateid, cred);
27952954 trace_nfs4_test_open_stateid(state, NULL, status);
27962955 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);
2956
+ nfs_state_clear_open_state_flags(state);
28012957 stateid->type = NFS4_INVALID_STATEID_TYPE;
28022958 return status;
28032959 }
....@@ -2810,7 +2966,11 @@
28102966 {
28112967 int status;
28122968
2813
- nfs41_check_delegation_stateid(state);
2969
+ status = nfs41_check_delegation_stateid(state);
2970
+ if (status != NFS_OK)
2971
+ return status;
2972
+ nfs41_delegation_recover_stateid(state);
2973
+
28142974 status = nfs41_check_expired_locks(state);
28152975 if (status != NFS_OK)
28162976 return status;
....@@ -2863,18 +3023,20 @@
28633023 }
28643024
28653025 static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
2866
- fmode_t fmode,
2867
- int flags,
2868
- struct nfs_open_context *ctx)
3026
+ int flags, struct nfs_open_context *ctx)
28693027 {
28703028 struct nfs4_state_owner *sp = opendata->owner;
28713029 struct nfs_server *server = sp->so_server;
28723030 struct dentry *dentry;
28733031 struct nfs4_state *state;
3032
+ fmode_t acc_mode = _nfs4_ctx_to_accessmode(ctx);
3033
+ struct inode *dir = d_inode(opendata->dir);
3034
+ unsigned long dir_verifier;
28743035 unsigned int seq;
28753036 int ret;
28763037
28773038 seq = raw_seqcount_begin(&sp->so_reclaim_seqcount);
3039
+ dir_verifier = nfs_save_change_attribute(dir);
28783040
28793041 ret = _nfs4_proc_open(opendata, ctx);
28803042 if (ret != 0)
....@@ -2902,14 +3064,26 @@
29023064 dput(ctx->dentry);
29033065 ctx->dentry = dentry = alias;
29043066 }
2905
- nfs_set_verifier(dentry,
2906
- nfs_save_change_attribute(d_inode(opendata->dir)));
3067
+ }
3068
+
3069
+ switch(opendata->o_arg.claim) {
3070
+ default:
3071
+ break;
3072
+ case NFS4_OPEN_CLAIM_NULL:
3073
+ case NFS4_OPEN_CLAIM_DELEGATE_CUR:
3074
+ case NFS4_OPEN_CLAIM_DELEGATE_PREV:
3075
+ if (!opendata->rpc_done)
3076
+ break;
3077
+ if (opendata->o_res.delegation_type != 0)
3078
+ dir_verifier = nfs_save_change_attribute(dir);
3079
+ nfs_set_verifier(dentry, dir_verifier);
29073080 }
29083081
29093082 /* Parse layoutget results before we check for access */
29103083 pnfs_parse_lgopen(state->inode, opendata->lgp, ctx);
29113084
2912
- ret = nfs4_opendata_access(sp->so_cred, opendata, state, fmode, flags);
3085
+ ret = nfs4_opendata_access(sp->so_cred, opendata, state,
3086
+ acc_mode, flags);
29133087 if (ret != 0)
29143088 goto out;
29153089
....@@ -2920,8 +3094,13 @@
29203094 }
29213095
29223096 out:
2923
- if (!opendata->cancelled)
3097
+ if (!opendata->cancelled) {
3098
+ if (opendata->lgp) {
3099
+ nfs4_lgopen_release(opendata->lgp);
3100
+ opendata->lgp = NULL;
3101
+ }
29243102 nfs4_sequence_free_slot(&opendata->o_res.seq_res);
3103
+ }
29253104 return ret;
29263105 }
29273106
....@@ -2939,9 +3118,9 @@
29393118 struct nfs_server *server = NFS_SERVER(dir);
29403119 struct nfs4_opendata *opendata;
29413120 struct dentry *dentry = ctx->dentry;
2942
- struct rpc_cred *cred = ctx->cred;
3121
+ const struct cred *cred = ctx->cred;
29433122 struct nfs4_threshold **ctx_th = &ctx->mdsthreshold;
2944
- fmode_t fmode = ctx->mode & (FMODE_READ|FMODE_WRITE|FMODE_EXEC);
3123
+ fmode_t fmode = _nfs4_ctx_to_openmode(ctx);
29453124 enum open_claim_type4 claim = NFS4_OPEN_CLAIM_NULL;
29463125 struct iattr *sattr = c->sattr;
29473126 struct nfs4_label *label = c->label;
....@@ -2987,7 +3166,7 @@
29873166 if (d_really_is_positive(dentry))
29883167 opendata->state = nfs4_get_open_state(d_inode(dentry), sp);
29893168
2990
- status = _nfs4_open_and_get_state(opendata, fmode, flags, ctx);
3169
+ status = _nfs4_open_and_get_state(opendata, flags, ctx);
29913170 if (status != 0)
29923171 goto err_free_label;
29933172 state = ctx->state;
....@@ -3047,7 +3226,9 @@
30473226 int *opened)
30483227 {
30493228 struct nfs_server *server = NFS_SERVER(dir);
3050
- struct nfs4_exception exception = { };
3229
+ struct nfs4_exception exception = {
3230
+ .interruptible = true,
3231
+ };
30513232 struct nfs4_state *res;
30523233 struct nfs4_open_createattrs c = {
30533234 .label = label,
....@@ -3114,7 +3295,7 @@
31143295 static int _nfs4_do_setattr(struct inode *inode,
31153296 struct nfs_setattrargs *arg,
31163297 struct nfs_setattrres *res,
3117
- struct rpc_cred *cred,
3298
+ const struct cred *cred,
31183299 struct nfs_open_context *ctx)
31193300 {
31203301 struct nfs_server *server = NFS_SERVER(inode);
....@@ -3124,7 +3305,7 @@
31243305 .rpc_resp = res,
31253306 .rpc_cred = cred,
31263307 };
3127
- struct rpc_cred *delegation_cred = NULL;
3308
+ const struct cred *delegation_cred = NULL;
31283309 unsigned long timestamp = jiffies;
31293310 bool truncate;
31303311 int status;
....@@ -3152,6 +3333,8 @@
31523333 nfs_put_lock_context(l_ctx);
31533334 if (status == -EIO)
31543335 return -EBADF;
3336
+ else if (status == -EAGAIN)
3337
+ goto zero_stateid;
31553338 } else {
31563339 zero_stateid:
31573340 nfs4_stateid_copy(&arg->stateid, &zero_stateid);
....@@ -3161,14 +3344,14 @@
31613344
31623345 status = nfs4_call_sync(server->client, server, &msg, &arg->seq_args, &res->seq_res, 1);
31633346
3164
- put_rpccred(delegation_cred);
3347
+ put_cred(delegation_cred);
31653348 if (status == 0 && ctx != NULL)
31663349 renew_lease(server, timestamp);
31673350 trace_nfs4_setattr(inode, &arg->stateid, status);
31683351 return status;
31693352 }
31703353
3171
-static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred,
3354
+static int nfs4_do_setattr(struct inode *inode, const struct cred *cred,
31723355 struct nfs_fattr *fattr, struct iattr *sattr,
31733356 struct nfs_open_context *ctx, struct nfs4_label *ilabel,
31743357 struct nfs4_label *olabel)
....@@ -3232,6 +3415,102 @@
32323415 return pnfs_wait_on_layoutreturn(inode, task);
32333416 }
32343417
3418
+/*
3419
+ * Update the seqid of an open stateid
3420
+ */
3421
+static void nfs4_sync_open_stateid(nfs4_stateid *dst,
3422
+ struct nfs4_state *state)
3423
+{
3424
+ __be32 seqid_open;
3425
+ u32 dst_seqid;
3426
+ int seq;
3427
+
3428
+ for (;;) {
3429
+ if (!nfs4_valid_open_stateid(state))
3430
+ break;
3431
+ seq = read_seqbegin(&state->seqlock);
3432
+ if (!nfs4_state_match_open_stateid_other(state, dst)) {
3433
+ nfs4_stateid_copy(dst, &state->open_stateid);
3434
+ if (read_seqretry(&state->seqlock, seq))
3435
+ continue;
3436
+ break;
3437
+ }
3438
+ seqid_open = state->open_stateid.seqid;
3439
+ if (read_seqretry(&state->seqlock, seq))
3440
+ continue;
3441
+
3442
+ dst_seqid = be32_to_cpu(dst->seqid);
3443
+ if ((s32)(dst_seqid - be32_to_cpu(seqid_open)) < 0)
3444
+ dst->seqid = seqid_open;
3445
+ break;
3446
+ }
3447
+}
3448
+
3449
+/*
3450
+ * Update the seqid of an open stateid after receiving
3451
+ * NFS4ERR_OLD_STATEID
3452
+ */
3453
+static bool nfs4_refresh_open_old_stateid(nfs4_stateid *dst,
3454
+ struct nfs4_state *state)
3455
+{
3456
+ __be32 seqid_open;
3457
+ u32 dst_seqid;
3458
+ bool ret;
3459
+ int seq, status = -EAGAIN;
3460
+ DEFINE_WAIT(wait);
3461
+
3462
+ for (;;) {
3463
+ ret = false;
3464
+ if (!nfs4_valid_open_stateid(state))
3465
+ break;
3466
+ seq = read_seqbegin(&state->seqlock);
3467
+ if (!nfs4_state_match_open_stateid_other(state, dst)) {
3468
+ if (read_seqretry(&state->seqlock, seq))
3469
+ continue;
3470
+ break;
3471
+ }
3472
+
3473
+ write_seqlock(&state->seqlock);
3474
+ seqid_open = state->open_stateid.seqid;
3475
+
3476
+ dst_seqid = be32_to_cpu(dst->seqid);
3477
+
3478
+ /* Did another OPEN bump the state's seqid? try again: */
3479
+ if ((s32)(be32_to_cpu(seqid_open) - dst_seqid) > 0) {
3480
+ dst->seqid = seqid_open;
3481
+ write_sequnlock(&state->seqlock);
3482
+ ret = true;
3483
+ break;
3484
+ }
3485
+
3486
+ /* server says we're behind but we haven't seen the update yet */
3487
+ set_bit(NFS_STATE_CHANGE_WAIT, &state->flags);
3488
+ prepare_to_wait(&state->waitq, &wait, TASK_KILLABLE);
3489
+ write_sequnlock(&state->seqlock);
3490
+ trace_nfs4_close_stateid_update_wait(state->inode, dst, 0);
3491
+
3492
+ if (fatal_signal_pending(current))
3493
+ status = -EINTR;
3494
+ else
3495
+ if (schedule_timeout(5*HZ) != 0)
3496
+ status = 0;
3497
+
3498
+ finish_wait(&state->waitq, &wait);
3499
+
3500
+ if (!status)
3501
+ continue;
3502
+ if (status == -EINTR)
3503
+ break;
3504
+
3505
+ /* we slept the whole 5 seconds, we must have lost a seqid */
3506
+ dst->seqid = cpu_to_be32(dst_seqid + 1);
3507
+ ret = true;
3508
+ break;
3509
+ }
3510
+
3511
+ return ret;
3512
+}
3513
+
32353514 struct nfs4_closedata {
32363515 struct inode *inode;
32373516 struct nfs4_state *state;
....@@ -3282,32 +3561,9 @@
32823561 trace_nfs4_close(state, &calldata->arg, &calldata->res, task->tk_status);
32833562
32843563 /* 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
- }
3564
+ if (pnfs_roc_done(task, &calldata->arg.lr_args, &calldata->res.lr_res,
3565
+ &calldata->res.lr_ret) == -EAGAIN)
3566
+ goto out_restart;
33113567
33123568 /* hmm. we are done with the inode, and in the process of freeing
33133569 * the state_owner. we keep this around to process errors
....@@ -3327,7 +3583,7 @@
33273583 break;
33283584 case -NFS4ERR_OLD_STATEID:
33293585 /* Did we race with OPEN? */
3330
- if (nfs4_refresh_open_stateid(&calldata->arg.stateid,
3586
+ if (nfs4_refresh_open_old_stateid(&calldata->arg.stateid,
33313587 state))
33323588 goto out_restart;
33333589 goto out_release;
....@@ -3337,9 +3593,11 @@
33373593 nfs4_free_revoked_stateid(server,
33383594 &calldata->arg.stateid,
33393595 task->tk_msg.rpc_cred);
3340
- /* Fallthrough */
3596
+ fallthrough;
33413597 case -NFS4ERR_BAD_STATEID:
3342
- break;
3598
+ if (calldata->arg.fmode == 0)
3599
+ break;
3600
+ fallthrough;
33433601 default:
33443602 task->tk_status = nfs4_async_handle_exception(task,
33453603 server, task->tk_status, &exception);
....@@ -3354,8 +3612,6 @@
33543612 nfs_refresh_inode(calldata->inode, &calldata->fattr);
33553613 dprintk("%s: done, ret = %d!\n", __func__, task->tk_status);
33563614 return;
3357
-lr_restart:
3358
- calldata->res.lr_ret = 0;
33593615 out_restart:
33603616 task->tk_status = 0;
33613617 rpc_restart_call_prepare(task);
....@@ -3367,6 +3623,7 @@
33673623 struct nfs4_closedata *calldata = data;
33683624 struct nfs4_state *state = calldata->state;
33693625 struct inode *inode = calldata->inode;
3626
+ struct nfs_server *server = NFS_SERVER(inode);
33703627 struct pnfs_layout_hdr *lo;
33713628 bool is_rdonly, is_wronly, is_rdwr;
33723629 int call_close = 0;
....@@ -3396,8 +3653,8 @@
33963653 } else if (is_rdwr)
33973654 calldata->arg.fmode |= FMODE_READ|FMODE_WRITE;
33983655
3399
- if (!nfs4_valid_open_stateid(state) ||
3400
- !nfs4_refresh_open_stateid(&calldata->arg.stateid, state))
3656
+ nfs4_sync_open_stateid(&calldata->arg.stateid, state);
3657
+ if (!nfs4_valid_open_stateid(state))
34013658 call_close = 0;
34023659 spin_unlock(&state->owner->so_lock);
34033660
....@@ -3422,9 +3679,12 @@
34223679
34233680 if (calldata->arg.fmode == 0 || calldata->arg.fmode == FMODE_READ) {
34243681 /* 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
3682
+ if (!nfs4_have_delegation(inode, FMODE_READ)) {
3683
+ nfs4_bitmask_set(calldata->arg.bitmask_store,
3684
+ server->cache_consistency_bitmask,
3685
+ inode, server, NULL);
3686
+ calldata->arg.bitmask = calldata->arg.bitmask_store;
3687
+ } else
34283688 calldata->arg.bitmask = NULL;
34293689 }
34303690
....@@ -3483,7 +3743,7 @@
34833743 .rpc_message = &msg,
34843744 .callback_ops = &nfs4_close_ops,
34853745 .workqueue = nfsiod_workqueue,
3486
- .flags = RPC_TASK_ASYNC,
3746
+ .flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF,
34873747 };
34883748 int status = -ENOMEM;
34893749
....@@ -3543,7 +3803,7 @@
35433803 int open_flags, struct iattr *attr, int *opened)
35443804 {
35453805 struct nfs4_state *state;
3546
- struct nfs4_label l = {0, 0, 0, NULL}, *label = NULL;
3806
+ struct nfs4_label l, *label;
35473807
35483808 label = nfs4_label_init_security(dir, ctx->dentry, attr, &l);
35493809
....@@ -3562,14 +3822,14 @@
35623822 if (ctx->state == NULL)
35633823 return;
35643824 if (is_sync)
3565
- nfs4_close_sync(ctx->state, ctx->mode);
3825
+ nfs4_close_sync(ctx->state, _nfs4_ctx_to_openmode(ctx));
35663826 else
3567
- nfs4_close_state(ctx->state, ctx->mode);
3827
+ nfs4_close_state(ctx->state, _nfs4_ctx_to_openmode(ctx));
35683828 }
35693829
35703830 #define FATTR4_WORD1_NFS40_MASK (2*FATTR4_WORD1_MOUNTED_ON_FILEID - 1UL)
35713831 #define FATTR4_WORD2_NFS41_MASK (2*FATTR4_WORD2_SUPPATTR_EXCLCREAT - 1UL)
3572
-#define FATTR4_WORD2_NFS42_MASK (2*FATTR4_WORD2_MODE_UMASK - 1UL)
3832
+#define FATTR4_WORD2_NFS42_MASK (2*FATTR4_WORD2_XATTR_SUPPORT - 1UL)
35733833
35743834 static int _nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
35753835 {
....@@ -3667,7 +3927,9 @@
36673927
36683928 int nfs4_server_capabilities(struct nfs_server *server, struct nfs_fh *fhandle)
36693929 {
3670
- struct nfs4_exception exception = { };
3930
+ struct nfs4_exception exception = {
3931
+ .interruptible = true,
3932
+ };
36713933 int err;
36723934 do {
36733935 err = nfs4_handle_exception(server,
....@@ -3709,7 +3971,9 @@
37093971 static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle,
37103972 struct nfs_fsinfo *info)
37113973 {
3712
- struct nfs4_exception exception = { };
3974
+ struct nfs4_exception exception = {
3975
+ .interruptible = true,
3976
+ };
37133977 int err;
37143978 do {
37153979 err = _nfs4_lookup_root(server, fhandle, info);
....@@ -3784,7 +4048,7 @@
37844048 }
37854049
37864050 /*
3787
- * -EACCESS could mean that the user doesn't have correct permissions
4051
+ * -EACCES could mean that the user doesn't have correct permissions
37884052 * to access the mount. It could also mean that we tried to mount
37894053 * with a gss auth flavor, but rpc.gssd isn't running. Either way,
37904054 * existing mount programs don't handle -EACCES very well so it should
....@@ -3830,7 +4094,7 @@
38304094 {
38314095 int error;
38324096 struct nfs_fattr *fattr = info->fattr;
3833
- struct nfs4_label *label = NULL;
4097
+ struct nfs4_label *label = fattr->label;
38344098
38354099 error = nfs4_server_capabilities(server, mntfh);
38364100 if (error < 0) {
....@@ -3838,23 +4102,17 @@
38384102 return error;
38394103 }
38404104
3841
- label = nfs4_label_alloc(server, GFP_KERNEL);
3842
- if (IS_ERR(label))
3843
- return PTR_ERR(label);
3844
-
38454105 error = nfs4_proc_getattr(server, mntfh, fattr, label, NULL);
38464106 if (error < 0) {
38474107 dprintk("nfs4_get_root: getattr error = %d\n", -error);
3848
- goto err_free_label;
4108
+ goto out;
38494109 }
38504110
38514111 if (fattr->valid & NFS_ATTR_FATTR_FSID &&
38524112 !nfs_fsid_equal(&server->fsid, &fattr->fsid))
38534113 memcpy(&server->fsid, &fattr->fsid, sizeof(server->fsid));
38544114
3855
-err_free_label:
3856
- nfs4_label_free(label);
3857
-
4115
+out:
38584116 return error;
38594117 }
38604118
....@@ -3925,18 +4183,27 @@
39254183 .rpc_argp = &args,
39264184 .rpc_resp = &res,
39274185 };
4186
+ unsigned short task_flags = 0;
4187
+
4188
+ /* Is this is an attribute revalidation, subject to softreval? */
4189
+ if (inode && (server->flags & NFS_MOUNT_SOFTREVAL))
4190
+ task_flags |= RPC_TASK_TIMEOUT;
39284191
39294192 nfs4_bitmap_copy_adjust(bitmask, nfs4_bitmask(server, label), inode);
39304193
39314194 nfs_fattr_init(fattr);
3932
- return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
4195
+ nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
4196
+ return nfs4_do_call_sync(server->client, server, &msg,
4197
+ &args.seq_args, &res.seq_res, task_flags);
39334198 }
39344199
3935
-static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
4200
+int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
39364201 struct nfs_fattr *fattr, struct nfs4_label *label,
39374202 struct inode *inode)
39384203 {
3939
- struct nfs4_exception exception = { };
4204
+ struct nfs4_exception exception = {
4205
+ .interruptible = true,
4206
+ };
39404207 int err;
39414208 do {
39424209 err = _nfs4_proc_getattr(server, fhandle, fattr, label, inode);
....@@ -3969,7 +4236,7 @@
39694236 struct iattr *sattr)
39704237 {
39714238 struct inode *inode = d_inode(dentry);
3972
- struct rpc_cred *cred = NULL;
4239
+ const struct cred *cred = NULL;
39734240 struct nfs_open_context *ctx = NULL;
39744241 struct nfs4_label *label = NULL;
39754242 int status;
....@@ -4015,7 +4282,7 @@
40154282 }
40164283
40174284 static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir,
4018
- const struct qstr *name, struct nfs_fh *fhandle,
4285
+ struct dentry *dentry, struct nfs_fh *fhandle,
40194286 struct nfs_fattr *fattr, struct nfs4_label *label)
40204287 {
40214288 struct nfs_server *server = NFS_SERVER(dir);
....@@ -4023,7 +4290,7 @@
40234290 struct nfs4_lookup_arg args = {
40244291 .bitmask = server->attr_bitmask,
40254292 .dir_fh = NFS_FH(dir),
4026
- .name = name,
4293
+ .name = &dentry->d_name,
40274294 };
40284295 struct nfs4_lookup_res res = {
40294296 .server = server,
....@@ -4036,13 +4303,20 @@
40364303 .rpc_argp = &args,
40374304 .rpc_resp = &res,
40384305 };
4306
+ unsigned short task_flags = 0;
4307
+
4308
+ /* Is this is an attribute revalidation, subject to softreval? */
4309
+ if (nfs_lookup_is_soft_revalidate(dentry))
4310
+ task_flags |= RPC_TASK_TIMEOUT;
40394311
40404312 args.bitmask = nfs4_bitmask(server, label);
40414313
40424314 nfs_fattr_init(fattr);
40434315
4044
- dprintk("NFS call lookup %s\n", name->name);
4045
- status = nfs4_call_sync(clnt, server, &msg, &args.seq_args, &res.seq_res, 0);
4316
+ dprintk("NFS call lookup %pd2\n", dentry);
4317
+ nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
4318
+ status = nfs4_do_call_sync(clnt, server, &msg,
4319
+ &args.seq_args, &res.seq_res, task_flags);
40464320 dprintk("NFS reply lookup: %d\n", status);
40474321 return status;
40484322 }
....@@ -4056,14 +4330,17 @@
40564330 }
40574331
40584332 static int nfs4_proc_lookup_common(struct rpc_clnt **clnt, struct inode *dir,
4059
- const struct qstr *name, struct nfs_fh *fhandle,
4333
+ struct dentry *dentry, struct nfs_fh *fhandle,
40604334 struct nfs_fattr *fattr, struct nfs4_label *label)
40614335 {
4062
- struct nfs4_exception exception = { };
4336
+ struct nfs4_exception exception = {
4337
+ .interruptible = true,
4338
+ };
40634339 struct rpc_clnt *client = *clnt;
4340
+ const struct qstr *name = &dentry->d_name;
40644341 int err;
40654342 do {
4066
- err = _nfs4_proc_lookup(client, dir, name, fhandle, fattr, label);
4343
+ err = _nfs4_proc_lookup(client, dir, dentry, fhandle, fattr, label);
40674344 trace_nfs4_lookup(dir, name, err);
40684345 switch (err) {
40694346 case -NFS4ERR_BADNAME:
....@@ -4098,14 +4375,14 @@
40984375 return err;
40994376 }
41004377
4101
-static int nfs4_proc_lookup(struct inode *dir, const struct qstr *name,
4378
+static int nfs4_proc_lookup(struct inode *dir, struct dentry *dentry,
41024379 struct nfs_fh *fhandle, struct nfs_fattr *fattr,
41034380 struct nfs4_label *label)
41044381 {
41054382 int status;
41064383 struct rpc_clnt *client = NFS_CLIENT(dir);
41074384
4108
- status = nfs4_proc_lookup_common(&client, dir, name, fhandle, fattr, label);
4385
+ status = nfs4_proc_lookup_common(&client, dir, dentry, fhandle, fattr, label);
41094386 if (client != NFS_CLIENT(dir)) {
41104387 rpc_shutdown_client(client);
41114388 nfs_fixup_secinfo_attributes(fattr);
....@@ -4114,13 +4391,13 @@
41144391 }
41154392
41164393 struct rpc_clnt *
4117
-nfs4_proc_lookup_mountpoint(struct inode *dir, const struct qstr *name,
4394
+nfs4_proc_lookup_mountpoint(struct inode *dir, struct dentry *dentry,
41184395 struct nfs_fh *fhandle, struct nfs_fattr *fattr)
41194396 {
41204397 struct rpc_clnt *client = NFS_CLIENT(dir);
41214398 int status;
41224399
4123
- status = nfs4_proc_lookup_common(&client, dir, name, fhandle, fattr, NULL);
4400
+ status = nfs4_proc_lookup_common(&client, dir, dentry, fhandle, fattr, NULL);
41244401 if (status < 0)
41254402 return ERR_PTR(status);
41264403 return (client == NFS_CLIENT(dir)) ? rpc_clone_client(client) : client;
....@@ -4163,7 +4440,9 @@
41634440 static int nfs4_proc_lookupp(struct inode *inode, struct nfs_fh *fhandle,
41644441 struct nfs_fattr *fattr, struct nfs4_label *label)
41654442 {
4166
- struct nfs4_exception exception = { };
4443
+ struct nfs4_exception exception = {
4444
+ .interruptible = true,
4445
+ };
41674446 int err;
41684447 do {
41694448 err = _nfs4_proc_lookupp(inode, fhandle, fattr, label);
....@@ -4198,7 +4477,6 @@
41984477 return -ENOMEM;
41994478 args.bitmask = server->cache_consistency_bitmask;
42004479 }
4201
-
42024480 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0);
42034481 if (!status) {
42044482 nfs_access_set_mask(entry, res.access);
....@@ -4211,7 +4489,9 @@
42114489
42124490 static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry)
42134491 {
4214
- struct nfs4_exception exception = { };
4492
+ struct nfs4_exception exception = {
4493
+ .interruptible = true,
4494
+ };
42154495 int err;
42164496 do {
42174497 err = _nfs4_proc_access(inode, entry);
....@@ -4266,7 +4546,9 @@
42664546 static int nfs4_proc_readlink(struct inode *inode, struct page *page,
42674547 unsigned int pgbase, unsigned int pglen)
42684548 {
4269
- struct nfs4_exception exception = { };
4549
+ struct nfs4_exception exception = {
4550
+ .interruptible = true,
4551
+ };
42704552 int err;
42714553 do {
42724554 err = _nfs4_proc_readlink(inode, page, pgbase, pglen);
....@@ -4285,7 +4567,7 @@
42854567 int flags)
42864568 {
42874569 struct nfs_server *server = NFS_SERVER(dir);
4288
- struct nfs4_label l, *ilabel = NULL;
4570
+ struct nfs4_label l, *ilabel;
42894571 struct nfs_open_context *ctx;
42904572 struct nfs4_state *state;
42914573 int status = 0;
....@@ -4331,7 +4613,8 @@
43314613 status = nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 1);
43324614 if (status == 0) {
43334615 spin_lock(&dir->i_lock);
4334
- update_changeattr_locked(dir, &res.cinfo, timestamp, 0);
4616
+ nfs4_update_changeattr_locked(dir, &res.cinfo, timestamp,
4617
+ NFS_INO_INVALID_DATA);
43354618 /* Removing a directory decrements nlink in the parent */
43364619 if (ftype == NF4DIR && dir->i_nlink > 2)
43374620 nfs4_dec_nlink_locked(dir);
....@@ -4342,7 +4625,9 @@
43424625
43434626 static int nfs4_proc_remove(struct inode *dir, struct dentry *dentry)
43444627 {
4345
- struct nfs4_exception exception = { };
4628
+ struct nfs4_exception exception = {
4629
+ .interruptible = true,
4630
+ };
43464631 struct inode *inode = d_inode(dentry);
43474632 int err;
43484633
....@@ -4363,7 +4648,9 @@
43634648
43644649 static int nfs4_proc_rmdir(struct inode *dir, const struct qstr *name)
43654650 {
4366
- struct nfs4_exception exception = { };
4651
+ struct nfs4_exception exception = {
4652
+ .interruptible = true,
4653
+ };
43674654 int err;
43684655
43694656 do {
....@@ -4411,8 +4698,9 @@
44114698 &data->timeout) == -EAGAIN)
44124699 return 0;
44134700 if (task->tk_status == 0)
4414
- update_changeattr(dir, &res->cinfo,
4415
- res->dir_attr->time_start, 0);
4701
+ nfs4_update_changeattr(dir, &res->cinfo,
4702
+ res->dir_attr->time_start,
4703
+ NFS_INO_INVALID_DATA);
44164704 return 1;
44174705 }
44184706
....@@ -4456,16 +4744,18 @@
44564744 if (task->tk_status == 0) {
44574745 if (new_dir != old_dir) {
44584746 /* Note: If we moved a directory, nlink will change */
4459
- update_changeattr(old_dir, &res->old_cinfo,
4747
+ nfs4_update_changeattr(old_dir, &res->old_cinfo,
44604748 res->old_fattr->time_start,
4461
- NFS_INO_INVALID_OTHER);
4462
- update_changeattr(new_dir, &res->new_cinfo,
4749
+ NFS_INO_INVALID_OTHER |
4750
+ NFS_INO_INVALID_DATA);
4751
+ nfs4_update_changeattr(new_dir, &res->new_cinfo,
44634752 res->new_fattr->time_start,
4464
- NFS_INO_INVALID_OTHER);
4753
+ NFS_INO_INVALID_OTHER |
4754
+ NFS_INO_INVALID_DATA);
44654755 } else
4466
- update_changeattr(old_dir, &res->old_cinfo,
4756
+ nfs4_update_changeattr(old_dir, &res->old_cinfo,
44674757 res->old_fattr->time_start,
4468
- 0);
4758
+ NFS_INO_INVALID_DATA);
44694759 }
44704760 return 1;
44714761 }
....@@ -4506,7 +4796,8 @@
45064796
45074797 status = nfs4_call_sync(server->client, server, &msg, &arg.seq_args, &res.seq_res, 1);
45084798 if (!status) {
4509
- update_changeattr(dir, &res.cinfo, res.fattr->time_start, 0);
4799
+ nfs4_update_changeattr(dir, &res.cinfo, res.fattr->time_start,
4800
+ NFS_INO_INVALID_DATA);
45104801 status = nfs_post_op_update_inode(inode, res.fattr);
45114802 if (!status)
45124803 nfs_setsecurity(inode, res.fattr, res.label);
....@@ -4522,7 +4813,9 @@
45224813
45234814 static int nfs4_proc_link(struct inode *inode, struct inode *dir, const struct qstr *name)
45244815 {
4525
- struct nfs4_exception exception = { };
4816
+ struct nfs4_exception exception = {
4817
+ .interruptible = true,
4818
+ };
45264819 int err;
45274820 do {
45284821 err = nfs4_handle_exception(NFS_SERVER(inode),
....@@ -4582,8 +4875,9 @@
45824875 &data->arg.seq_args, &data->res.seq_res, 1);
45834876 if (status == 0) {
45844877 spin_lock(&dir->i_lock);
4585
- update_changeattr_locked(dir, &data->res.dir_cinfo,
4586
- data->res.fattr->time_start, 0);
4878
+ nfs4_update_changeattr_locked(dir, &data->res.dir_cinfo,
4879
+ data->res.fattr->time_start,
4880
+ NFS_INO_INVALID_DATA);
45874881 /* Creating a directory bumps nlink in the parent */
45884882 if (data->arg.ftype == NF4DIR)
45894883 nfs4_inc_nlink_locked(dir);
....@@ -4629,8 +4923,10 @@
46294923 static int nfs4_proc_symlink(struct inode *dir, struct dentry *dentry,
46304924 struct page *page, unsigned int len, struct iattr *sattr)
46314925 {
4632
- struct nfs4_exception exception = { };
4633
- struct nfs4_label l, *label = NULL;
4926
+ struct nfs4_exception exception = {
4927
+ .interruptible = true,
4928
+ };
4929
+ struct nfs4_label l, *label;
46344930 int err;
46354931
46364932 label = nfs4_label_init_security(dir, dentry, sattr, &l);
....@@ -4668,8 +4964,10 @@
46684964 struct iattr *sattr)
46694965 {
46704966 struct nfs_server *server = NFS_SERVER(dir);
4671
- struct nfs4_exception exception = { };
4672
- struct nfs4_label l, *label = NULL;
4967
+ struct nfs4_exception exception = {
4968
+ .interruptible = true,
4969
+ };
4970
+ struct nfs4_label l, *label;
46734971 int err;
46744972
46754973 label = nfs4_label_init_security(dir, dentry, sattr, &l);
....@@ -4687,7 +4985,7 @@
46874985 return err;
46884986 }
46894987
4690
-static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
4988
+static int _nfs4_proc_readdir(struct dentry *dentry, const struct cred *cred,
46914989 u64 cookie, struct page **pages, unsigned int count, bool plus)
46924990 {
46934991 struct inode *dir = d_inode(dentry);
....@@ -4731,10 +5029,12 @@
47315029 return status;
47325030 }
47335031
4734
-static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred,
5032
+static int nfs4_proc_readdir(struct dentry *dentry, const struct cred *cred,
47355033 u64 cookie, struct page **pages, unsigned int count, bool plus)
47365034 {
4737
- struct nfs4_exception exception = { };
5035
+ struct nfs4_exception exception = {
5036
+ .interruptible = true,
5037
+ };
47385038 int err;
47395039 do {
47405040 err = _nfs4_proc_readdir(dentry, cred, cookie,
....@@ -4785,8 +5085,10 @@
47855085 struct iattr *sattr, dev_t rdev)
47865086 {
47875087 struct nfs_server *server = NFS_SERVER(dir);
4788
- struct nfs4_exception exception = { };
4789
- struct nfs4_label l, *label = NULL;
5088
+ struct nfs4_exception exception = {
5089
+ .interruptible = true,
5090
+ };
5091
+ struct nfs4_label l, *label;
47905092 int err;
47915093
47925094 label = nfs4_label_init_security(dir, dentry, sattr, &l);
....@@ -4827,7 +5129,9 @@
48275129
48285130 static int nfs4_proc_statfs(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsstat *fsstat)
48295131 {
4830
- struct nfs4_exception exception = { };
5132
+ struct nfs4_exception exception = {
5133
+ .interruptible = true,
5134
+ };
48315135 int err;
48325136 do {
48335137 err = nfs4_handle_exception(server,
....@@ -4858,17 +5162,16 @@
48585162
48595163 static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fsinfo *fsinfo)
48605164 {
4861
- struct nfs4_exception exception = { };
4862
- unsigned long now = jiffies;
5165
+ struct nfs4_exception exception = {
5166
+ .interruptible = true,
5167
+ };
48635168 int err;
48645169
48655170 do {
48665171 err = _nfs4_do_fsinfo(server, fhandle, fsinfo);
48675172 trace_nfs4_fsinfo(server, fhandle, fsinfo->fattr, err);
48685173 if (err == 0) {
4869
- nfs4_set_lease_period(server->nfs_client,
4870
- fsinfo->lease_time * HZ,
4871
- now);
5174
+ nfs4_set_lease_period(server->nfs_client, fsinfo->lease_time * HZ);
48725175 break;
48735176 }
48745177 err = nfs4_handle_exception(server, err, &exception);
....@@ -4920,7 +5223,9 @@
49205223 static int nfs4_proc_pathconf(struct nfs_server *server, struct nfs_fh *fhandle,
49215224 struct nfs_pathconf *pathconf)
49225225 {
4923
- struct nfs4_exception exception = { };
5226
+ struct nfs4_exception exception = {
5227
+ .interruptible = true,
5228
+ };
49245229 int err;
49255230
49265231 do {
....@@ -4945,12 +5250,12 @@
49455250 const struct nfs_lock_context *l_ctx,
49465251 fmode_t fmode)
49475252 {
4948
- nfs4_stateid current_stateid;
5253
+ nfs4_stateid _current_stateid;
49495254
49505255 /* If the current stateid represents a lost lock, then exit */
4951
- if (nfs4_set_rw_stateid(&current_stateid, ctx, l_ctx, fmode) == -EIO)
5256
+ if (nfs4_set_rw_stateid(&_current_stateid, ctx, l_ctx, fmode) == -EIO)
49525257 return true;
4953
- return nfs4_stateid_match(stateid, &current_stateid);
5258
+ return nfs4_stateid_match(stateid, &_current_stateid);
49545259 }
49555260
49565261 static bool nfs4_error_stateid_expired(int err)
....@@ -5006,14 +5311,31 @@
50065311 return true;
50075312 }
50085313
5314
+static bool nfs4_read_plus_not_supported(struct rpc_task *task,
5315
+ struct nfs_pgio_header *hdr)
5316
+{
5317
+ struct nfs_server *server = NFS_SERVER(hdr->inode);
5318
+ struct rpc_message *msg = &task->tk_msg;
5319
+
5320
+ if (msg->rpc_proc == &nfs4_procedures[NFSPROC4_CLNT_READ_PLUS] &&
5321
+ server->caps & NFS_CAP_READ_PLUS && task->tk_status == -ENOTSUPP) {
5322
+ server->caps &= ~NFS_CAP_READ_PLUS;
5323
+ msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
5324
+ rpc_restart_call_prepare(task);
5325
+ return true;
5326
+ }
5327
+ return false;
5328
+}
5329
+
50095330 static int nfs4_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr)
50105331 {
5011
-
50125332 dprintk("--> %s\n", __func__);
50135333
50145334 if (!nfs4_sequence_done(task, &hdr->res.seq_res))
50155335 return -EAGAIN;
50165336 if (nfs4_read_stateid_changed(task, &hdr->args))
5337
+ return -EAGAIN;
5338
+ if (nfs4_read_plus_not_supported(task, hdr))
50175339 return -EAGAIN;
50185340 if (task->tk_status > 0)
50195341 nfs_invalidate_atime(hdr->inode);
....@@ -5021,13 +5343,28 @@
50215343 nfs4_read_done_cb(task, hdr);
50225344 }
50235345
5346
+#if defined CONFIG_NFS_V4_2 && defined CONFIG_NFS_V4_2_READ_PLUS
5347
+static void nfs42_read_plus_support(struct nfs_server *server, struct rpc_message *msg)
5348
+{
5349
+ if (server->caps & NFS_CAP_READ_PLUS)
5350
+ msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ_PLUS];
5351
+ else
5352
+ msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
5353
+}
5354
+#else
5355
+static void nfs42_read_plus_support(struct nfs_server *server, struct rpc_message *msg)
5356
+{
5357
+ msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
5358
+}
5359
+#endif /* CONFIG_NFS_V4_2 */
5360
+
50245361 static void nfs4_proc_read_setup(struct nfs_pgio_header *hdr,
50255362 struct rpc_message *msg)
50265363 {
50275364 hdr->timestamp = jiffies;
50285365 if (!hdr->pgio_done_cb)
50295366 hdr->pgio_done_cb = nfs4_read_done_cb;
5030
- msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];
5367
+ nfs42_read_plus_support(NFS_SERVER(hdr->inode), msg);
50315368 nfs4_init_sequence(&hdr->args.seq_args, &hdr->res.seq_res, 0, 0);
50325369 }
50335370
....@@ -5111,6 +5448,43 @@
51115448 return nfs4_have_delegation(hdr->inode, FMODE_READ) == 0;
51125449 }
51135450
5451
+static void nfs4_bitmask_set(__u32 bitmask[NFS4_BITMASK_SZ], const __u32 *src,
5452
+ struct inode *inode, struct nfs_server *server,
5453
+ struct nfs4_label *label)
5454
+{
5455
+ unsigned long cache_validity = READ_ONCE(NFS_I(inode)->cache_validity);
5456
+ unsigned int i;
5457
+
5458
+ memcpy(bitmask, src, sizeof(*bitmask) * NFS4_BITMASK_SZ);
5459
+
5460
+ if (cache_validity & (NFS_INO_INVALID_CHANGE | NFS_INO_REVAL_PAGECACHE))
5461
+ bitmask[0] |= FATTR4_WORD0_CHANGE;
5462
+ if (cache_validity & NFS_INO_INVALID_ATIME)
5463
+ bitmask[1] |= FATTR4_WORD1_TIME_ACCESS;
5464
+ if (cache_validity & NFS_INO_INVALID_OTHER)
5465
+ bitmask[1] |= FATTR4_WORD1_MODE | FATTR4_WORD1_OWNER |
5466
+ FATTR4_WORD1_OWNER_GROUP |
5467
+ FATTR4_WORD1_NUMLINKS;
5468
+ if (label && label->len && cache_validity & NFS_INO_INVALID_LABEL)
5469
+ bitmask[2] |= FATTR4_WORD2_SECURITY_LABEL;
5470
+ if (cache_validity & NFS_INO_INVALID_CTIME)
5471
+ bitmask[1] |= FATTR4_WORD1_TIME_METADATA;
5472
+ if (cache_validity & NFS_INO_INVALID_MTIME)
5473
+ bitmask[1] |= FATTR4_WORD1_TIME_MODIFY;
5474
+ if (cache_validity & NFS_INO_INVALID_BLOCKS)
5475
+ bitmask[1] |= FATTR4_WORD1_SPACE_USED;
5476
+
5477
+ if (nfs4_have_delegation(inode, FMODE_READ) &&
5478
+ !(cache_validity & NFS_INO_REVAL_FORCED))
5479
+ bitmask[0] &= ~FATTR4_WORD0_SIZE;
5480
+ else if (cache_validity &
5481
+ (NFS_INO_INVALID_SIZE | NFS_INO_REVAL_PAGECACHE))
5482
+ bitmask[0] |= FATTR4_WORD0_SIZE;
5483
+
5484
+ for (i = 0; i < NFS4_BITMASK_SZ; i++)
5485
+ bitmask[i] &= server->attr_bitmask[i];
5486
+}
5487
+
51145488 static void nfs4_proc_write_setup(struct nfs_pgio_header *hdr,
51155489 struct rpc_message *msg,
51165490 struct rpc_clnt **clnt)
....@@ -5120,8 +5494,12 @@
51205494 if (!nfs4_write_need_cache_consistency_data(hdr)) {
51215495 hdr->args.bitmask = NULL;
51225496 hdr->res.fattr = NULL;
5123
- } else
5124
- hdr->args.bitmask = server->cache_consistency_bitmask;
5497
+ } else {
5498
+ nfs4_bitmask_set(hdr->args.bitmask_store,
5499
+ server->cache_consistency_bitmask,
5500
+ hdr->inode, server, NULL);
5501
+ hdr->args.bitmask = hdr->args.bitmask_store;
5502
+ }
51255503
51265504 if (!hdr->pgio_done_cb)
51275505 hdr->pgio_done_cb = nfs4_write_done_cb;
....@@ -5259,7 +5637,7 @@
52595637 .rpc_release = nfs4_renew_release,
52605638 };
52615639
5262
-static int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred, unsigned renew_flags)
5640
+static int nfs4_proc_async_renew(struct nfs_client *clp, const struct cred *cred, unsigned renew_flags)
52635641 {
52645642 struct rpc_message msg = {
52655643 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
....@@ -5283,7 +5661,7 @@
52835661 &nfs4_renew_ops, data);
52845662 }
52855663
5286
-static int nfs4_proc_renew(struct nfs_client *clp, struct rpc_cred *cred)
5664
+static int nfs4_proc_renew(struct nfs_client *clp, const struct cred *cred)
52875665 {
52885666 struct rpc_message msg = {
52895667 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RENEW],
....@@ -5311,7 +5689,7 @@
53115689 */
53125690 #define NFS4ACL_MAXPAGES DIV_ROUND_UP(XATTR_SIZE_MAX, PAGE_SIZE)
53135691
5314
-static int buf_to_pages_noslab(const void *buf, size_t buflen,
5692
+int nfs4_buf_to_pages_noslab(const void *buf, size_t buflen,
53155693 struct page **pages)
53165694 {
53175695 struct page *newpage, **spages;
....@@ -5343,7 +5721,7 @@
53435721 struct nfs4_cached_acl {
53445722 int cached;
53455723 size_t len;
5346
- char data[0];
5724
+ char data[];
53475725 };
53485726
53495727 static void nfs4_set_cached_acl(struct inode *inode, struct nfs4_cached_acl *acl)
....@@ -5420,10 +5798,9 @@
54205798 */
54215799 static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
54225800 {
5423
- struct page *pages[NFS4ACL_MAXPAGES + 1] = {NULL, };
5801
+ struct page **pages;
54245802 struct nfs_getaclargs args = {
54255803 .fh = NFS_FH(inode),
5426
- .acl_pages = pages,
54275804 .acl_len = buflen,
54285805 };
54295806 struct nfs_getaclres res = {
....@@ -5434,11 +5811,19 @@
54345811 .rpc_argp = &args,
54355812 .rpc_resp = &res,
54365813 };
5437
- unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE) + 1;
5814
+ unsigned int npages;
54385815 int ret = -ENOMEM, i;
5816
+ struct nfs_server *server = NFS_SERVER(inode);
54395817
5440
- if (npages > ARRAY_SIZE(pages))
5441
- return -ERANGE;
5818
+ if (buflen == 0)
5819
+ buflen = server->rsize;
5820
+
5821
+ npages = DIV_ROUND_UP(buflen, PAGE_SIZE) + 1;
5822
+ pages = kmalloc_array(npages, sizeof(struct page *), GFP_NOFS);
5823
+ if (!pages)
5824
+ return -ENOMEM;
5825
+
5826
+ args.acl_pages = pages;
54425827
54435828 for (i = 0; i < npages; i++) {
54445829 pages[i] = alloc_page(GFP_KERNEL);
....@@ -5479,17 +5864,19 @@
54795864 out_ok:
54805865 ret = res.acl_len;
54815866 out_free:
5482
- for (i = 0; i < npages; i++)
5483
- if (pages[i])
5484
- __free_page(pages[i]);
5867
+ while (--i >= 0)
5868
+ __free_page(pages[i]);
54855869 if (res.acl_scratch)
54865870 __free_page(res.acl_scratch);
5871
+ kfree(pages);
54875872 return ret;
54885873 }
54895874
54905875 static ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
54915876 {
5492
- struct nfs4_exception exception = { };
5877
+ struct nfs4_exception exception = {
5878
+ .interruptible = true,
5879
+ };
54935880 ssize_t ret;
54945881 do {
54955882 ret = __nfs4_get_acl_uncached(inode, buf, buflen);
....@@ -5546,7 +5933,7 @@
55465933 return -EOPNOTSUPP;
55475934 if (npages > ARRAY_SIZE(pages))
55485935 return -ERANGE;
5549
- i = buf_to_pages_noslab(buf, buflen, arg.acl_pages);
5936
+ i = nfs4_buf_to_pages_noslab(buf, buflen, arg.acl_pages);
55505937 if (i < 0)
55515938 return i;
55525939 nfs4_inode_make_writeable(inode);
....@@ -5632,7 +6019,9 @@
56326019 static int nfs4_get_security_label(struct inode *inode, void *buf,
56336020 size_t buflen)
56346021 {
5635
- struct nfs4_exception exception = { };
6022
+ struct nfs4_exception exception = {
6023
+ .interruptible = true,
6024
+ };
56366025 int err;
56376026
56386027 if (!nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL))
....@@ -5707,7 +6096,6 @@
57076096 {
57086097 struct nfs4_label ilabel, *olabel = NULL;
57096098 struct nfs_fattr fattr;
5710
- struct rpc_cred *cred;
57116099 int status;
57126100
57136101 if (!nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL))
....@@ -5719,10 +6107,6 @@
57196107 ilabel.lfs = 0;
57206108 ilabel.label = (char *)buf;
57216109 ilabel.len = buflen;
5722
-
5723
- cred = rpc_lookup_cred();
5724
- if (IS_ERR(cred))
5725
- return PTR_ERR(cred);
57266110
57276111 olabel = nfs4_label_alloc(NFS_SERVER(inode), GFP_KERNEL);
57286112 if (IS_ERR(olabel)) {
....@@ -5736,7 +6120,6 @@
57366120
57376121 nfs4_label_free(olabel);
57386122 out:
5739
- put_rpccred(cred);
57406123 return status;
57416124 }
57426125 #endif /* CONFIG_NFS_V4_SECURITY_LABEL */
....@@ -5762,9 +6145,34 @@
57626145 memcpy(bootverf->data, verf, sizeof(bootverf->data));
57636146 }
57646147
6148
+static size_t
6149
+nfs4_get_uniquifier(struct nfs_client *clp, char *buf, size_t buflen)
6150
+{
6151
+ struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id);
6152
+ struct nfs_netns_client *nn_clp = nn->nfs_client;
6153
+ const char *id;
6154
+
6155
+ buf[0] = '\0';
6156
+
6157
+ if (nn_clp) {
6158
+ rcu_read_lock();
6159
+ id = rcu_dereference(nn_clp->identifier);
6160
+ if (id)
6161
+ strscpy(buf, id, buflen);
6162
+ rcu_read_unlock();
6163
+ }
6164
+
6165
+ if (nfs4_client_id_uniquifier[0] != '\0' && buf[0] == '\0')
6166
+ strscpy(buf, nfs4_client_id_uniquifier, buflen);
6167
+
6168
+ return strlen(buf);
6169
+}
6170
+
57656171 static int
57666172 nfs4_init_nonuniform_client_string(struct nfs_client *clp)
57676173 {
6174
+ char buf[NFS4_CLIENT_ID_UNIQ_LEN];
6175
+ size_t buflen;
57686176 size_t len;
57696177 char *str;
57706178
....@@ -5778,8 +6186,11 @@
57786186 strlen(rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_ADDR)) +
57796187 1;
57806188 rcu_read_unlock();
5781
- if (nfs4_client_id_uniquifier[0] != '\0')
5782
- len += strlen(nfs4_client_id_uniquifier) + 1;
6189
+
6190
+ buflen = nfs4_get_uniquifier(clp, buf, sizeof(buf));
6191
+ if (buflen)
6192
+ len += buflen + 1;
6193
+
57836194 if (len > NFS4_OPAQUE_LIMIT + 1)
57846195 return -EINVAL;
57856196
....@@ -5793,10 +6204,9 @@
57936204 return -ENOMEM;
57946205
57956206 rcu_read_lock();
5796
- if (nfs4_client_id_uniquifier[0] != '\0')
6207
+ if (buflen)
57976208 scnprintf(str, len, "Linux NFSv4.0 %s/%s/%s",
5798
- clp->cl_rpcclient->cl_nodename,
5799
- nfs4_client_id_uniquifier,
6209
+ clp->cl_rpcclient->cl_nodename, buf,
58006210 rpc_peeraddr2str(clp->cl_rpcclient,
58016211 RPC_DISPLAY_ADDR));
58026212 else
....@@ -5811,49 +6221,22 @@
58116221 }
58126222
58136223 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
58446224 nfs4_init_uniform_client_string(struct nfs_client *clp)
58456225 {
6226
+ char buf[NFS4_CLIENT_ID_UNIQ_LEN];
6227
+ size_t buflen;
58466228 size_t len;
58476229 char *str;
58486230
58496231 if (clp->cl_owner_id != NULL)
58506232 return 0;
58516233
5852
- if (nfs4_client_id_uniquifier[0] != '\0')
5853
- return nfs4_init_uniquifier_client_string(clp);
5854
-
58556234 len = 10 + 10 + 1 + 10 + 1 +
58566235 strlen(clp->cl_rpcclient->cl_nodename) + 1;
6236
+
6237
+ buflen = nfs4_get_uniquifier(clp, buf, sizeof(buf));
6238
+ if (buflen)
6239
+ len += buflen + 1;
58576240
58586241 if (len > NFS4_OPAQUE_LIMIT + 1)
58596242 return -EINVAL;
....@@ -5867,9 +6250,14 @@
58676250 if (!str)
58686251 return -ENOMEM;
58696252
5870
- scnprintf(str, len, "Linux NFSv%u.%u %s",
5871
- clp->rpc_ops->version, clp->cl_minorversion,
5872
- clp->cl_rpcclient->cl_nodename);
6253
+ if (buflen)
6254
+ scnprintf(str, len, "Linux NFSv%u.%u %s/%s",
6255
+ clp->rpc_ops->version, clp->cl_minorversion,
6256
+ buf, clp->cl_rpcclient->cl_nodename);
6257
+ else
6258
+ scnprintf(str, len, "Linux NFSv%u.%u %s",
6259
+ clp->rpc_ops->version, clp->cl_minorversion,
6260
+ clp->cl_rpcclient->cl_nodename);
58736261 clp->cl_owner_id = str;
58746262 return 0;
58756263 }
....@@ -5905,13 +6293,13 @@
59056293 * @clp: state data structure
59066294 * @program: RPC program for NFSv4 callback service
59076295 * @port: IP port number for NFS4 callback service
5908
- * @cred: RPC credential to use for this call
6296
+ * @cred: credential to use for this call
59096297 * @res: where to place the result
59106298 *
59116299 * Returns zero, a negative errno, or a negative NFS4ERR status code.
59126300 */
59136301 int nfs4_proc_setclientid(struct nfs_client *clp, u32 program,
5914
- unsigned short port, struct rpc_cred *cred,
6302
+ unsigned short port, const struct cred *cred,
59156303 struct nfs4_setclientid_res *res)
59166304 {
59176305 nfs4_verifier sc_verifier;
....@@ -5926,14 +6314,14 @@
59266314 .rpc_resp = res,
59276315 .rpc_cred = cred,
59286316 };
5929
- struct rpc_task *task;
59306317 struct rpc_task_setup task_setup_data = {
59316318 .rpc_client = clp->cl_rpcclient,
59326319 .rpc_message = &msg,
59336320 .callback_ops = &nfs4_setclientid_ops,
59346321 .callback_data = &setclientid,
5935
- .flags = RPC_TASK_TIMEOUT,
6322
+ .flags = RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN,
59366323 };
6324
+ unsigned long now = jiffies;
59376325 int status;
59386326
59396327 /* nfs_client_id4 */
....@@ -5959,18 +6347,16 @@
59596347 dprintk("NFS call setclientid auth=%s, '%s'\n",
59606348 clp->cl_rpcclient->cl_auth->au_ops->au_name,
59616349 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;
6350
+
6351
+ status = nfs4_call_sync_custom(&task_setup_data);
59686352 if (setclientid.sc_cred) {
59696353 kfree(clp->cl_acceptor);
59706354 clp->cl_acceptor = rpcauth_stringify_acceptor(setclientid.sc_cred);
59716355 put_rpccred(setclientid.sc_cred);
59726356 }
5973
- rpc_put_task(task);
6357
+
6358
+ if (status == 0)
6359
+ do_renew_lease(clp, now);
59746360 out:
59756361 trace_nfs4_setclientid(clp, status);
59766362 dprintk("NFS reply setclientid: %d\n", status);
....@@ -5980,14 +6366,14 @@
59806366 /**
59816367 * nfs4_proc_setclientid_confirm - Confirm client ID
59826368 * @clp: state data structure
5983
- * @res: result of a previous SETCLIENTID
5984
- * @cred: RPC credential to use for this call
6369
+ * @arg: result of a previous SETCLIENTID
6370
+ * @cred: credential to use for this call
59856371 *
59866372 * Returns zero, a negative errno, or a negative NFS4ERR status code.
59876373 */
59886374 int nfs4_proc_setclientid_confirm(struct nfs_client *clp,
59896375 struct nfs4_setclientid_res *arg,
5990
- struct rpc_cred *cred)
6376
+ const struct cred *cred)
59916377 {
59926378 struct rpc_message msg = {
59936379 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETCLIENTID_CONFIRM],
....@@ -5999,7 +6385,8 @@
59996385 dprintk("NFS call setclientid_confirm auth=%s, (client ID %llx)\n",
60006386 clp->cl_rpcclient->cl_auth->au_ops->au_name,
60016387 clp->cl_clientid);
6002
- status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
6388
+ status = rpc_call_sync(clp->cl_rpcclient, &msg,
6389
+ RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN);
60036390 trace_nfs4_setclientid_confirm(clp, status);
60046391 dprintk("NFS reply setclientid_confirm: %d\n", status);
60056392 return status;
....@@ -6038,32 +6425,9 @@
60386425 trace_nfs4_delegreturn_exit(&data->args, &data->res, task->tk_status);
60396426
60406427 /* 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
- }
6428
+ if (pnfs_roc_done(task, &data->args.lr_args, &data->res.lr_res,
6429
+ &data->res.lr_ret) == -EAGAIN)
6430
+ goto out_restart;
60676431
60686432 switch (task->tk_status) {
60696433 case 0:
....@@ -6075,23 +6439,27 @@
60756439 nfs4_free_revoked_stateid(data->res.server,
60766440 data->args.stateid,
60776441 task->tk_msg.rpc_cred);
6078
- /* Fallthrough */
6442
+ fallthrough;
60796443 case -NFS4ERR_BAD_STATEID:
60806444 case -NFS4ERR_STALE_STATEID:
6445
+ case -ETIMEDOUT:
60816446 task->tk_status = 0;
60826447 break;
60836448 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;
6449
+ if (!nfs4_refresh_delegation_stateid(&data->stateid, data->inode))
6450
+ nfs4_stateid_seqid_inc(&data->stateid);
6451
+ if (data->args.bitmask) {
6452
+ data->args.bitmask = NULL;
6453
+ data->res.fattr = NULL;
6454
+ }
6455
+ goto out_restart;
60886456 case -NFS4ERR_ACCESS:
60896457 if (data->args.bitmask) {
60906458 data->args.bitmask = NULL;
60916459 data->res.fattr = NULL;
60926460 goto out_restart;
60936461 }
6094
- /* Fallthrough */
6462
+ fallthrough;
60956463 default:
60966464 task->tk_status = nfs4_async_handle_exception(task,
60976465 data->res.server, task->tk_status,
....@@ -6099,10 +6467,9 @@
60996467 if (exception.retry)
61006468 goto out_restart;
61016469 }
6470
+ nfs_delegation_mark_returned(data->inode, data->args.stateid);
61026471 data->rpc_status = task->tk_status;
61036472 return;
6104
-lr_restart:
6105
- data->res.lr_ret = 0;
61066473 out_restart:
61076474 task->tk_status = 0;
61086475 rpc_restart_call_prepare(task);
....@@ -6113,11 +6480,13 @@
61136480 struct nfs4_delegreturndata *data = calldata;
61146481 struct inode *inode = data->inode;
61156482
6483
+ if (data->lr.roc)
6484
+ pnfs_roc_release(&data->lr.arg, &data->lr.res,
6485
+ data->res.lr_ret);
61166486 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);
6487
+ nfs4_fattr_set_prechange(&data->fattr,
6488
+ inode_peek_iversion_raw(inode));
6489
+ nfs_refresh_inode(inode, &data->fattr);
61216490 nfs_iput_and_deactive(inode);
61226491 }
61236492 kfree(calldata);
....@@ -6153,7 +6522,7 @@
61536522 .rpc_release = nfs4_delegreturn_release,
61546523 };
61556524
6156
-static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync)
6525
+static int _nfs4_proc_delegreturn(struct inode *inode, const struct cred *cred, const nfs4_stateid *stateid, int issync)
61576526 {
61586527 struct nfs4_delegreturndata *data;
61596528 struct nfs_server *server = NFS_SERVER(inode);
....@@ -6166,7 +6535,7 @@
61666535 .rpc_client = server->client,
61676536 .rpc_message = &msg,
61686537 .callback_ops = &nfs4_delegreturn_ops,
6169
- .flags = RPC_TASK_ASYNC,
6538
+ .flags = RPC_TASK_ASYNC | RPC_TASK_TIMEOUT,
61706539 };
61716540 int status = 0;
61726541
....@@ -6180,7 +6549,10 @@
61806549
61816550 data->args.fhandle = &data->fh;
61826551 data->args.stateid = &data->stateid;
6183
- data->args.bitmask = server->cache_consistency_bitmask;
6552
+ nfs4_bitmask_set(data->args.bitmask_store,
6553
+ server->cache_consistency_bitmask, inode, server,
6554
+ NULL);
6555
+ data->args.bitmask = data->args.bitmask_store;
61846556 nfs_copy_fh(&data->fh, NFS_FH(inode));
61856557 nfs4_stateid_copy(&data->stateid, stateid);
61866558 data->res.fattr = &data->fattr;
....@@ -6190,16 +6562,14 @@
61906562 nfs_fattr_init(data->res.fattr);
61916563 data->timestamp = jiffies;
61926564 data->rpc_status = 0;
6193
- data->lr.roc = pnfs_roc(inode, &data->lr.arg, &data->lr.res, cred);
61946565 data->inode = nfs_igrab_and_active(inode);
6195
- if (data->inode) {
6566
+ if (data->inode || issync) {
6567
+ data->lr.roc = pnfs_roc(inode, &data->lr.arg, &data->lr.res,
6568
+ cred);
61966569 if (data->lr.roc) {
61976570 data->args.lr_args = &data->lr.arg;
61986571 data->res.lr_res = &data->lr.res;
61996572 }
6200
- } else if (data->lr.roc) {
6201
- pnfs_roc_release(&data->lr.arg, &data->lr.res, 0);
6202
- data->lr.roc = false;
62036573 }
62046574
62056575 if (!data->inode)
....@@ -6225,7 +6595,7 @@
62256595 return status;
62266596 }
62276597
6228
-int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4_stateid *stateid, int issync)
6598
+int nfs4_proc_delegreturn(struct inode *inode, const struct cred *cred, const nfs4_stateid *stateid, int issync)
62296599 {
62306600 struct nfs_server *server = NFS_SERVER(inode);
62316601 struct nfs4_exception exception = { };
....@@ -6288,7 +6658,9 @@
62886658
62896659 static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock *request)
62906660 {
6291
- struct nfs4_exception exception = { };
6661
+ struct nfs4_exception exception = {
6662
+ .interruptible = true,
6663
+ };
62926664 int err;
62936665
62946666 do {
....@@ -6298,6 +6670,42 @@
62986670 &exception);
62996671 } while (exception.retry);
63006672 return err;
6673
+}
6674
+
6675
+/*
6676
+ * Update the seqid of a lock stateid after receiving
6677
+ * NFS4ERR_OLD_STATEID
6678
+ */
6679
+static bool nfs4_refresh_lock_old_stateid(nfs4_stateid *dst,
6680
+ struct nfs4_lock_state *lsp)
6681
+{
6682
+ struct nfs4_state *state = lsp->ls_state;
6683
+ bool ret = false;
6684
+
6685
+ spin_lock(&state->state_lock);
6686
+ if (!nfs4_stateid_match_other(dst, &lsp->ls_stateid))
6687
+ goto out;
6688
+ if (!nfs4_stateid_is_newer(&lsp->ls_stateid, dst))
6689
+ nfs4_stateid_seqid_inc(dst);
6690
+ else
6691
+ dst->seqid = lsp->ls_stateid.seqid;
6692
+ ret = true;
6693
+out:
6694
+ spin_unlock(&state->state_lock);
6695
+ return ret;
6696
+}
6697
+
6698
+static bool nfs4_sync_lock_stateid(nfs4_stateid *dst,
6699
+ struct nfs4_lock_state *lsp)
6700
+{
6701
+ struct nfs4_state *state = lsp->ls_state;
6702
+ bool ret;
6703
+
6704
+ spin_lock(&state->state_lock);
6705
+ ret = !nfs4_stateid_match_other(dst, &lsp->ls_stateid);
6706
+ nfs4_stateid_copy(dst, &lsp->ls_stateid);
6707
+ spin_unlock(&state->state_lock);
6708
+ return ret;
63016709 }
63026710
63036711 struct nfs4_unlockdata {
....@@ -6317,7 +6725,8 @@
63176725 struct nfs_seqid *seqid)
63186726 {
63196727 struct nfs4_unlockdata *p;
6320
- struct inode *inode = lsp->ls_state->inode;
6728
+ struct nfs4_state *state = lsp->ls_state;
6729
+ struct inode *inode = state->inode;
63216730
63226731 p = kzalloc(sizeof(*p), GFP_NOFS);
63236732 if (p == NULL)
....@@ -6327,12 +6736,15 @@
63276736 p->arg.seqid = seqid;
63286737 p->res.seqid = seqid;
63296738 p->lsp = lsp;
6330
- refcount_inc(&lsp->ls_count);
63316739 /* Ensure we don't close file until we're done freeing locks! */
63326740 p->ctx = get_nfs_open_context(ctx);
63336741 p->l_ctx = nfs_get_lock_context(ctx);
6334
- memcpy(&p->fl, fl, sizeof(p->fl));
6742
+ locks_init_lock(&p->fl);
6743
+ locks_copy_lock(&p->fl, fl);
63356744 p->server = NFS_SERVER(inode);
6745
+ spin_lock(&state->state_lock);
6746
+ nfs4_stateid_copy(&p->arg.stateid, &lsp->ls_stateid);
6747
+ spin_unlock(&state->state_lock);
63366748 return p;
63376749 }
63386750
....@@ -6363,18 +6775,22 @@
63636775 if (nfs4_update_lock_stateid(calldata->lsp,
63646776 &calldata->res.stateid))
63656777 break;
6366
- /* Fall through */
6778
+ fallthrough;
63676779 case -NFS4ERR_ADMIN_REVOKED:
63686780 case -NFS4ERR_EXPIRED:
63696781 nfs4_free_revoked_stateid(calldata->server,
63706782 &calldata->arg.stateid,
63716783 task->tk_msg.rpc_cred);
6372
- /* Fall through */
6784
+ fallthrough;
63736785 case -NFS4ERR_BAD_STATEID:
6374
- case -NFS4ERR_OLD_STATEID:
63756786 case -NFS4ERR_STALE_STATEID:
6376
- if (!nfs4_stateid_match(&calldata->arg.stateid,
6377
- &calldata->lsp->ls_stateid))
6787
+ if (nfs4_sync_lock_stateid(&calldata->arg.stateid,
6788
+ calldata->lsp))
6789
+ rpc_restart_call_prepare(task);
6790
+ break;
6791
+ case -NFS4ERR_OLD_STATEID:
6792
+ if (nfs4_refresh_lock_old_stateid(&calldata->arg.stateid,
6793
+ calldata->lsp))
63786794 rpc_restart_call_prepare(task);
63796795 break;
63806796 default:
....@@ -6397,7 +6813,6 @@
63976813
63986814 if (nfs_wait_on_sequence(calldata->arg.seqid, task) != 0)
63996815 goto out_wait;
6400
- nfs4_stateid_copy(&calldata->arg.stateid, &calldata->lsp->ls_stateid);
64016816 if (test_bit(NFS_LOCK_INITIALIZED, &calldata->lsp->ls_flags) == 0) {
64026817 /* Note: exit _without_ running nfs4_locku_done */
64036818 goto out_no_action;
....@@ -6551,9 +6966,9 @@
65516966 p->res.lock_seqid = p->arg.lock_seqid;
65526967 p->lsp = lsp;
65536968 p->server = server;
6554
- refcount_inc(&lsp->ls_count);
65556969 p->ctx = get_nfs_open_context(ctx);
6556
- memcpy(&p->fl, fl, sizeof(p->fl));
6970
+ locks_init_lock(&p->fl);
6971
+ locks_copy_lock(&p->fl, fl);
65576972 return p;
65586973 out_free_seqid:
65596974 nfs_free_seqid(p->arg.open_seqid);
....@@ -6608,6 +7023,7 @@
66087023 {
66097024 struct nfs4_lockdata *data = calldata;
66107025 struct nfs4_lock_state *lsp = data->lsp;
7026
+ struct nfs_server *server = NFS_SERVER(d_inode(data->ctx->dentry));
66117027
66127028 dprintk("%s: begin!\n", __func__);
66137029
....@@ -6617,8 +7033,7 @@
66177033 data->rpc_status = task->tk_status;
66187034 switch (task->tk_status) {
66197035 case 0:
6620
- renew_lease(NFS_SERVER(d_inode(data->ctx->dentry)),
6621
- data->timestamp);
7036
+ renew_lease(server, data->timestamp);
66227037 if (data->arg.new_lock && !data->cancelled) {
66237038 data->fl.fl_flags &= ~(FL_SLEEP | FL_ACCESS);
66247039 if (locks_lock_inode_wait(lsp->ls_state->inode, &data->fl) < 0)
....@@ -6631,13 +7046,22 @@
66317046 } else if (!nfs4_update_lock_stateid(lsp, &data->res.stateid))
66327047 goto out_restart;
66337048 break;
6634
- case -NFS4ERR_BAD_STATEID:
66357049 case -NFS4ERR_OLD_STATEID:
7050
+ if (data->arg.new_lock_owner != 0 &&
7051
+ nfs4_refresh_open_old_stateid(&data->arg.open_stateid,
7052
+ lsp->ls_state))
7053
+ goto out_restart;
7054
+ if (nfs4_refresh_lock_old_stateid(&data->arg.lock_stateid, lsp))
7055
+ goto out_restart;
7056
+ fallthrough;
7057
+ case -NFS4ERR_BAD_STATEID:
66367058 case -NFS4ERR_STALE_STATEID:
66377059 case -NFS4ERR_EXPIRED:
66387060 if (data->arg.new_lock_owner != 0) {
66397061 if (!nfs4_stateid_match(&data->arg.open_stateid,
66407062 &lsp->ls_state->open_stateid))
7063
+ goto out_restart;
7064
+ else if (nfs4_async_handle_error(task, server, lsp->ls_state, NULL) == -EAGAIN)
66417065 goto out_restart;
66427066 } else if (!nfs4_stateid_match(&data->arg.lock_stateid,
66437067 &lsp->ls_stateid))
....@@ -6693,7 +7117,7 @@
66937117 case -NFS4ERR_STALE_STATEID:
66947118 lsp->ls_seqid.flags &= ~NFS_SEQID_CONFIRMED;
66957119 nfs4_schedule_lease_recovery(server->nfs_client);
6696
- };
7120
+ }
66977121 }
66987122
66997123 static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *fl, int recovery_type)
....@@ -6709,7 +7133,7 @@
67097133 .rpc_message = &msg,
67107134 .callback_ops = &nfs4_lock_ops,
67117135 .workqueue = nfsiod_workqueue,
6712
- .flags = RPC_TASK_ASYNC,
7136
+ .flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF,
67137137 };
67147138 int ret;
67157139
....@@ -6852,6 +7276,7 @@
68527276 struct nfs4_exception exception = {
68537277 .state = state,
68547278 .inode = state->inode,
7279
+ .interruptible = true,
68557280 };
68567281 int err;
68577282
....@@ -7136,7 +7561,8 @@
71367561
71377562 static int nfs4_xattr_get_nfs4_acl(const struct xattr_handler *handler,
71387563 struct dentry *unused, struct inode *inode,
7139
- const char *key, void *buf, size_t buflen)
7564
+ const char *key, void *buf, size_t buflen,
7565
+ int flags)
71407566 {
71417567 return nfs4_proc_get_acl(inode, buf, buflen);
71427568 }
....@@ -7161,7 +7587,8 @@
71617587
71627588 static int nfs4_xattr_get_nfs4_label(const struct xattr_handler *handler,
71637589 struct dentry *unused, struct inode *inode,
7164
- const char *key, void *buf, size_t buflen)
7590
+ const char *key, void *buf, size_t buflen,
7591
+ int flags)
71657592 {
71667593 if (security_ismaclabel(key))
71677594 return nfs4_get_security_label(inode, buf, buflen);
....@@ -7175,7 +7602,7 @@
71757602
71767603 if (nfs_server_capable(inode, NFS_CAP_SECURITY_LABEL)) {
71777604 len = security_inode_listsecurity(inode, list, list_len);
7178
- if (list_len && len > list_len)
7605
+ if (len >= 0 && list_len && len > list_len)
71797606 return -ERANGE;
71807607 }
71817608 return len;
....@@ -7196,6 +7623,134 @@
71967623 }
71977624
71987625 #endif
7626
+
7627
+#ifdef CONFIG_NFS_V4_2
7628
+static int nfs4_xattr_set_nfs4_user(const struct xattr_handler *handler,
7629
+ struct dentry *unused, struct inode *inode,
7630
+ const char *key, const void *buf,
7631
+ size_t buflen, int flags)
7632
+{
7633
+ u32 mask;
7634
+ int ret;
7635
+
7636
+ if (!nfs_server_capable(inode, NFS_CAP_XATTR))
7637
+ return -EOPNOTSUPP;
7638
+
7639
+ /*
7640
+ * There is no mapping from the MAY_* flags to the NFS_ACCESS_XA*
7641
+ * flags right now. Handling of xattr operations use the normal
7642
+ * file read/write permissions.
7643
+ *
7644
+ * Just in case the server has other ideas (which RFC 8276 allows),
7645
+ * do a cached access check for the XA* flags to possibly avoid
7646
+ * doing an RPC and getting EACCES back.
7647
+ */
7648
+ if (!nfs_access_get_cached(inode, current_cred(), &mask, true)) {
7649
+ if (!(mask & NFS_ACCESS_XAWRITE))
7650
+ return -EACCES;
7651
+ }
7652
+
7653
+ if (buf == NULL) {
7654
+ ret = nfs42_proc_removexattr(inode, key);
7655
+ if (!ret)
7656
+ nfs4_xattr_cache_remove(inode, key);
7657
+ } else {
7658
+ ret = nfs42_proc_setxattr(inode, key, buf, buflen, flags);
7659
+ if (!ret)
7660
+ nfs4_xattr_cache_add(inode, key, buf, NULL, buflen);
7661
+ }
7662
+
7663
+ return ret;
7664
+}
7665
+
7666
+static int nfs4_xattr_get_nfs4_user(const struct xattr_handler *handler,
7667
+ struct dentry *unused, struct inode *inode,
7668
+ const char *key, void *buf, size_t buflen,
7669
+ int flags)
7670
+{
7671
+ u32 mask;
7672
+ ssize_t ret;
7673
+
7674
+ if (!nfs_server_capable(inode, NFS_CAP_XATTR))
7675
+ return -EOPNOTSUPP;
7676
+
7677
+ if (!nfs_access_get_cached(inode, current_cred(), &mask, true)) {
7678
+ if (!(mask & NFS_ACCESS_XAREAD))
7679
+ return -EACCES;
7680
+ }
7681
+
7682
+ ret = nfs_revalidate_inode(NFS_SERVER(inode), inode);
7683
+ if (ret)
7684
+ return ret;
7685
+
7686
+ ret = nfs4_xattr_cache_get(inode, key, buf, buflen);
7687
+ if (ret >= 0 || (ret < 0 && ret != -ENOENT))
7688
+ return ret;
7689
+
7690
+ ret = nfs42_proc_getxattr(inode, key, buf, buflen);
7691
+
7692
+ return ret;
7693
+}
7694
+
7695
+static ssize_t
7696
+nfs4_listxattr_nfs4_user(struct inode *inode, char *list, size_t list_len)
7697
+{
7698
+ u64 cookie;
7699
+ bool eof;
7700
+ ssize_t ret, size;
7701
+ char *buf;
7702
+ size_t buflen;
7703
+ u32 mask;
7704
+
7705
+ if (!nfs_server_capable(inode, NFS_CAP_XATTR))
7706
+ return 0;
7707
+
7708
+ if (!nfs_access_get_cached(inode, current_cred(), &mask, true)) {
7709
+ if (!(mask & NFS_ACCESS_XALIST))
7710
+ return 0;
7711
+ }
7712
+
7713
+ ret = nfs_revalidate_inode(NFS_SERVER(inode), inode);
7714
+ if (ret)
7715
+ return ret;
7716
+
7717
+ ret = nfs4_xattr_cache_list(inode, list, list_len);
7718
+ if (ret >= 0 || (ret < 0 && ret != -ENOENT))
7719
+ return ret;
7720
+
7721
+ cookie = 0;
7722
+ eof = false;
7723
+ buflen = list_len ? list_len : XATTR_LIST_MAX;
7724
+ buf = list_len ? list : NULL;
7725
+ size = 0;
7726
+
7727
+ while (!eof) {
7728
+ ret = nfs42_proc_listxattrs(inode, buf, buflen,
7729
+ &cookie, &eof);
7730
+ if (ret < 0)
7731
+ return ret;
7732
+
7733
+ if (list_len) {
7734
+ buf += ret;
7735
+ buflen -= ret;
7736
+ }
7737
+ size += ret;
7738
+ }
7739
+
7740
+ if (list_len)
7741
+ nfs4_xattr_cache_set_list(inode, list, size);
7742
+
7743
+ return size;
7744
+}
7745
+
7746
+#else
7747
+
7748
+static ssize_t
7749
+nfs4_listxattr_nfs4_user(struct inode *inode, char *list, size_t list_len)
7750
+{
7751
+ return 0;
7752
+}
7753
+#endif /* CONFIG_NFS_V4_2 */
71997754
72007755 /*
72017756 * nfs_fhget will use either the mounted_on_fileid or the fileid
....@@ -7262,7 +7817,9 @@
72627817 struct nfs4_fs_locations *fs_locations,
72637818 struct page *page)
72647819 {
7265
- struct nfs4_exception exception = { };
7820
+ struct nfs4_exception exception = {
7821
+ .interruptible = true,
7822
+ };
72667823 int err;
72677824 do {
72687825 err = _nfs4_proc_fs_locations(client, dir, name,
....@@ -7283,7 +7840,7 @@
72837840 */
72847841 static int _nfs40_proc_get_locations(struct inode *inode,
72857842 struct nfs4_fs_locations *locations,
7286
- struct page *page, struct rpc_cred *cred)
7843
+ struct page *page, const struct cred *cred)
72877844 {
72887845 struct nfs_server *server = NFS_SERVER(inode);
72897846 struct rpc_clnt *clnt = server->client;
....@@ -7340,7 +7897,7 @@
73407897 */
73417898 static int _nfs41_proc_get_locations(struct inode *inode,
73427899 struct nfs4_fs_locations *locations,
7343
- struct page *page, struct rpc_cred *cred)
7900
+ struct page *page, const struct cred *cred)
73447901 {
73457902 struct nfs_server *server = NFS_SERVER(inode);
73467903 struct rpc_clnt *clnt = server->client;
....@@ -7399,13 +7956,15 @@
73997956 */
74007957 int nfs4_proc_get_locations(struct inode *inode,
74017958 struct nfs4_fs_locations *locations,
7402
- struct page *page, struct rpc_cred *cred)
7959
+ struct page *page, const struct cred *cred)
74037960 {
74047961 struct nfs_server *server = NFS_SERVER(inode);
74057962 struct nfs_client *clp = server->nfs_client;
74067963 const struct nfs4_mig_recovery_ops *ops =
74077964 clp->cl_mvops->mig_recovery_ops;
7408
- struct nfs4_exception exception = { };
7965
+ struct nfs4_exception exception = {
7966
+ .interruptible = true,
7967
+ };
74097968 int status;
74107969
74117970 dprintk("%s: FSID %llx:%llx on \"%s\"\n", __func__,
....@@ -7430,7 +7989,7 @@
74307989 * is appended to this compound to identify the client ID which is
74317990 * performing recovery.
74327991 */
7433
-static int _nfs40_proc_fsid_present(struct inode *inode, struct rpc_cred *cred)
7992
+static int _nfs40_proc_fsid_present(struct inode *inode, const struct cred *cred)
74347993 {
74357994 struct nfs_server *server = NFS_SERVER(inode);
74367995 struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
....@@ -7476,7 +8035,7 @@
74768035 * this operation is identified in the SEQUENCE operation in this
74778036 * compound.
74788037 */
7479
-static int _nfs41_proc_fsid_present(struct inode *inode, struct rpc_cred *cred)
8038
+static int _nfs41_proc_fsid_present(struct inode *inode, const struct cred *cred)
74808039 {
74818040 struct nfs_server *server = NFS_SERVER(inode);
74828041 struct rpc_clnt *clnt = server->client;
....@@ -7523,13 +8082,15 @@
75238082 * NFS4ERR code if some error occurred on the server, or a
75248083 * negative errno if a local failure occurred.
75258084 */
7526
-int nfs4_proc_fsid_present(struct inode *inode, struct rpc_cred *cred)
8085
+int nfs4_proc_fsid_present(struct inode *inode, const struct cred *cred)
75278086 {
75288087 struct nfs_server *server = NFS_SERVER(inode);
75298088 struct nfs_client *clp = server->nfs_client;
75308089 const struct nfs4_mig_recovery_ops *ops =
75318090 clp->cl_mvops->mig_recovery_ops;
7532
- struct nfs4_exception exception = { };
8091
+ struct nfs4_exception exception = {
8092
+ .interruptible = true,
8093
+ };
75338094 int status;
75348095
75358096 dprintk("%s: FSID %llx:%llx on \"%s\"\n", __func__,
....@@ -7547,7 +8108,7 @@
75478108 return status;
75488109 }
75498110
7550
-/**
8111
+/*
75518112 * If 'use_integrity' is true and the state managment nfs_client
75528113 * cl_rpcclient is using krb5i/p, use the integrity protected cl_rpcclient
75538114 * and the machine credential as per RFC3530bis and RFC5661 Security
....@@ -7557,6 +8118,8 @@
75578118 static int _nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct nfs4_secinfo_flavors *flavors, bool use_integrity)
75588119 {
75598120 int status;
8121
+ struct rpc_clnt *clnt = NFS_SERVER(dir)->client;
8122
+ struct nfs_client *clp = NFS_SERVER(dir)->nfs_client;
75608123 struct nfs4_secinfo_arg args = {
75618124 .dir_fh = NFS_FH(dir),
75628125 .name = name,
....@@ -7569,34 +8132,46 @@
75698132 .rpc_argp = &args,
75708133 .rpc_resp = &res,
75718134 };
7572
- struct rpc_clnt *clnt = NFS_SERVER(dir)->client;
7573
- struct rpc_cred *cred = NULL;
8135
+ struct nfs4_call_sync_data data = {
8136
+ .seq_server = NFS_SERVER(dir),
8137
+ .seq_args = &args.seq_args,
8138
+ .seq_res = &res.seq_res,
8139
+ };
8140
+ struct rpc_task_setup task_setup = {
8141
+ .rpc_client = clnt,
8142
+ .rpc_message = &msg,
8143
+ .callback_ops = clp->cl_mvops->call_sync_ops,
8144
+ .callback_data = &data,
8145
+ .flags = RPC_TASK_NO_ROUND_ROBIN,
8146
+ };
8147
+ const struct cred *cred = NULL;
75748148
75758149 if (use_integrity) {
7576
- clnt = NFS_SERVER(dir)->nfs_client->cl_rpcclient;
7577
- cred = nfs4_get_clid_cred(NFS_SERVER(dir)->nfs_client);
8150
+ clnt = clp->cl_rpcclient;
8151
+ task_setup.rpc_client = clnt;
8152
+
8153
+ cred = nfs4_get_clid_cred(clp);
75788154 msg.rpc_cred = cred;
75798155 }
75808156
75818157 dprintk("NFS call secinfo %s\n", name->name);
75828158
7583
- nfs4_state_protect(NFS_SERVER(dir)->nfs_client,
7584
- NFS_SP4_MACH_CRED_SECINFO, &clnt, &msg);
8159
+ nfs4_state_protect(clp, NFS_SP4_MACH_CRED_SECINFO, &clnt, &msg);
8160
+ nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
8161
+ status = nfs4_call_sync_custom(&task_setup);
75858162
7586
- status = nfs4_call_sync(clnt, NFS_SERVER(dir), &msg, &args.seq_args,
7587
- &res.seq_res, 0);
75888163 dprintk("NFS reply secinfo: %d\n", status);
75898164
7590
- if (cred)
7591
- put_rpccred(cred);
7592
-
8165
+ put_cred(cred);
75938166 return status;
75948167 }
75958168
75968169 int nfs4_proc_secinfo(struct inode *dir, const struct qstr *name,
75978170 struct nfs4_secinfo_flavors *flavors)
75988171 {
7599
- struct nfs4_exception exception = { };
8172
+ struct nfs4_exception exception = {
8173
+ .interruptible = true,
8174
+ };
76008175 int err;
76018176 do {
76028177 err = -NFS4ERR_WRONGSEC;
....@@ -7655,6 +8230,23 @@
76558230 static void
76568231 nfs4_bind_one_conn_to_session_done(struct rpc_task *task, void *calldata)
76578232 {
8233
+ struct nfs41_bind_conn_to_session_args *args = task->tk_msg.rpc_argp;
8234
+ struct nfs41_bind_conn_to_session_res *res = task->tk_msg.rpc_resp;
8235
+ struct nfs_client *clp = args->client;
8236
+
8237
+ switch (task->tk_status) {
8238
+ case -NFS4ERR_BADSESSION:
8239
+ case -NFS4ERR_DEADSESSION:
8240
+ nfs4_schedule_session_recovery(clp->cl_session,
8241
+ task->tk_status);
8242
+ return;
8243
+ }
8244
+ if (args->dir == NFS4_CDFC4_FORE_OR_BOTH &&
8245
+ res->dir != NFS4_CDFS4_BOTH) {
8246
+ rpc_task_close_connection(task);
8247
+ if (args->retries++ < MAX_BIND_CONN_TO_SESSION_RETRIES)
8248
+ rpc_restart_call(task);
8249
+ }
76588250 }
76598251
76608252 static const struct rpc_call_ops nfs4_bind_one_conn_to_session_ops = {
....@@ -7671,12 +8263,13 @@
76718263 int nfs4_proc_bind_one_conn_to_session(struct rpc_clnt *clnt,
76728264 struct rpc_xprt *xprt,
76738265 struct nfs_client *clp,
7674
- struct rpc_cred *cred)
8266
+ const struct cred *cred)
76758267 {
76768268 int status;
76778269 struct nfs41_bind_conn_to_session_args args = {
76788270 .client = clp,
76798271 .dir = NFS4_CDFC4_FORE_OR_BOTH,
8272
+ .retries = 0,
76808273 };
76818274 struct nfs41_bind_conn_to_session_res res;
76828275 struct rpc_message msg = {
....@@ -7733,7 +8326,7 @@
77338326
77348327 struct rpc_bind_conn_calldata {
77358328 struct nfs_client *clp;
7736
- struct rpc_cred *cred;
8329
+ const struct cred *cred;
77378330 };
77388331
77398332 static int
....@@ -7746,7 +8339,7 @@
77468339 return nfs4_proc_bind_one_conn_to_session(clnt, xprt, p->clp, p->cred);
77478340 }
77488341
7749
-int nfs4_proc_bind_conn_to_session(struct nfs_client *clp, struct rpc_cred *cred)
8342
+int nfs4_proc_bind_conn_to_session(struct nfs_client *clp, const struct cred *cred)
77508343 {
77518344 struct rpc_bind_conn_calldata data = {
77528345 .clp = clp,
....@@ -7912,7 +8505,7 @@
79128505 * Wrapper for EXCHANGE_ID operation.
79138506 */
79148507 static struct rpc_task *
7915
-nfs4_run_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
8508
+nfs4_run_exchange_id(struct nfs_client *clp, const struct cred *cred,
79168509 u32 sp4_how, struct rpc_xprt *xprt)
79178510 {
79188511 struct rpc_message msg = {
....@@ -7923,7 +8516,7 @@
79238516 .rpc_client = clp->cl_rpcclient,
79248517 .callback_ops = &nfs4_exchange_id_call_ops,
79258518 .rpc_message = &msg,
7926
- .flags = RPC_TASK_TIMEOUT,
8519
+ .flags = RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN,
79278520 };
79288521 struct nfs41_exchange_id_data *calldata;
79298522 int status;
....@@ -8008,12 +8601,13 @@
80088601 *
80098602 * Wrapper for EXCHANGE_ID operation.
80108603 */
8011
-static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred,
8604
+static int _nfs4_proc_exchange_id(struct nfs_client *clp, const struct cred *cred,
80128605 u32 sp4_how)
80138606 {
80148607 struct rpc_task *task;
80158608 struct nfs41_exchange_id_args *argp;
80168609 struct nfs41_exchange_id_res *resp;
8610
+ unsigned long now = jiffies;
80178611 int status;
80188612
80198613 task = nfs4_run_exchange_id(clp, cred, sp4_how, NULL);
....@@ -8034,6 +8628,8 @@
80348628 status = nfs4_sp4_select_mode(clp, &resp->state_protect);
80358629 if (status != 0)
80368630 goto out;
8631
+
8632
+ do_renew_lease(clp, now);
80378633
80388634 clp->cl_clientid = resp->clientid;
80398635 clp->cl_exchange_flags = resp->flags;
....@@ -8076,7 +8672,7 @@
80768672 *
80778673 * Will attempt to negotiate SP4_MACH_CRED if krb5i / krb5p auth is used.
80788674 */
8079
-int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
8675
+int nfs4_proc_exchange_id(struct nfs_client *clp, const struct cred *cred)
80808676 {
80818677 rpc_authflavor_t authflavor = clp->cl_rpcclient->cl_auth->au_flavor;
80828678 int status;
....@@ -8108,7 +8704,7 @@
81088704 * @xprt: the rpc_xprt to test
81098705 * @data: call data for _nfs4_proc_exchange_id.
81108706 */
8111
-int nfs4_test_session_trunk(struct rpc_clnt *clnt, struct rpc_xprt *xprt,
8707
+void nfs4_test_session_trunk(struct rpc_clnt *clnt, struct rpc_xprt *xprt,
81128708 void *data)
81138709 {
81148710 struct nfs4_add_xprt_data *adata = (struct nfs4_add_xprt_data *)data;
....@@ -8125,20 +8721,22 @@
81258721 /* Test connection for session trunking. Async exchange_id call */
81268722 task = nfs4_run_exchange_id(adata->clp, adata->cred, sp4_how, xprt);
81278723 if (IS_ERR(task))
8128
- return PTR_ERR(task);
8724
+ return;
81298725
81308726 status = task->tk_status;
81318727 if (status == 0)
81328728 status = nfs4_detect_session_trunking(adata->clp,
81338729 task->tk_msg.rpc_resp, xprt);
81348730
8731
+ if (status == 0)
8732
+ rpc_clnt_xprt_switch_add_xprt(clnt, xprt);
8733
+
81358734 rpc_put_task(task);
8136
- return status;
81378735 }
81388736 EXPORT_SYMBOL_GPL(nfs4_test_session_trunk);
81398737
81408738 static int _nfs4_proc_destroy_clientid(struct nfs_client *clp,
8141
- struct rpc_cred *cred)
8739
+ const struct cred *cred)
81428740 {
81438741 struct rpc_message msg = {
81448742 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DESTROY_CLIENTID],
....@@ -8147,7 +8745,8 @@
81478745 };
81488746 int status;
81498747
8150
- status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
8748
+ status = rpc_call_sync(clp->cl_rpcclient, &msg,
8749
+ RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN);
81518750 trace_nfs4_destroy_clientid(clp, status);
81528751 if (status)
81538752 dprintk("NFS: Got error %d from the server %s on "
....@@ -8156,7 +8755,7 @@
81568755 }
81578756
81588757 static int nfs4_proc_destroy_clientid(struct nfs_client *clp,
8159
- struct rpc_cred *cred)
8758
+ const struct cred *cred)
81608759 {
81618760 unsigned int loop;
81628761 int ret;
....@@ -8177,7 +8776,7 @@
81778776
81788777 int nfs4_destroy_clientid(struct nfs_client *clp)
81798778 {
8180
- struct rpc_cred *cred;
8779
+ const struct cred *cred;
81818780 int ret = 0;
81828781
81838782 if (clp->cl_mvops->minor_version < 1)
....@@ -8188,8 +8787,7 @@
81888787 goto out;
81898788 cred = nfs4_get_clid_cred(clp);
81908789 ret = nfs4_proc_destroy_clientid(clp, cred);
8191
- if (cred)
8192
- put_rpccred(cred);
8790
+ put_cred(cred);
81938791 switch (ret) {
81948792 case 0:
81958793 case -NFS4ERR_STALE_CLIENTID:
....@@ -8198,6 +8796,8 @@
81988796 out:
81998797 return ret;
82008798 }
8799
+
8800
+#endif /* CONFIG_NFS_V4_1 */
82018801
82028802 struct nfs4_get_lease_time_data {
82038803 struct nfs4_get_lease_time_args *args;
....@@ -8231,7 +8831,7 @@
82318831 (struct nfs4_get_lease_time_data *)calldata;
82328832
82338833 dprintk("--> %s\n", __func__);
8234
- if (!nfs41_sequence_done(task, &data->res->lr_seq_res))
8834
+ if (!nfs4_sequence_done(task, &data->res->lr_seq_res))
82358835 return;
82368836 switch (task->tk_status) {
82378837 case -NFS4ERR_DELAY:
....@@ -8239,7 +8839,7 @@
82398839 dprintk("%s Retry: tk_status %d\n", __func__, task->tk_status);
82408840 rpc_delay(task, NFS4_POLL_RETRY_MIN);
82418841 task->tk_status = 0;
8242
- /* fall through */
8842
+ fallthrough;
82438843 case -NFS4ERR_RETRY_UNCACHED_REP:
82448844 rpc_restart_call_prepare(task);
82458845 return;
....@@ -8254,7 +8854,6 @@
82548854
82558855 int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo)
82568856 {
8257
- struct rpc_task *task;
82588857 struct nfs4_get_lease_time_args args;
82598858 struct nfs4_get_lease_time_res res = {
82608859 .lr_fsinfo = fsinfo,
....@@ -8276,18 +8875,12 @@
82768875 .callback_data = &data,
82778876 .flags = RPC_TASK_TIMEOUT,
82788877 };
8279
- int status;
82808878
82818879 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;
8880
+ return nfs4_call_sync_custom(&task_setup);
82908881 }
8882
+
8883
+#ifdef CONFIG_NFS_V4_1
82918884
82928885 /*
82938886 * Initialize the values to be used by the client in CREATE_SESSION
....@@ -8303,6 +8896,7 @@
83038896 {
83048897 unsigned int max_rqst_sz, max_resp_sz;
83058898 unsigned int max_bc_payload = rpc_max_bc_payload(clnt);
8899
+ unsigned int max_bc_slots = rpc_num_bc_slots(clnt);
83068900
83078901 max_rqst_sz = NFS_MAX_FILE_IO_SIZE + nfs41_maxwrite_overhead;
83088902 max_resp_sz = NFS_MAX_FILE_IO_SIZE + nfs41_maxread_overhead;
....@@ -8325,6 +8919,8 @@
83258919 args->bc_attrs.max_resp_sz_cached = 0;
83268920 args->bc_attrs.max_ops = NFS4_MAX_BACK_CHANNEL_OPS;
83278921 args->bc_attrs.max_reqs = max_t(unsigned short, max_session_cb_slots, 1);
8922
+ if (args->bc_attrs.max_reqs > max_bc_slots)
8923
+ args->bc_attrs.max_reqs = max_bc_slots;
83288924
83298925 dprintk("%s: Back Channel : max_rqst_sz=%u max_resp_sz=%u "
83308926 "max_resp_sz_cached=%u max_ops=%u max_reqs=%u\n",
....@@ -8405,7 +9001,7 @@
84059001 }
84069002
84079003 static int _nfs4_proc_create_session(struct nfs_client *clp,
8408
- struct rpc_cred *cred)
9004
+ const struct cred *cred)
84099005 {
84109006 struct nfs4_session *session = clp->cl_session;
84119007 struct nfs41_create_session_args args = {
....@@ -8427,7 +9023,8 @@
84279023 nfs4_init_channel_attrs(&args, clp->cl_rpcclient);
84289024 args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN);
84299025
8430
- status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
9026
+ status = rpc_call_sync(session->clp->cl_rpcclient, &msg,
9027
+ RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN);
84319028 trace_nfs4_create_session(clp, status);
84329029
84339030 switch (status) {
....@@ -8437,7 +9034,7 @@
84379034 case -EACCES:
84389035 case -EAGAIN:
84399036 goto out;
8440
- };
9037
+ }
84419038
84429039 clp->cl_seqid++;
84439040 if (!status) {
....@@ -8457,7 +9054,7 @@
84579054 * It is the responsibility of the caller to verify the session is
84589055 * expired before calling this routine.
84599056 */
8460
-int nfs4_proc_create_session(struct nfs_client *clp, struct rpc_cred *cred)
9057
+int nfs4_proc_create_session(struct nfs_client *clp, const struct cred *cred)
84619058 {
84629059 int status;
84639060 unsigned *ptr;
....@@ -8488,7 +9085,7 @@
84889085 * The caller must serialize access to this routine.
84899086 */
84909087 int nfs4_proc_destroy_session(struct nfs4_session *session,
8491
- struct rpc_cred *cred)
9088
+ const struct cred *cred)
84929089 {
84939090 struct rpc_message msg = {
84949091 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_DESTROY_SESSION],
....@@ -8503,7 +9100,8 @@
85039100 if (!test_and_clear_bit(NFS4_SESSION_ESTABLISHED, &session->session_state))
85049101 return 0;
85059102
8506
- status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
9103
+ status = rpc_call_sync(session->clp->cl_rpcclient, &msg,
9104
+ RPC_TASK_TIMEOUT | RPC_TASK_NO_ROUND_ROBIN);
85079105 trace_nfs4_destroy_session(session->clp, status);
85089106
85099107 if (status)
....@@ -8590,7 +9188,7 @@
85909188 };
85919189
85929190 static struct rpc_task *_nfs41_proc_sequence(struct nfs_client *clp,
8593
- struct rpc_cred *cred,
9191
+ const struct cred *cred,
85949192 struct nfs4_slot *slot,
85959193 bool is_privileged)
85969194 {
....@@ -8633,7 +9231,7 @@
86339231 return ret;
86349232 }
86359233
8636
-static int nfs41_proc_async_sequence(struct nfs_client *clp, struct rpc_cred *cred, unsigned renew_flags)
9234
+static int nfs41_proc_async_sequence(struct nfs_client *clp, const struct cred *cred, unsigned renew_flags)
86379235 {
86389236 struct rpc_task *task;
86399237 int ret = 0;
....@@ -8649,7 +9247,7 @@
86499247 return ret;
86509248 }
86519249
8652
-static int nfs4_proc_sequence(struct nfs_client *clp, struct rpc_cred *cred)
9250
+static int nfs4_proc_sequence(struct nfs_client *clp, const struct cred *cred)
86539251 {
86549252 struct rpc_task *task;
86559253 int ret;
....@@ -8689,20 +9287,21 @@
86899287 switch(task->tk_status) {
86909288 case 0:
86919289 wake_up_all(&clp->cl_lock_waitq);
8692
- /* Fallthrough */
9290
+ fallthrough;
86939291 case -NFS4ERR_COMPLETE_ALREADY:
86949292 case -NFS4ERR_WRONG_CRED: /* What to do here? */
86959293 break;
86969294 case -NFS4ERR_DELAY:
86979295 rpc_delay(task, NFS4_POLL_RETRY_MAX);
8698
- /* fall through */
9296
+ fallthrough;
86999297 case -NFS4ERR_RETRY_UNCACHED_REP:
9298
+ case -EACCES:
9299
+ dprintk("%s: failed to reclaim complete error %d for server %s, retrying\n",
9300
+ __func__, task->tk_status, clp->cl_hostname);
87009301 return -EAGAIN;
87019302 case -NFS4ERR_BADSESSION:
87029303 case -NFS4ERR_DEADSESSION:
87039304 case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION:
8704
- nfs4_schedule_session_recovery(clp->cl_session,
8705
- task->tk_status);
87069305 break;
87079306 default:
87089307 nfs4_schedule_lease_recovery(clp);
....@@ -8745,10 +9344,9 @@
87459344 * Issue a global reclaim complete.
87469345 */
87479346 static int nfs41_proc_reclaim_complete(struct nfs_client *clp,
8748
- struct rpc_cred *cred)
9347
+ const struct cred *cred)
87499348 {
87509349 struct nfs4_reclaim_complete_data *calldata;
8751
- struct rpc_task *task;
87529350 struct rpc_message msg = {
87539351 .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_RECLAIM_COMPLETE],
87549352 .rpc_cred = cred,
....@@ -8757,7 +9355,7 @@
87579355 .rpc_client = clp->cl_rpcclient,
87589356 .rpc_message = &msg,
87599357 .callback_ops = &nfs4_reclaim_complete_call_ops,
8760
- .flags = RPC_TASK_ASYNC,
9358
+ .flags = RPC_TASK_NO_ROUND_ROBIN,
87619359 };
87629360 int status = -ENOMEM;
87639361
....@@ -8772,15 +9370,7 @@
87729370 msg.rpc_argp = &calldata->arg;
87739371 msg.rpc_resp = &calldata->res;
87749372 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);
9373
+ status = nfs4_call_sync_custom(&task_setup_data);
87849374 out:
87859375 dprintk("<-- %s status=%d\n", __func__, status);
87869376 return status;
....@@ -8937,7 +9527,7 @@
89379527 .rpc_message = &msg,
89389528 .callback_ops = &nfs4_layoutget_call_ops,
89399529 .callback_data = lgp,
8940
- .flags = RPC_TASK_ASYNC,
9530
+ .flags = RPC_TASK_ASYNC | RPC_TASK_CRED_NOREF,
89419531 };
89429532 struct pnfs_layout_segment *lseg = NULL;
89439533 struct nfs4_exception exception = {
....@@ -8954,16 +9544,17 @@
89549544 nfs4_init_sequence(&lgp->args.seq_args, &lgp->res.seq_res, 0, 0);
89559545
89569546 task = rpc_run_task(&task_setup_data);
8957
- if (IS_ERR(task))
8958
- return ERR_CAST(task);
9547
+
89599548 status = rpc_wait_for_completion_task(task);
89609549 if (status != 0)
89619550 goto out;
89629551
8963
- /* if layoutp->len is 0, nfs4_layoutget_prepare called rpc_exit */
8964
- if (task->tk_status < 0 || lgp->res.layoutp->len == 0) {
9552
+ if (task->tk_status < 0) {
89659553 status = nfs4_layoutget_handle_exception(task, lgp, &exception);
89669554 *timeout = exception.timeout;
9555
+ } else if (lgp->res.layoutp->len == 0) {
9556
+ status = -EAGAIN;
9557
+ *timeout = nfs4_update_delay(&exception.timeout);
89679558 } else
89689559 lseg = pnfs_layout_process(lgp);
89699560 out:
....@@ -9004,17 +9595,26 @@
90049595 if (!nfs41_sequence_process(task, &lrp->res.seq_res))
90059596 return;
90069597
9598
+ /*
9599
+ * Was there an RPC level error? Assume the call succeeded,
9600
+ * and that we need to release the layout
9601
+ */
9602
+ if (task->tk_rpc_status != 0 && RPC_WAS_SENT(task)) {
9603
+ lrp->res.lrs_present = 0;
9604
+ return;
9605
+ }
9606
+
90079607 server = NFS_SERVER(lrp->args.inode);
90089608 switch (task->tk_status) {
90099609 case -NFS4ERR_OLD_STATEID:
9010
- if (nfs4_layoutreturn_refresh_stateid(&lrp->args.stateid,
9610
+ if (nfs4_layout_refresh_old_stateid(&lrp->args.stateid,
90119611 &lrp->args.range,
90129612 lrp->args.inode))
90139613 goto out_restart;
9014
- /* Fallthrough */
9614
+ fallthrough;
90159615 default:
90169616 task->tk_status = 0;
9017
- /* Fallthrough */
9617
+ fallthrough;
90189618 case 0:
90199619 break;
90209620 case -NFS4ERR_DELAY:
....@@ -9043,6 +9643,7 @@
90439643 lrp->ld_private.ops->free(&lrp->ld_private);
90449644 pnfs_put_layout_hdr(lrp->args.layout);
90459645 nfs_iput_and_deactive(lrp->inode);
9646
+ put_cred(lrp->cred);
90469647 kfree(calldata);
90479648 dprintk("<-- %s\n", __func__);
90489649 }
....@@ -9103,7 +9704,7 @@
91039704 static int
91049705 _nfs4_proc_getdeviceinfo(struct nfs_server *server,
91059706 struct pnfs_device *pdev,
9106
- struct rpc_cred *cred)
9707
+ const struct cred *cred)
91079708 {
91089709 struct nfs4_getdeviceinfo_args args = {
91099710 .pdev = pdev,
....@@ -9135,7 +9736,7 @@
91359736
91369737 int nfs4_proc_getdeviceinfo(struct nfs_server *server,
91379738 struct pnfs_device *pdev,
9138
- struct rpc_cred *cred)
9739
+ const struct cred *cred)
91399740 {
91409741 struct nfs4_exception exception = { };
91419742 int err;
....@@ -9192,7 +9793,7 @@
91929793 pnfs_cleanup_layoutcommit(data);
91939794 nfs_post_op_update_inode_force_wcc(data->args.inode,
91949795 data->res.fattr);
9195
- put_rpccred(data->cred);
9796
+ put_cred(data->cred);
91969797 nfs_iput_and_deactive(data->inode);
91979798 kfree(data);
91989799 }
....@@ -9247,7 +9848,7 @@
92479848 return status;
92489849 }
92499850
9250
-/**
9851
+/*
92519852 * Use the state managment nfs_client cl_rpcclient, which uses krb5i (if
92529853 * possible) as per RFC3530bis and RFC5661 Security Considerations sections
92539854 */
....@@ -9267,23 +9868,34 @@
92679868 .rpc_argp = &args,
92689869 .rpc_resp = &res,
92699870 };
9270
- struct rpc_clnt *clnt = server->client;
9271
- struct rpc_cred *cred = NULL;
9871
+ struct nfs4_call_sync_data data = {
9872
+ .seq_server = server,
9873
+ .seq_args = &args.seq_args,
9874
+ .seq_res = &res.seq_res,
9875
+ };
9876
+ struct rpc_task_setup task_setup = {
9877
+ .rpc_client = server->client,
9878
+ .rpc_message = &msg,
9879
+ .callback_ops = server->nfs_client->cl_mvops->call_sync_ops,
9880
+ .callback_data = &data,
9881
+ .flags = RPC_TASK_NO_ROUND_ROBIN,
9882
+ };
9883
+ const struct cred *cred = NULL;
92729884 int status;
92739885
92749886 if (use_integrity) {
9275
- clnt = server->nfs_client->cl_rpcclient;
9887
+ task_setup.rpc_client = server->nfs_client->cl_rpcclient;
9888
+
92769889 cred = nfs4_get_clid_cred(server->nfs_client);
92779890 msg.rpc_cred = cred;
92789891 }
92799892
92809893 dprintk("--> %s\n", __func__);
9281
- status = nfs4_call_sync(clnt, server, &msg, &args.seq_args,
9282
- &res.seq_res, 0);
9894
+ nfs4_init_sequence(&args.seq_args, &res.seq_res, 0, 0);
9895
+ status = nfs4_call_sync_custom(&task_setup);
92839896 dprintk("<-- %s status=%d\n", __func__, status);
92849897
9285
- if (cred)
9286
- put_rpccred(cred);
9898
+ put_cred(cred);
92879899
92889900 return status;
92899901 }
....@@ -9292,7 +9904,9 @@
92929904 nfs41_proc_secinfo_no_name(struct nfs_server *server, struct nfs_fh *fhandle,
92939905 struct nfs_fsinfo *info, struct nfs4_secinfo_flavors *flavors)
92949906 {
9295
- struct nfs4_exception exception = { };
9907
+ struct nfs4_exception exception = {
9908
+ .interruptible = true,
9909
+ };
92969910 int err;
92979911 do {
92989912 /* first try using integrity protection */
....@@ -9396,7 +10010,7 @@
939610010
939710011 static int _nfs41_test_stateid(struct nfs_server *server,
939810012 nfs4_stateid *stateid,
9399
- struct rpc_cred *cred)
10013
+ const struct cred *cred)
940010014 {
940110015 int status;
940210016 struct nfs41_test_stateid_args args = {
....@@ -9457,9 +10071,11 @@
945710071 */
945810072 static int nfs41_test_stateid(struct nfs_server *server,
945910073 nfs4_stateid *stateid,
9460
- struct rpc_cred *cred)
10074
+ const struct cred *cred)
946110075 {
9462
- struct nfs4_exception exception = { };
10076
+ struct nfs4_exception exception = {
10077
+ .interruptible = true,
10078
+ };
946310079 int err;
946410080 do {
946510081 err = _nfs41_test_stateid(server, stateid, cred);
....@@ -9513,13 +10129,13 @@
951310129 * @server: server / transport on which to perform the operation
951410130 * @stateid: state ID to release
951510131 * @cred: credential
9516
- * @is_recovery: set to true if this call needs to be privileged
10132
+ * @privileged: set to true if this call needs to be privileged
951710133 *
951810134 * Note: this function is always asynchronous.
951910135 */
952010136 static int nfs41_free_stateid(struct nfs_server *server,
952110137 const nfs4_stateid *stateid,
9522
- struct rpc_cred *cred,
10138
+ const struct cred *cred,
952310139 bool privileged)
952410140 {
952510141 struct rpc_message msg = {
....@@ -9560,7 +10176,7 @@
956010176 static void
956110177 nfs41_free_lock_state(struct nfs_server *server, struct nfs4_lock_state *lsp)
956210178 {
9563
- struct rpc_cred *cred = lsp->ls_state->owner->so_cred;
10179
+ const struct cred *cred = lsp->ls_state->owner->so_cred;
956410180
956510181 nfs41_free_stateid(server, &lsp->ls_stateid, cred, false);
956610182 nfs4_free_lock_state(server, lsp);
....@@ -9631,14 +10247,14 @@
963110247
963210248 static const struct nfs4_state_maintenance_ops nfs40_state_renewal_ops = {
963310249 .sched_state_renewal = nfs4_proc_async_renew,
9634
- .get_state_renewal_cred_locked = nfs4_get_renew_cred_locked,
10250
+ .get_state_renewal_cred = nfs4_get_renew_cred,
963510251 .renew_lease = nfs4_proc_renew,
963610252 };
963710253
963810254 #if defined(CONFIG_NFS_V4_1)
963910255 static const struct nfs4_state_maintenance_ops nfs41_state_renewal_ops = {
964010256 .sched_state_renewal = nfs41_proc_async_sequence,
9641
- .get_state_renewal_cred_locked = nfs4_get_machine_cred_locked,
10257
+ .get_state_renewal_cred = nfs4_get_machine_cred,
964210258 .renew_lease = nfs4_proc_sequence,
964310259 };
964410260 #endif
....@@ -9717,10 +10333,13 @@
971710333 | NFS_CAP_ALLOCATE
971810334 | NFS_CAP_COPY
971910335 | NFS_CAP_OFFLOAD_CANCEL
10336
+ | NFS_CAP_COPY_NOTIFY
972010337 | NFS_CAP_DEALLOCATE
972110338 | NFS_CAP_SEEK
972210339 | NFS_CAP_LAYOUTSTATS
9723
- | NFS_CAP_CLONE,
10340
+ | NFS_CAP_CLONE
10341
+ | NFS_CAP_LAYOUTERROR
10342
+ | NFS_CAP_READ_PLUS,
972410343 .init_client = nfs41_init_client,
972510344 .shutdown_client = nfs41_shutdown_client,
972610345 .match_stateid = nfs41_match_stateid,
....@@ -9749,7 +10368,7 @@
974910368
975010369 static ssize_t nfs4_listxattr(struct dentry *dentry, char *list, size_t size)
975110370 {
9752
- ssize_t error, error2;
10371
+ ssize_t error, error2, error3;
975310372
975410373 error = generic_listxattr(dentry, list, size);
975510374 if (error < 0)
....@@ -9762,7 +10381,39 @@
976210381 error2 = nfs4_listxattr_nfs4_label(d_inode(dentry), list, size);
976310382 if (error2 < 0)
976410383 return error2;
9765
- return error + error2;
10384
+
10385
+ if (list) {
10386
+ list += error2;
10387
+ size -= error2;
10388
+ }
10389
+
10390
+ error3 = nfs4_listxattr_nfs4_user(d_inode(dentry), list, size);
10391
+ if (error3 < 0)
10392
+ return error3;
10393
+
10394
+ return error + error2 + error3;
10395
+}
10396
+
10397
+static void nfs4_enable_swap(struct inode *inode)
10398
+{
10399
+ /* The state manager thread must always be running.
10400
+ * It will notice the client is a swapper, and stay put.
10401
+ */
10402
+ struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
10403
+
10404
+ nfs4_schedule_state_manager(clp);
10405
+}
10406
+
10407
+static void nfs4_disable_swap(struct inode *inode)
10408
+{
10409
+ /* The state manager thread will now exit once it is
10410
+ * woken.
10411
+ */
10412
+ struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
10413
+
10414
+ set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state);
10415
+ clear_bit(NFS4CLNT_MANAGER_AVAILABLE, &clp->cl_state);
10416
+ wake_up_var(&clp->cl_state);
976610417 }
976710418
976810419 static const struct inode_operations nfs4_dir_inode_operations = {
....@@ -9797,7 +10448,7 @@
979710448 .file_ops = &nfs4_file_operations,
979810449 .getroot = nfs4_proc_get_root,
979910450 .submount = nfs4_submount,
9800
- .try_mount = nfs4_try_mount,
10451
+ .try_get_tree = nfs4_try_get_tree,
980110452 .getattr = nfs4_proc_getattr,
980210453 .setattr = nfs4_proc_setattr,
980310454 .lookup = nfs4_proc_lookup,
....@@ -9841,6 +10492,8 @@
984110492 .free_client = nfs4_free_client,
984210493 .create_server = nfs4_create_server,
984310494 .clone_server = nfs_clone_server,
10495
+ .enable_swap = nfs4_enable_swap,
10496
+ .disable_swap = nfs4_disable_swap,
984410497 };
984510498
984610499 static const struct xattr_handler nfs4_xattr_nfs4_acl_handler = {
....@@ -9850,11 +10503,22 @@
985010503 .set = nfs4_xattr_set_nfs4_acl,
985110504 };
985210505
10506
+#ifdef CONFIG_NFS_V4_2
10507
+static const struct xattr_handler nfs4_xattr_nfs4_user_handler = {
10508
+ .prefix = XATTR_USER_PREFIX,
10509
+ .get = nfs4_xattr_get_nfs4_user,
10510
+ .set = nfs4_xattr_set_nfs4_user,
10511
+};
10512
+#endif
10513
+
985310514 const struct xattr_handler *nfs4_xattr_handlers[] = {
985410515 &nfs4_xattr_nfs4_acl_handler,
985510516 #ifdef CONFIG_NFS_V4_SECURITY_LABEL
985610517 &nfs4_xattr_nfs4_label_handler,
985710518 #endif
10519
+#ifdef CONFIG_NFS_V4_2
10520
+ &nfs4_xattr_nfs4_user_handler,
10521
+#endif
985810522 NULL
985910523 };
986010524