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 17enum nfs4_callback_procnum { 18 CB_NULL = 0, 19 CB_COMPOUND = 1, 20}; 21 22struct nfs4_slot; 23struct 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 32struct 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 40struct cb_compound_hdr_res { 41 __be32 *status; 42 unsigned int taglen; 43 const char *tag; 44 __be32 *nops; 45}; 46 47struct cb_getattrargs { 48 struct nfs_fh fh; 49 uint32_t bitmap[2]; 50}; 51 52struct 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 61struct 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 69struct referring_call { 70 uint32_t rc_sequenceid; 71 uint32_t rc_slotid; 72}; 73 74struct referring_call_list { 75 struct nfs4_sessionid rcl_sessionid; 76 uint32_t rcl_nrefcalls; 77 struct referring_call *rcl_refcalls; 78}; 79 80struct 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 91struct 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 100extern __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 116struct cb_recallanyargs { 117 uint32_t craa_objs_to_keep; 118 uint32_t craa_type_mask; 119}; 120 121extern __be32 nfs4_callback_recallany(void *argp, void *resp, 122 struct cb_process_state *cps); 123 124struct cb_recallslotargs { 125 uint32_t crsa_target_highest_slotid; 126}; 127extern __be32 nfs4_callback_recallslot(void *argp, void *resp, 128 struct cb_process_state *cps); 129 130struct 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 144extern __be32 nfs4_callback_layoutrecall(void *argp, void *resp, 145 struct cb_process_state *cps); 146 147struct 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 154struct cb_devicenotifyargs { 155 uint32_t ndevs; 156 struct cb_devicenotifyitem *devs; 157}; 158 159extern __be32 nfs4_callback_devicenotify(void *argp, void *resp, 160 struct cb_process_state *cps); 161 162struct cb_notify_lock_args { 163 struct nfs_fh cbnl_fh; 164 struct nfs_lowner cbnl_owner; 165 bool cbnl_valid; 166}; 167 168extern __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 172struct 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 180extern __be32 nfs4_callback_offload(void *args, void *dummy, 181 struct cb_process_state *cps); 182#endif /* CONFIG_NFS_V4_2 */ 183extern int check_gss_callback_principal(struct nfs_client *, struct svc_rqst *); 184extern __be32 nfs4_callback_getattr(void *argp, void *resp, 185 struct cb_process_state *cps); 186extern __be32 nfs4_callback_recall(void *argp, void *resp, 187 struct cb_process_state *cps); 188#if IS_ENABLED(CONFIG_NFS_V4) 189extern int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt); 190extern 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 202extern unsigned int nfs_callback_set_tcpport; 203extern unsigned short nfs_callback_nr_threads; 204 205#endif /* __LINUX_FS_NFS_CALLBACK_H */ 206