at master 5.1 kB view raw
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[3]; 50}; 51 52struct 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 62struct 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 70struct referring_call { 71 uint32_t rc_sequenceid; 72 uint32_t rc_slotid; 73}; 74 75struct referring_call_list { 76 struct nfs4_sessionid rcl_sessionid; 77 uint32_t rcl_nrefcalls; 78 struct referring_call *rcl_refcalls; 79}; 80 81struct 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 92struct 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 101extern __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 117struct cb_recallanyargs { 118 uint32_t craa_objs_to_keep; 119 uint32_t craa_type_mask; 120}; 121 122extern __be32 nfs4_callback_recallany(void *argp, void *resp, 123 struct cb_process_state *cps); 124 125struct cb_recallslotargs { 126 uint32_t crsa_target_highest_slotid; 127}; 128extern __be32 nfs4_callback_recallslot(void *argp, void *resp, 129 struct cb_process_state *cps); 130 131struct 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 145extern __be32 nfs4_callback_layoutrecall(void *argp, void *resp, 146 struct cb_process_state *cps); 147 148struct 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 155struct cb_devicenotifyargs { 156 uint32_t ndevs; 157 struct cb_devicenotifyitem *devs; 158}; 159 160extern __be32 nfs4_callback_devicenotify(void *argp, void *resp, 161 struct cb_process_state *cps); 162 163struct cb_notify_lock_args { 164 struct nfs_fh cbnl_fh; 165 struct nfs_lowner cbnl_owner; 166 bool cbnl_valid; 167}; 168 169extern __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 173struct 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 181extern __be32 nfs4_callback_offload(void *args, void *dummy, 182 struct cb_process_state *cps); 183#endif /* CONFIG_NFS_V4_2 */ 184extern int check_gss_callback_principal(struct nfs_client *, struct svc_rqst *); 185extern __be32 nfs4_callback_getattr(void *argp, void *resp, 186 struct cb_process_state *cps); 187extern __be32 nfs4_callback_recall(void *argp, void *resp, 188 struct cb_process_state *cps); 189#if IS_ENABLED(CONFIG_NFS_V4) 190extern int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt); 191extern void nfs_callback_down(int minorversion, struct net *net, 192 struct rpc_xprt *xprt); 193#endif /* CONFIG_NFS_V4 */ 194/* 195 * nfs41: Callbacks are expected to not cause substantial latency, 196 * so we limit their concurrency to 1 by setting up the maximum number 197 * of slots for the backchannel. 198 */ 199#define NFS41_BC_MIN_CALLBACKS 1 200#define NFS41_BC_MAX_CALLBACKS 1 201 202#define NFS4_MIN_NR_CALLBACK_THREADS 1 203 204extern unsigned int nfs_callback_set_tcpport; 205extern unsigned short nfs_callback_nr_threads; 206 207#endif /* __LINUX_FS_NFS_CALLBACK_H */