blob: ccd4f245cae240b812c3a7e6d44e2de32de819c5 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
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
Andy Adamson778be232011-01-25 15:38:01 +000011#include <linux/sunrpc/svc.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070012
13#define NFS4_CALLBACK 0x40000000
14#define NFS4_CALLBACK_XDRSIZE 2048
15#define NFS4_CALLBACK_BUFSIZE (1024 + NFS4_CALLBACK_XDRSIZE)
16
17enum nfs4_callback_procnum {
18 CB_NULL = 0,
19 CB_COMPOUND = 1,
20};
21
22enum nfs4_callback_opnum {
23 OP_CB_GETATTR = 3,
24 OP_CB_RECALL = 4,
Benny Halevy45377b92009-04-01 09:23:21 -040025/* Callback operations new to NFSv4.1 */
26 OP_CB_LAYOUTRECALL = 5,
27 OP_CB_NOTIFY = 6,
28 OP_CB_PUSH_DELEG = 7,
29 OP_CB_RECALL_ANY = 8,
30 OP_CB_RECALLABLE_OBJ_AVAIL = 9,
31 OP_CB_RECALL_SLOT = 10,
32 OP_CB_SEQUENCE = 11,
33 OP_CB_WANTS_CANCELLED = 12,
34 OP_CB_NOTIFY_LOCK = 13,
Benny Halevy34bc47c92009-04-01 09:23:22 -040035 OP_CB_NOTIFY_DEVICEID = 14,
Bryan Schumaker6b140b82013-06-05 11:15:02 -040036/* Callback operations new to NFSv4.2 */
37 OP_CB_OFFLOAD = 15,
Linus Torvalds1da177e2005-04-16 15:20:36 -070038 OP_CB_ILLEGAL = 10044,
39};
40
Trond Myklebust810d82e2016-01-23 15:18:18 -050041struct nfs4_slot;
Andy Adamsonc36fca52011-01-06 02:04:32 +000042struct cb_process_state {
43 __be32 drc_status;
44 struct nfs_client *clp;
Trond Myklebust810d82e2016-01-23 15:18:18 -050045 struct nfs4_slot *slot;
Bryan Schumaker459de2e2013-06-05 11:15:01 -040046 u32 minorversion;
Stanislav Kinsburskyc7add9a2012-01-26 15:11:49 +040047 struct net *net;
Andy Adamsonc36fca52011-01-06 02:04:32 +000048};
49
Linus Torvalds1da177e2005-04-16 15:20:36 -070050struct cb_compound_hdr_arg {
Trond Myklebust2e42c3e2007-05-14 17:20:41 -040051 unsigned int taglen;
Linus Torvalds1da177e2005-04-16 15:20:36 -070052 const char *tag;
Benny Halevyb8f2ef82009-04-01 09:23:19 -040053 unsigned int minorversion;
Andy Adamsonc36fca52011-01-06 02:04:32 +000054 unsigned int cb_ident; /* v4.0 callback identifier */
Linus Torvalds1da177e2005-04-16 15:20:36 -070055 unsigned nops;
56};
57
58struct cb_compound_hdr_res {
Al Viro5704fde2006-10-19 23:28:51 -070059 __be32 *status;
Trond Myklebust2e42c3e2007-05-14 17:20:41 -040060 unsigned int taglen;
Linus Torvalds1da177e2005-04-16 15:20:36 -070061 const char *tag;
Al Viro5704fde2006-10-19 23:28:51 -070062 __be32 *nops;
Linus Torvalds1da177e2005-04-16 15:20:36 -070063};
64
65struct cb_getattrargs {
Linus Torvalds1da177e2005-04-16 15:20:36 -070066 struct nfs_fh fh;
67 uint32_t bitmap[2];
68};
69
70struct cb_getattrres {
Al Viroe6f684f2006-10-19 23:28:50 -070071 __be32 status;
Linus Torvalds1da177e2005-04-16 15:20:36 -070072 uint32_t bitmap[2];
73 uint64_t size;
74 uint64_t change_attr;
Trond Myklebust7d34ff52019-10-04 16:46:53 -040075 struct timespec64 ctime;
76 struct timespec64 mtime;
Linus Torvalds1da177e2005-04-16 15:20:36 -070077};
78
79struct cb_recallargs {
Linus Torvalds1da177e2005-04-16 15:20:36 -070080 struct nfs_fh fh;
81 nfs4_stateid stateid;
82 uint32_t truncate;
83};
84
Benny Halevy2d9b9ec2009-04-01 09:23:24 -040085#if defined(CONFIG_NFS_V4_1)
86
87struct referring_call {
88 uint32_t rc_sequenceid;
89 uint32_t rc_slotid;
90};
91
92struct referring_call_list {
93 struct nfs4_sessionid rcl_sessionid;
94 uint32_t rcl_nrefcalls;
95 struct referring_call *rcl_refcalls;
96};
97
98struct cb_sequenceargs {
Ricardo Labiaga65fc64e2009-04-01 09:23:30 -040099 struct sockaddr *csa_addr;
Benny Halevy2d9b9ec2009-04-01 09:23:24 -0400100 struct nfs4_sessionid csa_sessionid;
101 uint32_t csa_sequenceid;
102 uint32_t csa_slotid;
103 uint32_t csa_highestslotid;
104 uint32_t csa_cachethis;
105 uint32_t csa_nrclists;
106 struct referring_call_list *csa_rclists;
107};
108
109struct cb_sequenceres {
Ricardo Labiaga65fc64e2009-04-01 09:23:30 -0400110 __be32 csr_status;
Benny Halevy2d9b9ec2009-04-01 09:23:24 -0400111 struct nfs4_sessionid csr_sessionid;
112 uint32_t csr_sequenceid;
113 uint32_t csr_slotid;
114 uint32_t csr_highestslotid;
115 uint32_t csr_target_highestslotid;
116};
117
Christoph Hellwigf4dac4a2017-05-11 09:22:18 +0200118extern __be32 nfs4_callback_sequence(void *argp, void *resp,
Andy Adamsonc36fca52011-01-06 02:04:32 +0000119 struct cb_process_state *cps);
Benny Halevyd49433e2009-04-01 09:23:25 -0400120
Alexandros Batsakis31f09602009-12-05 13:27:02 -0500121#define RCA4_TYPE_MASK_RDATA_DLG 0
122#define RCA4_TYPE_MASK_WDATA_DLG 1
Alexandros Batsakis36840372011-01-06 11:36:31 +0000123#define RCA4_TYPE_MASK_DIR_DLG 2
124#define RCA4_TYPE_MASK_FILE_LAYOUT 3
125#define RCA4_TYPE_MASK_BLK_LAYOUT 4
126#define RCA4_TYPE_MASK_OBJ_LAYOUT_MIN 8
127#define RCA4_TYPE_MASK_OBJ_LAYOUT_MAX 9
128#define RCA4_TYPE_MASK_OTHER_LAYOUT_MIN 12
129#define RCA4_TYPE_MASK_OTHER_LAYOUT_MAX 15
Trond Myklebustb5fdf842020-02-18 15:58:31 -0500130#define PNFS_FF_RCA4_TYPE_MASK_READ 16
131#define PNFS_FF_RCA4_TYPE_MASK_RW 17
132#define RCA4_TYPE_MASK_ALL 0x3f31f
Alexandros Batsakis31f09602009-12-05 13:27:02 -0500133
134struct cb_recallanyargs {
Alexandros Batsakis31f09602009-12-05 13:27:02 -0500135 uint32_t craa_objs_to_keep;
136 uint32_t craa_type_mask;
137};
138
Christoph Hellwigf4dac4a2017-05-11 09:22:18 +0200139extern __be32 nfs4_callback_recallany(void *argp, void *resp,
Andy Adamsonc36fca52011-01-06 02:04:32 +0000140 struct cb_process_state *cps);
Andy Adamsonb9efa1b2010-01-20 16:06:27 -0500141
142struct cb_recallslotargs {
Trond Myklebustd5fb4ce2012-11-20 20:24:02 -0500143 uint32_t crsa_target_highest_slotid;
Andy Adamsonb9efa1b2010-01-20 16:06:27 -0500144};
Christoph Hellwigf4dac4a2017-05-11 09:22:18 +0200145extern __be32 nfs4_callback_recallslot(void *argp, void *resp,
Andy Adamsonc36fca52011-01-06 02:04:32 +0000146 struct cb_process_state *cps);
Andy Adamsonb9efa1b2010-01-20 16:06:27 -0500147
Fred Isamanf2a62562011-01-06 11:36:29 +0000148struct cb_layoutrecallargs {
Fred Isamanf2a62562011-01-06 11:36:29 +0000149 uint32_t cbl_recall_type;
150 uint32_t cbl_layout_type;
151 uint32_t cbl_layoutchanged;
152 union {
153 struct {
154 struct nfs_fh cbl_fh;
155 struct pnfs_layout_range cbl_range;
156 nfs4_stateid cbl_stateid;
157 };
158 struct nfs_fsid cbl_fsid;
159 };
160};
161
Christoph Hellwigf4dac4a2017-05-11 09:22:18 +0200162extern __be32 nfs4_callback_layoutrecall(void *argp, void *resp,
163 struct cb_process_state *cps);
Fred Isamanf2a62562011-01-06 11:36:29 +0000164
Marc Eshel1be56832011-05-22 19:47:09 +0300165struct cb_devicenotifyitem {
166 uint32_t cbd_notify_type;
167 uint32_t cbd_layout_type;
168 struct nfs4_deviceid cbd_dev_id;
169 uint32_t cbd_immediate;
170};
171
172struct cb_devicenotifyargs {
Trond Myklebustb05bf5c2022-01-03 14:50:16 -0500173 uint32_t ndevs;
Marc Eshel1be56832011-05-22 19:47:09 +0300174 struct cb_devicenotifyitem *devs;
175};
176
Christoph Hellwigf4dac4a2017-05-11 09:22:18 +0200177extern __be32 nfs4_callback_devicenotify(void *argp, void *resp,
178 struct cb_process_state *cps);
Marc Eshel1be56832011-05-22 19:47:09 +0300179
Jeff Laytondb783682016-09-17 18:17:36 -0400180struct cb_notify_lock_args {
181 struct nfs_fh cbnl_fh;
182 struct nfs_lowner cbnl_owner;
183 bool cbnl_valid;
184};
185
Christoph Hellwigf4dac4a2017-05-11 09:22:18 +0200186extern __be32 nfs4_callback_notify_lock(void *argp, void *resp,
Jeff Laytondb783682016-09-17 18:17:36 -0400187 struct cb_process_state *cps);
Benny Halevy2d9b9ec2009-04-01 09:23:24 -0400188#endif /* CONFIG_NFS_V4_1 */
Olga Kornievskaia5178a122018-07-09 15:13:28 -0400189#ifdef CONFIG_NFS_V4_2
190struct cb_offloadargs {
191 struct nfs_fh coa_fh;
192 nfs4_stateid coa_stateid;
193 uint32_t error;
194 uint64_t wr_count;
195 struct nfs_writeverf wr_writeverf;
196};
197
198extern __be32 nfs4_callback_offload(void *args, void *dummy,
199 struct cb_process_state *cps);
200#endif /* CONFIG_NFS_V4_2 */
Andy Adamson778be232011-01-25 15:38:01 +0000201extern int check_gss_callback_principal(struct nfs_client *, struct svc_rqst *);
Christoph Hellwigf4dac4a2017-05-11 09:22:18 +0200202extern __be32 nfs4_callback_getattr(void *argp, void *resp,
Andy Adamsonc36fca52011-01-06 02:04:32 +0000203 struct cb_process_state *cps);
Christoph Hellwigf4dac4a2017-05-11 09:22:18 +0200204extern __be32 nfs4_callback_recall(void *argp, void *resp,
Andy Adamsonc36fca52011-01-06 02:04:32 +0000205 struct cb_process_state *cps);
Bryan Schumaker89d77c82012-07-30 16:05:25 -0400206#if IS_ENABLED(CONFIG_NFS_V4)
Benny Halevy71468512009-04-01 09:22:56 -0400207extern int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt);
Stanislav Kinsburskyc8ceb412012-08-20 18:00:06 +0400208extern void nfs_callback_down(int minorversion, struct net *net);
Andy Adamsone82dc222009-04-01 09:23:14 -0400209#endif /* CONFIG_NFS_V4 */
Ricardo Labiagaa43cde92009-04-01 09:23:08 -0400210/*
211 * nfs41: Callbacks are expected to not cause substantial latency,
212 * so we limit their concurrency to 1 by setting up the maximum number
213 * of slots for the backchannel.
214 */
215#define NFS41_BC_MIN_CALLBACKS 1
Benny Halevyd49433e2009-04-01 09:23:25 -0400216#define NFS41_BC_MAX_CALLBACKS 1
Ricardo Labiagaa43cde92009-04-01 09:23:08 -0400217
Trond Myklebust5405fc42016-08-29 20:03:52 -0400218#define NFS4_MIN_NR_CALLBACK_THREADS 1
Trond Myklebustbb6aeba2016-08-29 20:03:51 -0400219
Trond Myklebusta72b4422006-01-03 09:55:41 +0100220extern unsigned int nfs_callback_set_tcpport;
Trond Myklebust5405fc42016-08-29 20:03:52 -0400221extern unsigned short nfs_callback_nr_threads;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700222
223#endif /* __LINUX_FS_NFS_CALLBACK_H */