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(struct cb_sequenceargs *args,
 118                                       struct cb_sequenceres *res,
 119                                       struct cb_process_state *cps);
 120
 121#define RCA4_TYPE_MASK_RDATA_DLG        0
 122#define RCA4_TYPE_MASK_WDATA_DLG        1
 123#define RCA4_TYPE_MASK_DIR_DLG         2
 124#define RCA4_TYPE_MASK_FILE_LAYOUT     3
 125#define RCA4_TYPE_MASK_BLK_LAYOUT      4
 126#define RCA4_TYPE_MASK_OBJ_LAYOUT_MIN  8
 127#define RCA4_TYPE_MASK_OBJ_LAYOUT_MAX  9
 128#define RCA4_TYPE_MASK_OTHER_LAYOUT_MIN 12
 129#define RCA4_TYPE_MASK_OTHER_LAYOUT_MAX 15
 130#define RCA4_TYPE_MASK_ALL 0xf31f
 131
 132struct cb_recallanyargs {
 133        uint32_t        craa_objs_to_keep;
 134        uint32_t        craa_type_mask;
 135};
 136
 137extern __be32 nfs4_callback_recallany(struct cb_recallanyargs *args,
 138                                        void *dummy,
 139                                        struct cb_process_state *cps);
 140
 141struct cb_recallslotargs {
 142        uint32_t        crsa_target_highest_slotid;
 143};
 144extern __be32 nfs4_callback_recallslot(struct cb_recallslotargs *args,
 145                                         void *dummy,
 146                                         struct cb_process_state *cps);
 147
 148struct cb_layoutrecallargs {
 149        uint32_t                cbl_recall_type;
 150        uint32_t                cbl_layout_type;
 151        uint32_t                cbl_layoutchanged;
 152        union {
 153                struct {
 154                        struct nfs_fh           cbl_fh;
 155                        struct pnfs_layout_range cbl_range;
 156                        nfs4_stateid            cbl_stateid;
 157                };
 158                struct nfs_fsid         cbl_fsid;
 159        };
 160};
 161
 162extern __be32 nfs4_callback_layoutrecall(
 163        struct cb_layoutrecallargs *args,
 164        void *dummy, struct cb_process_state *cps);
 165
 166struct cb_devicenotifyitem {
 167        uint32_t                cbd_notify_type;
 168        uint32_t                cbd_layout_type;
 169        struct nfs4_deviceid    cbd_dev_id;
 170        uint32_t                cbd_immediate;
 171};
 172
 173struct cb_devicenotifyargs {
 174        int                              ndevs;
 175        struct cb_devicenotifyitem       *devs;
 176};
 177
 178extern __be32 nfs4_callback_devicenotify(
 179        struct cb_devicenotifyargs *args,
 180        void *dummy, struct cb_process_state *cps);
 181
 182#endif /* CONFIG_NFS_V4_1 */
 183extern int check_gss_callback_principal(struct nfs_client *, struct svc_rqst *);
 184extern __be32 nfs4_callback_getattr(struct cb_getattrargs *args,
 185                                    struct cb_getattrres *res,
 186                                    struct cb_process_state *cps);
 187extern __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy,
 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#endif /* CONFIG_NFS_V4 */
 193/*
 194 * nfs41: Callbacks are expected to not cause substantial latency,
 195 * so we limit their concurrency to 1 by setting up the maximum number
 196 * of slots for the backchannel.
 197 */
 198#define NFS41_BC_MIN_CALLBACKS 1
 199#define NFS41_BC_MAX_CALLBACKS 1
 200
 201extern unsigned int nfs_callback_set_tcpport;
 202
 203#endif /* __LINUX_FS_NFS_CALLBACK_H */
 204