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