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