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