diff options
-rw-r--r-- | fs/nfsd/nfs4callback.c | 43 | ||||
-rw-r--r-- | fs/nfsd/nfs4state.c | 4 | ||||
-rw-r--r-- | fs/nfsd/state.h | 10 |
3 files changed, 22 insertions, 35 deletions
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index 06e07e18ea78..03d9f4f298ec 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c | |||
@@ -49,12 +49,6 @@ static void nfsd4_mark_cb_fault(struct nfs4_client *, int reason); | |||
49 | 49 | ||
50 | /* Index of predefined Linux callback client operations */ | 50 | /* Index of predefined Linux callback client operations */ |
51 | 51 | ||
52 | enum { | ||
53 | NFSPROC4_CLNT_CB_NULL = 0, | ||
54 | NFSPROC4_CLNT_CB_RECALL, | ||
55 | NFSPROC4_CLNT_CB_SEQUENCE, | ||
56 | }; | ||
57 | |||
58 | #define to_delegation(cb) \ | 52 | #define to_delegation(cb) \ |
59 | container_of(cb, struct nfs4_delegation, dl_recall) | 53 | container_of(cb, struct nfs4_delegation, dl_recall) |
60 | 54 | ||
@@ -749,24 +743,9 @@ static const struct rpc_call_ops nfsd4_cb_probe_ops = { | |||
749 | 743 | ||
750 | static struct workqueue_struct *callback_wq; | 744 | static struct workqueue_struct *callback_wq; |
751 | 745 | ||
752 | static void run_nfsd4_cb(struct nfsd4_callback *cb) | ||
753 | { | ||
754 | queue_work(callback_wq, &cb->cb_work); | ||
755 | } | ||
756 | |||
757 | static void do_probe_callback(struct nfs4_client *clp) | 746 | static void do_probe_callback(struct nfs4_client *clp) |
758 | { | 747 | { |
759 | struct nfsd4_callback *cb = &clp->cl_cb_null; | 748 | return nfsd4_cb(&clp->cl_cb_null, clp, NFSPROC4_CLNT_CB_NULL); |
760 | |||
761 | cb->cb_clp = clp; | ||
762 | |||
763 | cb->cb_msg.rpc_proc = &nfs4_cb_procedures[NFSPROC4_CLNT_CB_NULL]; | ||
764 | cb->cb_msg.rpc_argp = NULL; | ||
765 | cb->cb_msg.rpc_resp = NULL; | ||
766 | |||
767 | cb->cb_ops = &nfsd4_cb_probe_ops; | ||
768 | |||
769 | run_nfsd4_cb(cb); | ||
770 | } | 749 | } |
771 | 750 | ||
772 | /* | 751 | /* |
@@ -1005,7 +984,7 @@ static void nfsd4_process_cb_update(struct nfsd4_callback *cb) | |||
1005 | } | 984 | } |
1006 | /* Yay, the callback channel's back! Restart any callbacks: */ | 985 | /* Yay, the callback channel's back! Restart any callbacks: */ |
1007 | list_for_each_entry(cb, &clp->cl_callbacks, cb_per_client) | 986 | list_for_each_entry(cb, &clp->cl_callbacks, cb_per_client) |
1008 | run_nfsd4_cb(cb); | 987 | queue_work(callback_wq, &cb->cb_work); |
1009 | } | 988 | } |
1010 | 989 | ||
1011 | static void | 990 | static void |
@@ -1046,21 +1025,19 @@ nfsd4_run_cb_recall(struct work_struct *w) | |||
1046 | nfsd4_run_callback_rpc(cb); | 1025 | nfsd4_run_callback_rpc(cb); |
1047 | } | 1026 | } |
1048 | 1027 | ||
1049 | void nfsd4_cb_recall(struct nfs4_delegation *dp) | 1028 | void nfsd4_cb(struct nfsd4_callback *cb, struct nfs4_client *clp, |
1029 | enum nfsd4_cb_op op) | ||
1050 | { | 1030 | { |
1051 | struct nfsd4_callback *cb = &dp->dl_recall; | ||
1052 | struct nfs4_client *clp = dp->dl_stid.sc_client; | ||
1053 | |||
1054 | dp->dl_retries = 1; | ||
1055 | cb->cb_clp = clp; | 1031 | cb->cb_clp = clp; |
1056 | cb->cb_msg.rpc_proc = &nfs4_cb_procedures[NFSPROC4_CLNT_CB_RECALL]; | 1032 | cb->cb_msg.rpc_proc = &nfs4_cb_procedures[op]; |
1057 | cb->cb_msg.rpc_argp = cb; | 1033 | cb->cb_msg.rpc_argp = cb; |
1058 | cb->cb_msg.rpc_resp = cb; | 1034 | cb->cb_msg.rpc_resp = cb; |
1059 | 1035 | if (op == NFSPROC4_CLNT_CB_NULL) | |
1060 | cb->cb_ops = &nfsd4_cb_recall_ops; | 1036 | cb->cb_ops = &nfsd4_cb_probe_ops; |
1061 | 1037 | else | |
1038 | cb->cb_ops = &nfsd4_cb_recall_ops; | ||
1062 | INIT_LIST_HEAD(&cb->cb_per_client); | 1039 | INIT_LIST_HEAD(&cb->cb_per_client); |
1063 | cb->cb_done = true; | 1040 | cb->cb_done = true; |
1064 | 1041 | ||
1065 | run_nfsd4_cb(&dp->dl_recall); | 1042 | queue_work(callback_wq, &cb->cb_work); |
1066 | } | 1043 | } |
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index ec24272529a0..ae9846b976b4 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -3388,7 +3388,9 @@ static void nfsd_break_one_deleg(struct nfs4_delegation *dp) | |||
3388 | * it's safe to take a reference. | 3388 | * it's safe to take a reference. |
3389 | */ | 3389 | */ |
3390 | atomic_inc(&dp->dl_stid.sc_count); | 3390 | atomic_inc(&dp->dl_stid.sc_count); |
3391 | nfsd4_cb_recall(dp); | 3391 | dp->dl_retries = 1; |
3392 | nfsd4_cb(&dp->dl_recall, dp->dl_stid.sc_client, | ||
3393 | NFSPROC4_CLNT_CB_RECALL); | ||
3392 | } | 3394 | } |
3393 | 3395 | ||
3394 | /* Called from break_lease() with i_lock held. */ | 3396 | /* Called from break_lease() with i_lock held. */ |
diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h index 57d2db63a1ed..5fb6ab17f386 100644 --- a/fs/nfsd/state.h +++ b/fs/nfsd/state.h | |||
@@ -517,6 +517,13 @@ static inline struct nfs4_ol_stateid *openlockstateid(struct nfs4_stid *s) | |||
517 | #define RD_STATE 0x00000010 | 517 | #define RD_STATE 0x00000010 |
518 | #define WR_STATE 0x00000020 | 518 | #define WR_STATE 0x00000020 |
519 | 519 | ||
520 | enum nfsd4_cb_op { | ||
521 | NFSPROC4_CLNT_CB_NULL = 0, | ||
522 | NFSPROC4_CLNT_CB_RECALL, | ||
523 | NFSPROC4_CLNT_CB_SEQUENCE, | ||
524 | }; | ||
525 | |||
526 | |||
520 | struct nfsd4_compound_state; | 527 | struct nfsd4_compound_state; |
521 | struct nfsd_net; | 528 | struct nfsd_net; |
522 | 529 | ||
@@ -536,7 +543,8 @@ void nfsd4_run_cb_recall(struct work_struct *w); | |||
536 | extern void nfsd4_probe_callback(struct nfs4_client *clp); | 543 | extern void nfsd4_probe_callback(struct nfs4_client *clp); |
537 | extern void nfsd4_probe_callback_sync(struct nfs4_client *clp); | 544 | extern void nfsd4_probe_callback_sync(struct nfs4_client *clp); |
538 | extern void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn *); | 545 | extern void nfsd4_change_callback(struct nfs4_client *clp, struct nfs4_cb_conn *); |
539 | extern void nfsd4_cb_recall(struct nfs4_delegation *dp); | 546 | extern void nfsd4_cb(struct nfsd4_callback *cb, struct nfs4_client *clp, |
547 | enum nfsd4_cb_op op); | ||
540 | extern int nfsd4_create_callback_queue(void); | 548 | extern int nfsd4_create_callback_queue(void); |
541 | extern void nfsd4_destroy_callback_queue(void); | 549 | extern void nfsd4_destroy_callback_queue(void); |
542 | extern void nfsd4_shutdown_callback(struct nfs4_client *); | 550 | extern void nfsd4_shutdown_callback(struct nfs4_client *); |