aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfsd/nfs4callback.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfsd/nfs4callback.c')
-rw-r--r--fs/nfsd/nfs4callback.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index 128519769ea8..db4188ce9b00 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -43,6 +43,7 @@
43#include <linux/sunrpc/xdr.h> 43#include <linux/sunrpc/xdr.h>
44#include <linux/sunrpc/svc.h> 44#include <linux/sunrpc/svc.h>
45#include <linux/sunrpc/clnt.h> 45#include <linux/sunrpc/clnt.h>
46#include <linux/sunrpc/svcsock.h>
46#include <linux/nfsd/nfsd.h> 47#include <linux/nfsd/nfsd.h>
47#include <linux/nfsd/state.h> 48#include <linux/nfsd/state.h>
48#include <linux/sunrpc/sched.h> 49#include <linux/sunrpc/sched.h>
@@ -52,16 +53,19 @@
52 53
53#define NFSPROC4_CB_NULL 0 54#define NFSPROC4_CB_NULL 0
54#define NFSPROC4_CB_COMPOUND 1 55#define NFSPROC4_CB_COMPOUND 1
56#define NFS4_STATEID_SIZE 16
55 57
56/* Index of predefined Linux callback client operations */ 58/* Index of predefined Linux callback client operations */
57 59
58enum { 60enum {
59 NFSPROC4_CLNT_CB_NULL = 0, 61 NFSPROC4_CLNT_CB_NULL = 0,
60 NFSPROC4_CLNT_CB_RECALL, 62 NFSPROC4_CLNT_CB_RECALL,
63 NFSPROC4_CLNT_CB_SEQUENCE,
61}; 64};
62 65
63enum nfs_cb_opnum4 { 66enum nfs_cb_opnum4 {
64 OP_CB_RECALL = 4, 67 OP_CB_RECALL = 4,
68 OP_CB_SEQUENCE = 11,
65}; 69};
66 70
67#define NFS4_MAXTAGLEN 20 71#define NFS4_MAXTAGLEN 20
@@ -70,15 +74,22 @@ enum nfs_cb_opnum4 {
70#define NFS4_dec_cb_null_sz 0 74#define NFS4_dec_cb_null_sz 0
71#define cb_compound_enc_hdr_sz 4 75#define cb_compound_enc_hdr_sz 4
72#define cb_compound_dec_hdr_sz (3 + (NFS4_MAXTAGLEN >> 2)) 76#define cb_compound_dec_hdr_sz (3 + (NFS4_MAXTAGLEN >> 2))
77#define sessionid_sz (NFS4_MAX_SESSIONID_LEN >> 2)
78#define cb_sequence_enc_sz (sessionid_sz + 4 + \
79 1 /* no referring calls list yet */)
80#define cb_sequence_dec_sz (op_dec_sz + sessionid_sz + 4)
81
73#define op_enc_sz 1 82#define op_enc_sz 1
74#define op_dec_sz 2 83#define op_dec_sz 2
75#define enc_nfs4_fh_sz (1 + (NFS4_FHSIZE >> 2)) 84#define enc_nfs4_fh_sz (1 + (NFS4_FHSIZE >> 2))
76#define enc_stateid_sz (NFS4_STATEID_SIZE >> 2) 85#define enc_stateid_sz (NFS4_STATEID_SIZE >> 2)
77#define NFS4_enc_cb_recall_sz (cb_compound_enc_hdr_sz + \ 86#define NFS4_enc_cb_recall_sz (cb_compound_enc_hdr_sz + \
87 cb_sequence_enc_sz + \
78 1 + enc_stateid_sz + \ 88 1 + enc_stateid_sz + \
79 enc_nfs4_fh_sz) 89 enc_nfs4_fh_sz)
80 90
81#define NFS4_dec_cb_recall_sz (cb_compound_dec_hdr_sz + \ 91#define NFS4_dec_cb_recall_sz (cb_compound_dec_hdr_sz + \
92 cb_sequence_dec_sz + \
82 op_dec_sz) 93 op_dec_sz)
83 94
84/* 95/*
@@ -137,11 +148,13 @@ xdr_error: \
137} while (0) 148} while (0)
138 149
139struct nfs4_cb_compound_hdr { 150struct nfs4_cb_compound_hdr {
140 int status; 151 /* args */
141 u32 ident; 152 u32 ident; /* minorversion 0 only */
142 u32 nops; 153 u32 nops;
143 __be32 *nops_p; 154 __be32 *nops_p;
144 u32 minorversion; 155 u32 minorversion;
156 /* res */
157 int status;
145 u32 taglen; 158 u32 taglen;
146 char *tag; 159 char *tag;
147}; 160};