GNU Linux-libre 6.8.7-gnu
[releases.git] / fs / nfs / callback.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * linux/fs/nfs/callback.h
4  *
5  * Copyright (C) 2004 Trond Myklebust
6  *
7  * NFSv4 callback definitions
8  */
9 #ifndef __LINUX_FS_NFS_CALLBACK_H
10 #define __LINUX_FS_NFS_CALLBACK_H
11 #include <linux/sunrpc/svc.h>
12
13 #define NFS4_CALLBACK 0x40000000
14 #define NFS4_CALLBACK_XDRSIZE 2048
15 #define NFS4_CALLBACK_BUFSIZE (1024 + NFS4_CALLBACK_XDRSIZE)
16
17 enum nfs4_callback_procnum {
18         CB_NULL = 0,
19         CB_COMPOUND = 1,
20 };
21
22 struct nfs4_slot;
23 struct cb_process_state {
24         struct nfs_client       *clp;
25         struct nfs4_slot        *slot;
26         struct net              *net;
27         u32                     minorversion;
28         __be32                  drc_status;
29         unsigned int            referring_calls;
30 };
31
32 struct cb_compound_hdr_arg {
33         unsigned int taglen;
34         const char *tag;
35         unsigned int minorversion;
36         unsigned int cb_ident; /* v4.0 callback identifier */
37         unsigned nops;
38 };
39
40 struct cb_compound_hdr_res {
41         __be32 *status;
42         unsigned int taglen;
43         const char *tag;
44         __be32 *nops;
45 };
46
47 struct cb_getattrargs {
48         struct nfs_fh fh;
49         uint32_t bitmap[2];
50 };
51
52 struct cb_getattrres {
53         __be32 status;
54         uint32_t bitmap[2];
55         uint64_t size;
56         uint64_t change_attr;
57         struct timespec64 ctime;
58         struct timespec64 mtime;
59 };
60
61 struct cb_recallargs {
62         struct nfs_fh fh;
63         nfs4_stateid stateid;
64         uint32_t truncate;
65 };
66
67 #if defined(CONFIG_NFS_V4_1)
68
69 struct referring_call {
70         uint32_t                        rc_sequenceid;
71         uint32_t                        rc_slotid;
72 };
73
74 struct referring_call_list {
75         struct nfs4_sessionid           rcl_sessionid;
76         uint32_t                        rcl_nrefcalls;
77         struct referring_call           *rcl_refcalls;
78 };
79
80 struct cb_sequenceargs {
81         struct sockaddr                 *csa_addr;
82         struct nfs4_sessionid           csa_sessionid;
83         uint32_t                        csa_sequenceid;
84         uint32_t                        csa_slotid;
85         uint32_t                        csa_highestslotid;
86         uint32_t                        csa_cachethis;
87         uint32_t                        csa_nrclists;
88         struct referring_call_list      *csa_rclists;
89 };
90
91 struct cb_sequenceres {
92         __be32                          csr_status;
93         struct nfs4_sessionid           csr_sessionid;
94         uint32_t                        csr_sequenceid;
95         uint32_t                        csr_slotid;
96         uint32_t                        csr_highestslotid;
97         uint32_t                        csr_target_highestslotid;
98 };
99
100 extern __be32 nfs4_callback_sequence(void *argp, void *resp,
101                                        struct cb_process_state *cps);
102
103 #define RCA4_TYPE_MASK_RDATA_DLG        0
104 #define RCA4_TYPE_MASK_WDATA_DLG        1
105 #define RCA4_TYPE_MASK_DIR_DLG         2
106 #define RCA4_TYPE_MASK_FILE_LAYOUT     3
107 #define RCA4_TYPE_MASK_BLK_LAYOUT      4
108 #define RCA4_TYPE_MASK_OBJ_LAYOUT_MIN  8
109 #define RCA4_TYPE_MASK_OBJ_LAYOUT_MAX  9
110 #define RCA4_TYPE_MASK_OTHER_LAYOUT_MIN 12
111 #define RCA4_TYPE_MASK_OTHER_LAYOUT_MAX 15
112 #define PNFS_FF_RCA4_TYPE_MASK_READ 16
113 #define PNFS_FF_RCA4_TYPE_MASK_RW 17
114 #define RCA4_TYPE_MASK_ALL 0x3f31f
115
116 struct cb_recallanyargs {
117         uint32_t        craa_objs_to_keep;
118         uint32_t        craa_type_mask;
119 };
120
121 extern __be32 nfs4_callback_recallany(void *argp, void *resp,
122                                         struct cb_process_state *cps);
123
124 struct cb_recallslotargs {
125         uint32_t        crsa_target_highest_slotid;
126 };
127 extern __be32 nfs4_callback_recallslot(void *argp, void *resp,
128                                          struct cb_process_state *cps);
129
130 struct cb_layoutrecallargs {
131         uint32_t                cbl_recall_type;
132         uint32_t                cbl_layout_type;
133         uint32_t                cbl_layoutchanged;
134         union {
135                 struct {
136                         struct nfs_fh           cbl_fh;
137                         struct pnfs_layout_range cbl_range;
138                         nfs4_stateid            cbl_stateid;
139                 };
140                 struct nfs_fsid         cbl_fsid;
141         };
142 };
143
144 extern __be32 nfs4_callback_layoutrecall(void *argp, void *resp,
145                 struct cb_process_state *cps);
146
147 struct cb_devicenotifyitem {
148         uint32_t                cbd_notify_type;
149         uint32_t                cbd_layout_type;
150         struct nfs4_deviceid    cbd_dev_id;
151         uint32_t                cbd_immediate;
152 };
153
154 struct cb_devicenotifyargs {
155         uint32_t                         ndevs;
156         struct cb_devicenotifyitem       *devs;
157 };
158
159 extern __be32 nfs4_callback_devicenotify(void *argp, void *resp,
160                 struct cb_process_state *cps);
161
162 struct cb_notify_lock_args {
163         struct nfs_fh                   cbnl_fh;
164         struct nfs_lowner               cbnl_owner;
165         bool                            cbnl_valid;
166 };
167
168 extern __be32 nfs4_callback_notify_lock(void *argp, void *resp,
169                                          struct cb_process_state *cps);
170 #endif /* CONFIG_NFS_V4_1 */
171 #ifdef CONFIG_NFS_V4_2
172 struct cb_offloadargs {
173         struct nfs_fh           coa_fh;
174         nfs4_stateid            coa_stateid;
175         uint32_t                error;
176         uint64_t                wr_count;
177         struct nfs_writeverf    wr_writeverf;
178 };
179
180 extern __be32 nfs4_callback_offload(void *args, void *dummy,
181                                     struct cb_process_state *cps);
182 #endif /* CONFIG_NFS_V4_2 */
183 extern int check_gss_callback_principal(struct nfs_client *, struct svc_rqst *);
184 extern __be32 nfs4_callback_getattr(void *argp, void *resp,
185                                     struct cb_process_state *cps);
186 extern __be32 nfs4_callback_recall(void *argp, void *resp,
187                                    struct cb_process_state *cps);
188 #if IS_ENABLED(CONFIG_NFS_V4)
189 extern int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt);
190 extern void nfs_callback_down(int minorversion, struct net *net);
191 #endif /* CONFIG_NFS_V4 */
192 /*
193  * nfs41: Callbacks are expected to not cause substantial latency,
194  * so we limit their concurrency to 1 by setting up the maximum number
195  * of slots for the backchannel.
196  */
197 #define NFS41_BC_MIN_CALLBACKS 1
198 #define NFS41_BC_MAX_CALLBACKS 1
199
200 #define NFS4_MIN_NR_CALLBACK_THREADS 1
201
202 extern unsigned int nfs_callback_set_tcpport;
203 extern unsigned short nfs_callback_nr_threads;
204
205 #endif /* __LINUX_FS_NFS_CALLBACK_H */