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 cb_process_state {
  41        __be32                  drc_status;
  42        struct nfs_client       *clp;
  43        u32                     slotid;
  44        u32                     minorversion;
  45        struct net              *net;
  46};
  47
  48struct cb_compound_hdr_arg {
  49        unsigned int taglen;
  50        const char *tag;
  51        unsigned int minorversion;
  52        unsigned int cb_ident; /* v4.0 callback identifier */
  53        unsigned nops;
  54};
  55
  56struct cb_compound_hdr_res {
  57        __be32 *status;
  58        unsigned int taglen;
  59        const char *tag;
  60        __be32 *nops;
  61};
  62
  63struct cb_getattrargs {
  64        struct sockaddr *addr;
  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 sockaddr *addr;
  80        struct nfs_fh fh;
  81        nfs4_stateid stateid;
  82        uint32_t truncate;
  83};
  84
  85#if defined(CONFIG_NFS_V4_1)
  86
  87struct referring_call {
  88        uint32_t                        rc_sequenceid;
  89        uint32_t                        rc_slotid;
  90};
  91
  92struct referring_call_list {
  93        struct nfs4_sessionid           rcl_sessionid;
  94        uint32_t                        rcl_nrefcalls;
  95        struct referring_call           *rcl_refcalls;
  96};
  97
  98struct cb_sequenceargs {
  99        struct sockaddr                 *csa_addr;
 100        struct nfs4_sessionid           csa_sessionid;
 101        uint32_t                        csa_sequenceid;
 102        uint32_t                        csa_slotid;
 103        uint32_t                        csa_highestslotid;
 104        uint32_t                        csa_cachethis;
 105        uint32_t                        csa_nrclists;
 106        struct referring_call_list      *csa_rclists;
 107};
 108
 109struct cb_sequenceres {
 110        __be32                          csr_status;
 111        struct nfs4_sessionid           csr_sessionid;
 112        uint32_t                        csr_sequenceid;
 113        uint32_t                        csr_slotid;
 114        uint32_t                        csr_highestslotid;
 115        uint32_t                        csr_target_highestslotid;
 116};
 117
 118extern __be32 nfs4_callback_sequence(struct cb_sequenceargs *args,
 119                                       struct cb_sequenceres *res,
 120                                       struct cb_process_state *cps);
 121
 122extern int nfs41_validate_delegation_stateid(struct nfs_delegation *delegation,
 123                                             const nfs4_stateid *stateid);
 124
 125#define RCA4_TYPE_MASK_RDATA_DLG        0
 126#define RCA4_TYPE_MASK_WDATA_DLG        1
 127#define RCA4_TYPE_MASK_DIR_DLG         2
 128#define RCA4_TYPE_MASK_FILE_LAYOUT     3
 129#define RCA4_TYPE_MASK_BLK_LAYOUT      4
 130#define RCA4_TYPE_MASK_OBJ_LAYOUT_MIN  8
 131#define RCA4_TYPE_MASK_OBJ_LAYOUT_MAX  9
 132#define RCA4_TYPE_MASK_OTHER_LAYOUT_MIN 12
 133#define RCA4_TYPE_MASK_OTHER_LAYOUT_MAX 15
 134#define RCA4_TYPE_MASK_ALL 0xf31f
 135
 136struct cb_recallanyargs {
 137        struct sockaddr *craa_addr;
 138        uint32_t        craa_objs_to_keep;
 139        uint32_t        craa_type_mask;
 140};
 141
 142extern __be32 nfs4_callback_recallany(struct cb_recallanyargs *args,
 143                                        void *dummy,
 144                                        struct cb_process_state *cps);
 145
 146struct cb_recallslotargs {
 147        struct sockaddr *crsa_addr;
 148        uint32_t        crsa_target_highest_slotid;
 149};
 150extern __be32 nfs4_callback_recallslot(struct cb_recallslotargs *args,
 151                                         void *dummy,
 152                                         struct cb_process_state *cps);
 153
 154struct cb_layoutrecallargs {
 155        struct sockaddr         *cbl_addr;
 156        uint32_t                cbl_recall_type;
 157        uint32_t                cbl_layout_type;
 158        uint32_t                cbl_layoutchanged;
 159        union {
 160                struct {
 161                        struct nfs_fh           cbl_fh;
 162                        struct pnfs_layout_range cbl_range;
 163                        nfs4_stateid            cbl_stateid;
 164                };
 165                struct nfs_fsid         cbl_fsid;
 166        };
 167};
 168
 169extern __be32 nfs4_callback_layoutrecall(
 170        struct cb_layoutrecallargs *args,
 171        void *dummy, struct cb_process_state *cps);
 172
 173struct cb_devicenotifyitem {
 174        uint32_t                cbd_notify_type;
 175        uint32_t                cbd_layout_type;
 176        struct nfs4_deviceid    cbd_dev_id;
 177        uint32_t                cbd_immediate;
 178};
 179
 180struct cb_devicenotifyargs {
 181        int                              ndevs;
 182        struct cb_devicenotifyitem       *devs;
 183};
 184
 185extern __be32 nfs4_callback_devicenotify(
 186        struct cb_devicenotifyargs *args,
 187        void *dummy, struct cb_process_state *cps);
 188
 189#endif /* CONFIG_NFS_V4_1 */
 190extern int check_gss_callback_principal(struct nfs_client *, struct svc_rqst *);
 191extern __be32 nfs4_callback_getattr(struct cb_getattrargs *args,
 192                                    struct cb_getattrres *res,
 193                                    struct cb_process_state *cps);
 194extern __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy,
 195                                   struct cb_process_state *cps);
 196#if IS_ENABLED(CONFIG_NFS_V4)
 197extern int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt);
 198extern void nfs_callback_down(int minorversion, struct net *net);
 199extern int nfs4_validate_delegation_stateid(struct nfs_delegation *delegation,
 200                                            const nfs4_stateid *stateid);
 201extern int nfs4_set_callback_sessionid(struct nfs_client *clp);
 202#endif /* CONFIG_NFS_V4 */
 203/*
 204 * nfs41: Callbacks are expected to not cause substantial latency,
 205 * so we limit their concurrency to 1 by setting up the maximum number
 206 * of slots for the backchannel.
 207 */
 208#define NFS41_BC_MIN_CALLBACKS 1
 209#define NFS41_BC_MAX_CALLBACKS 1
 210
 211extern unsigned int nfs_callback_set_tcpport;
 212extern unsigned short nfs_callback_tcpport;
 213
 214#endif /* __LINUX_FS_NFS_CALLBACK_H */
 215