1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * linux/fs/nfs/callback.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2004 Trond Myklebust 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * NFSv4 callback definitions 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun #ifndef __LINUX_FS_NFS_CALLBACK_H 10*4882a593Smuzhiyun #define __LINUX_FS_NFS_CALLBACK_H 11*4882a593Smuzhiyun #include <linux/sunrpc/svc.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define NFS4_CALLBACK 0x40000000 14*4882a593Smuzhiyun #define NFS4_CALLBACK_XDRSIZE 2048 15*4882a593Smuzhiyun #define NFS4_CALLBACK_BUFSIZE (1024 + NFS4_CALLBACK_XDRSIZE) 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun enum nfs4_callback_procnum { 18*4882a593Smuzhiyun CB_NULL = 0, 19*4882a593Smuzhiyun CB_COMPOUND = 1, 20*4882a593Smuzhiyun }; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun enum nfs4_callback_opnum { 23*4882a593Smuzhiyun OP_CB_GETATTR = 3, 24*4882a593Smuzhiyun OP_CB_RECALL = 4, 25*4882a593Smuzhiyun /* Callback operations new to NFSv4.1 */ 26*4882a593Smuzhiyun OP_CB_LAYOUTRECALL = 5, 27*4882a593Smuzhiyun OP_CB_NOTIFY = 6, 28*4882a593Smuzhiyun OP_CB_PUSH_DELEG = 7, 29*4882a593Smuzhiyun OP_CB_RECALL_ANY = 8, 30*4882a593Smuzhiyun OP_CB_RECALLABLE_OBJ_AVAIL = 9, 31*4882a593Smuzhiyun OP_CB_RECALL_SLOT = 10, 32*4882a593Smuzhiyun OP_CB_SEQUENCE = 11, 33*4882a593Smuzhiyun OP_CB_WANTS_CANCELLED = 12, 34*4882a593Smuzhiyun OP_CB_NOTIFY_LOCK = 13, 35*4882a593Smuzhiyun OP_CB_NOTIFY_DEVICEID = 14, 36*4882a593Smuzhiyun /* Callback operations new to NFSv4.2 */ 37*4882a593Smuzhiyun OP_CB_OFFLOAD = 15, 38*4882a593Smuzhiyun OP_CB_ILLEGAL = 10044, 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun struct nfs4_slot; 42*4882a593Smuzhiyun struct cb_process_state { 43*4882a593Smuzhiyun __be32 drc_status; 44*4882a593Smuzhiyun struct nfs_client *clp; 45*4882a593Smuzhiyun struct nfs4_slot *slot; 46*4882a593Smuzhiyun u32 minorversion; 47*4882a593Smuzhiyun struct net *net; 48*4882a593Smuzhiyun }; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun struct cb_compound_hdr_arg { 51*4882a593Smuzhiyun unsigned int taglen; 52*4882a593Smuzhiyun const char *tag; 53*4882a593Smuzhiyun unsigned int minorversion; 54*4882a593Smuzhiyun unsigned int cb_ident; /* v4.0 callback identifier */ 55*4882a593Smuzhiyun unsigned nops; 56*4882a593Smuzhiyun }; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct cb_compound_hdr_res { 59*4882a593Smuzhiyun __be32 *status; 60*4882a593Smuzhiyun unsigned int taglen; 61*4882a593Smuzhiyun const char *tag; 62*4882a593Smuzhiyun __be32 *nops; 63*4882a593Smuzhiyun }; 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun struct cb_getattrargs { 66*4882a593Smuzhiyun struct nfs_fh fh; 67*4882a593Smuzhiyun uint32_t bitmap[2]; 68*4882a593Smuzhiyun }; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun struct cb_getattrres { 71*4882a593Smuzhiyun __be32 status; 72*4882a593Smuzhiyun uint32_t bitmap[2]; 73*4882a593Smuzhiyun uint64_t size; 74*4882a593Smuzhiyun uint64_t change_attr; 75*4882a593Smuzhiyun struct timespec64 ctime; 76*4882a593Smuzhiyun struct timespec64 mtime; 77*4882a593Smuzhiyun }; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun struct cb_recallargs { 80*4882a593Smuzhiyun struct nfs_fh fh; 81*4882a593Smuzhiyun nfs4_stateid stateid; 82*4882a593Smuzhiyun uint32_t truncate; 83*4882a593Smuzhiyun }; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #if defined(CONFIG_NFS_V4_1) 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun struct referring_call { 88*4882a593Smuzhiyun uint32_t rc_sequenceid; 89*4882a593Smuzhiyun uint32_t rc_slotid; 90*4882a593Smuzhiyun }; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun struct referring_call_list { 93*4882a593Smuzhiyun struct nfs4_sessionid rcl_sessionid; 94*4882a593Smuzhiyun uint32_t rcl_nrefcalls; 95*4882a593Smuzhiyun struct referring_call *rcl_refcalls; 96*4882a593Smuzhiyun }; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun struct cb_sequenceargs { 99*4882a593Smuzhiyun struct sockaddr *csa_addr; 100*4882a593Smuzhiyun struct nfs4_sessionid csa_sessionid; 101*4882a593Smuzhiyun uint32_t csa_sequenceid; 102*4882a593Smuzhiyun uint32_t csa_slotid; 103*4882a593Smuzhiyun uint32_t csa_highestslotid; 104*4882a593Smuzhiyun uint32_t csa_cachethis; 105*4882a593Smuzhiyun uint32_t csa_nrclists; 106*4882a593Smuzhiyun struct referring_call_list *csa_rclists; 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun struct cb_sequenceres { 110*4882a593Smuzhiyun __be32 csr_status; 111*4882a593Smuzhiyun struct nfs4_sessionid csr_sessionid; 112*4882a593Smuzhiyun uint32_t csr_sequenceid; 113*4882a593Smuzhiyun uint32_t csr_slotid; 114*4882a593Smuzhiyun uint32_t csr_highestslotid; 115*4882a593Smuzhiyun uint32_t csr_target_highestslotid; 116*4882a593Smuzhiyun }; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun extern __be32 nfs4_callback_sequence(void *argp, void *resp, 119*4882a593Smuzhiyun struct cb_process_state *cps); 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun #define RCA4_TYPE_MASK_RDATA_DLG 0 122*4882a593Smuzhiyun #define RCA4_TYPE_MASK_WDATA_DLG 1 123*4882a593Smuzhiyun #define RCA4_TYPE_MASK_DIR_DLG 2 124*4882a593Smuzhiyun #define RCA4_TYPE_MASK_FILE_LAYOUT 3 125*4882a593Smuzhiyun #define RCA4_TYPE_MASK_BLK_LAYOUT 4 126*4882a593Smuzhiyun #define RCA4_TYPE_MASK_OBJ_LAYOUT_MIN 8 127*4882a593Smuzhiyun #define RCA4_TYPE_MASK_OBJ_LAYOUT_MAX 9 128*4882a593Smuzhiyun #define RCA4_TYPE_MASK_OTHER_LAYOUT_MIN 12 129*4882a593Smuzhiyun #define RCA4_TYPE_MASK_OTHER_LAYOUT_MAX 15 130*4882a593Smuzhiyun #define PNFS_FF_RCA4_TYPE_MASK_READ 16 131*4882a593Smuzhiyun #define PNFS_FF_RCA4_TYPE_MASK_RW 17 132*4882a593Smuzhiyun #define RCA4_TYPE_MASK_ALL 0x3f31f 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun struct cb_recallanyargs { 135*4882a593Smuzhiyun uint32_t craa_objs_to_keep; 136*4882a593Smuzhiyun uint32_t craa_type_mask; 137*4882a593Smuzhiyun }; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun extern __be32 nfs4_callback_recallany(void *argp, void *resp, 140*4882a593Smuzhiyun struct cb_process_state *cps); 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun struct cb_recallslotargs { 143*4882a593Smuzhiyun uint32_t crsa_target_highest_slotid; 144*4882a593Smuzhiyun }; 145*4882a593Smuzhiyun extern __be32 nfs4_callback_recallslot(void *argp, void *resp, 146*4882a593Smuzhiyun struct cb_process_state *cps); 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun struct cb_layoutrecallargs { 149*4882a593Smuzhiyun uint32_t cbl_recall_type; 150*4882a593Smuzhiyun uint32_t cbl_layout_type; 151*4882a593Smuzhiyun uint32_t cbl_layoutchanged; 152*4882a593Smuzhiyun union { 153*4882a593Smuzhiyun struct { 154*4882a593Smuzhiyun struct nfs_fh cbl_fh; 155*4882a593Smuzhiyun struct pnfs_layout_range cbl_range; 156*4882a593Smuzhiyun nfs4_stateid cbl_stateid; 157*4882a593Smuzhiyun }; 158*4882a593Smuzhiyun struct nfs_fsid cbl_fsid; 159*4882a593Smuzhiyun }; 160*4882a593Smuzhiyun }; 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun extern __be32 nfs4_callback_layoutrecall(void *argp, void *resp, 163*4882a593Smuzhiyun struct cb_process_state *cps); 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun struct cb_devicenotifyitem { 166*4882a593Smuzhiyun uint32_t cbd_notify_type; 167*4882a593Smuzhiyun uint32_t cbd_layout_type; 168*4882a593Smuzhiyun struct nfs4_deviceid cbd_dev_id; 169*4882a593Smuzhiyun uint32_t cbd_immediate; 170*4882a593Smuzhiyun }; 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun struct cb_devicenotifyargs { 173*4882a593Smuzhiyun uint32_t ndevs; 174*4882a593Smuzhiyun struct cb_devicenotifyitem *devs; 175*4882a593Smuzhiyun }; 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun extern __be32 nfs4_callback_devicenotify(void *argp, void *resp, 178*4882a593Smuzhiyun struct cb_process_state *cps); 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun struct cb_notify_lock_args { 181*4882a593Smuzhiyun struct nfs_fh cbnl_fh; 182*4882a593Smuzhiyun struct nfs_lowner cbnl_owner; 183*4882a593Smuzhiyun bool cbnl_valid; 184*4882a593Smuzhiyun }; 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun extern __be32 nfs4_callback_notify_lock(void *argp, void *resp, 187*4882a593Smuzhiyun struct cb_process_state *cps); 188*4882a593Smuzhiyun #endif /* CONFIG_NFS_V4_1 */ 189*4882a593Smuzhiyun #ifdef CONFIG_NFS_V4_2 190*4882a593Smuzhiyun struct cb_offloadargs { 191*4882a593Smuzhiyun struct nfs_fh coa_fh; 192*4882a593Smuzhiyun nfs4_stateid coa_stateid; 193*4882a593Smuzhiyun uint32_t error; 194*4882a593Smuzhiyun uint64_t wr_count; 195*4882a593Smuzhiyun struct nfs_writeverf wr_writeverf; 196*4882a593Smuzhiyun }; 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun extern __be32 nfs4_callback_offload(void *args, void *dummy, 199*4882a593Smuzhiyun struct cb_process_state *cps); 200*4882a593Smuzhiyun #endif /* CONFIG_NFS_V4_2 */ 201*4882a593Smuzhiyun extern int check_gss_callback_principal(struct nfs_client *, struct svc_rqst *); 202*4882a593Smuzhiyun extern __be32 nfs4_callback_getattr(void *argp, void *resp, 203*4882a593Smuzhiyun struct cb_process_state *cps); 204*4882a593Smuzhiyun extern __be32 nfs4_callback_recall(void *argp, void *resp, 205*4882a593Smuzhiyun struct cb_process_state *cps); 206*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_NFS_V4) 207*4882a593Smuzhiyun extern int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt); 208*4882a593Smuzhiyun extern void nfs_callback_down(int minorversion, struct net *net); 209*4882a593Smuzhiyun #endif /* CONFIG_NFS_V4 */ 210*4882a593Smuzhiyun /* 211*4882a593Smuzhiyun * nfs41: Callbacks are expected to not cause substantial latency, 212*4882a593Smuzhiyun * so we limit their concurrency to 1 by setting up the maximum number 213*4882a593Smuzhiyun * of slots for the backchannel. 214*4882a593Smuzhiyun */ 215*4882a593Smuzhiyun #define NFS41_BC_MIN_CALLBACKS 1 216*4882a593Smuzhiyun #define NFS41_BC_MAX_CALLBACKS 1 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun #define NFS4_MIN_NR_CALLBACK_THREADS 1 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun extern unsigned int nfs_callback_set_tcpport; 221*4882a593Smuzhiyun extern unsigned short nfs_callback_nr_threads; 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun #endif /* __LINUX_FS_NFS_CALLBACK_H */ 224