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