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[3];
50 };
51 
52 struct cb_getattrres {
53 	__be32 status;
54 	uint32_t bitmap[3];
55 	uint64_t size;
56 	uint64_t change_attr;
57 	struct timespec64 atime;
58 	struct timespec64 ctime;
59 	struct timespec64 mtime;
60 };
61 
62 struct cb_recallargs {
63 	struct nfs_fh fh;
64 	nfs4_stateid stateid;
65 	uint32_t truncate;
66 };
67 
68 #if defined(CONFIG_NFS_V4_1)
69 
70 struct referring_call {
71 	uint32_t			rc_sequenceid;
72 	uint32_t			rc_slotid;
73 };
74 
75 struct referring_call_list {
76 	struct nfs4_sessionid		rcl_sessionid;
77 	uint32_t			rcl_nrefcalls;
78 	struct referring_call 		*rcl_refcalls;
79 };
80 
81 struct cb_sequenceargs {
82 	struct sockaddr			*csa_addr;
83 	struct nfs4_sessionid		csa_sessionid;
84 	uint32_t			csa_sequenceid;
85 	uint32_t			csa_slotid;
86 	uint32_t			csa_highestslotid;
87 	uint32_t			csa_cachethis;
88 	uint32_t			csa_nrclists;
89 	struct referring_call_list	*csa_rclists;
90 };
91 
92 struct cb_sequenceres {
93 	__be32				csr_status;
94 	struct nfs4_sessionid		csr_sessionid;
95 	uint32_t			csr_sequenceid;
96 	uint32_t			csr_slotid;
97 	uint32_t			csr_highestslotid;
98 	uint32_t			csr_target_highestslotid;
99 };
100 
101 extern __be32 nfs4_callback_sequence(void *argp, void *resp,
102 				       struct cb_process_state *cps);
103 
104 #define RCA4_TYPE_MASK_RDATA_DLG	0
105 #define RCA4_TYPE_MASK_WDATA_DLG	1
106 #define RCA4_TYPE_MASK_DIR_DLG         2
107 #define RCA4_TYPE_MASK_FILE_LAYOUT     3
108 #define RCA4_TYPE_MASK_BLK_LAYOUT      4
109 #define RCA4_TYPE_MASK_OBJ_LAYOUT_MIN  8
110 #define RCA4_TYPE_MASK_OBJ_LAYOUT_MAX  9
111 #define RCA4_TYPE_MASK_OTHER_LAYOUT_MIN 12
112 #define RCA4_TYPE_MASK_OTHER_LAYOUT_MAX 15
113 #define PNFS_FF_RCA4_TYPE_MASK_READ 16
114 #define PNFS_FF_RCA4_TYPE_MASK_RW 17
115 #define RCA4_TYPE_MASK_ALL 0x3f31f
116 
117 struct cb_recallanyargs {
118 	uint32_t	craa_objs_to_keep;
119 	uint32_t	craa_type_mask;
120 };
121 
122 extern __be32 nfs4_callback_recallany(void *argp, void *resp,
123 					struct cb_process_state *cps);
124 
125 struct cb_recallslotargs {
126 	uint32_t	crsa_target_highest_slotid;
127 };
128 extern __be32 nfs4_callback_recallslot(void *argp, void *resp,
129 					 struct cb_process_state *cps);
130 
131 struct cb_layoutrecallargs {
132 	uint32_t		cbl_recall_type;
133 	uint32_t		cbl_layout_type;
134 	uint32_t		cbl_layoutchanged;
135 	union {
136 		struct {
137 			struct nfs_fh		cbl_fh;
138 			struct pnfs_layout_range cbl_range;
139 			nfs4_stateid		cbl_stateid;
140 		};
141 		struct nfs_fsid		cbl_fsid;
142 	};
143 };
144 
145 extern __be32 nfs4_callback_layoutrecall(void *argp, void *resp,
146 		struct cb_process_state *cps);
147 
148 struct cb_devicenotifyitem {
149 	uint32_t		cbd_notify_type;
150 	uint32_t		cbd_layout_type;
151 	struct nfs4_deviceid	cbd_dev_id;
152 	uint32_t		cbd_immediate;
153 };
154 
155 struct cb_devicenotifyargs {
156 	uint32_t			 ndevs;
157 	struct cb_devicenotifyitem	 *devs;
158 };
159 
160 extern __be32 nfs4_callback_devicenotify(void *argp, void *resp,
161 		struct cb_process_state *cps);
162 
163 struct cb_notify_lock_args {
164 	struct nfs_fh			cbnl_fh;
165 	struct nfs_lowner		cbnl_owner;
166 	bool				cbnl_valid;
167 };
168 
169 extern __be32 nfs4_callback_notify_lock(void *argp, void *resp,
170 					 struct cb_process_state *cps);
171 #endif /* CONFIG_NFS_V4_1 */
172 #ifdef CONFIG_NFS_V4_2
173 struct cb_offloadargs {
174 	struct nfs_fh		coa_fh;
175 	nfs4_stateid		coa_stateid;
176 	uint32_t		error;
177 	uint64_t		wr_count;
178 	struct nfs_writeverf	wr_writeverf;
179 };
180 
181 extern __be32 nfs4_callback_offload(void *args, void *dummy,
182 				    struct cb_process_state *cps);
183 #endif /* CONFIG_NFS_V4_2 */
184 extern int check_gss_callback_principal(struct nfs_client *, struct svc_rqst *);
185 extern __be32 nfs4_callback_getattr(void *argp, void *resp,
186 				    struct cb_process_state *cps);
187 extern __be32 nfs4_callback_recall(void *argp, void *resp,
188 				   struct cb_process_state *cps);
189 #if IS_ENABLED(CONFIG_NFS_V4)
190 extern int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt);
191 extern void nfs_callback_down(int minorversion, struct net *net);
192 #endif /* CONFIG_NFS_V4 */
193 /*
194  * nfs41: Callbacks are expected to not cause substantial latency,
195  * so we limit their concurrency to 1 by setting up the maximum number
196  * of slots for the backchannel.
197  */
198 #define NFS41_BC_MIN_CALLBACKS 1
199 #define NFS41_BC_MAX_CALLBACKS 1
200 
201 #define NFS4_MIN_NR_CALLBACK_THREADS 1
202 
203 extern unsigned int nfs_callback_set_tcpport;
204 extern unsigned short nfs_callback_nr_threads;
205 
206 #endif /* __LINUX_FS_NFS_CALLBACK_H */
207