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 */ 206