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