11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * linux/fs/nfs/callback.h 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Copyright (C) 2004 Trond Myklebust 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * NFSv4 callback definitions 71da177e4SLinus Torvalds */ 81da177e4SLinus Torvalds #ifndef __LINUX_FS_NFS_CALLBACK_H 91da177e4SLinus Torvalds #define __LINUX_FS_NFS_CALLBACK_H 101da177e4SLinus Torvalds 111da177e4SLinus Torvalds #define NFS4_CALLBACK 0x40000000 121da177e4SLinus Torvalds #define NFS4_CALLBACK_XDRSIZE 2048 131da177e4SLinus Torvalds #define NFS4_CALLBACK_BUFSIZE (1024 + NFS4_CALLBACK_XDRSIZE) 141da177e4SLinus Torvalds 151da177e4SLinus Torvalds enum nfs4_callback_procnum { 161da177e4SLinus Torvalds CB_NULL = 0, 171da177e4SLinus Torvalds CB_COMPOUND = 1, 181da177e4SLinus Torvalds }; 191da177e4SLinus Torvalds 201da177e4SLinus Torvalds enum nfs4_callback_opnum { 211da177e4SLinus Torvalds OP_CB_GETATTR = 3, 221da177e4SLinus Torvalds OP_CB_RECALL = 4, 2345377b94SBenny Halevy /* Callback operations new to NFSv4.1 */ 2445377b94SBenny Halevy OP_CB_LAYOUTRECALL = 5, 2545377b94SBenny Halevy OP_CB_NOTIFY = 6, 2645377b94SBenny Halevy OP_CB_PUSH_DELEG = 7, 2745377b94SBenny Halevy OP_CB_RECALL_ANY = 8, 2845377b94SBenny Halevy OP_CB_RECALLABLE_OBJ_AVAIL = 9, 2945377b94SBenny Halevy OP_CB_RECALL_SLOT = 10, 3045377b94SBenny Halevy OP_CB_SEQUENCE = 11, 3145377b94SBenny Halevy OP_CB_WANTS_CANCELLED = 12, 3245377b94SBenny Halevy OP_CB_NOTIFY_LOCK = 13, 3334bc47c9SBenny Halevy OP_CB_NOTIFY_DEVICEID = 14, 341da177e4SLinus Torvalds OP_CB_ILLEGAL = 10044, 351da177e4SLinus Torvalds }; 361da177e4SLinus Torvalds 37c36fca52SAndy Adamson struct cb_process_state { 38c36fca52SAndy Adamson __be32 drc_status; 39c36fca52SAndy Adamson struct nfs_client *clp; 40c36fca52SAndy Adamson struct nfs4_sessionid *svc_sid; /* v4.1 callback service sessionid */ 41c36fca52SAndy Adamson }; 42c36fca52SAndy Adamson 431da177e4SLinus Torvalds struct cb_compound_hdr_arg { 442e42c3e2STrond Myklebust unsigned int taglen; 451da177e4SLinus Torvalds const char *tag; 46b8f2ef84SBenny Halevy unsigned int minorversion; 47c36fca52SAndy Adamson unsigned int cb_ident; /* v4.0 callback identifier */ 481da177e4SLinus Torvalds unsigned nops; 491da177e4SLinus Torvalds }; 501da177e4SLinus Torvalds 511da177e4SLinus Torvalds struct cb_compound_hdr_res { 525704fdebSAl Viro __be32 *status; 532e42c3e2STrond Myklebust unsigned int taglen; 541da177e4SLinus Torvalds const char *tag; 555704fdebSAl Viro __be32 *nops; 561da177e4SLinus Torvalds }; 571da177e4SLinus Torvalds 581da177e4SLinus Torvalds struct cb_getattrargs { 59671beed7SChuck Lever struct sockaddr *addr; 601da177e4SLinus Torvalds struct nfs_fh fh; 611da177e4SLinus Torvalds uint32_t bitmap[2]; 621da177e4SLinus Torvalds }; 631da177e4SLinus Torvalds 641da177e4SLinus Torvalds struct cb_getattrres { 65e6f684f6SAl Viro __be32 status; 661da177e4SLinus Torvalds uint32_t bitmap[2]; 671da177e4SLinus Torvalds uint64_t size; 681da177e4SLinus Torvalds uint64_t change_attr; 691da177e4SLinus Torvalds struct timespec ctime; 701da177e4SLinus Torvalds struct timespec mtime; 711da177e4SLinus Torvalds }; 721da177e4SLinus Torvalds 731da177e4SLinus Torvalds struct cb_recallargs { 74c1d35866SChuck Lever struct sockaddr *addr; 751da177e4SLinus Torvalds struct nfs_fh fh; 761da177e4SLinus Torvalds nfs4_stateid stateid; 771da177e4SLinus Torvalds uint32_t truncate; 781da177e4SLinus Torvalds }; 791da177e4SLinus Torvalds 802d9b9ec3SBenny Halevy #if defined(CONFIG_NFS_V4_1) 812d9b9ec3SBenny Halevy 822d9b9ec3SBenny Halevy struct referring_call { 832d9b9ec3SBenny Halevy uint32_t rc_sequenceid; 842d9b9ec3SBenny Halevy uint32_t rc_slotid; 852d9b9ec3SBenny Halevy }; 862d9b9ec3SBenny Halevy 872d9b9ec3SBenny Halevy struct referring_call_list { 882d9b9ec3SBenny Halevy struct nfs4_sessionid rcl_sessionid; 892d9b9ec3SBenny Halevy uint32_t rcl_nrefcalls; 902d9b9ec3SBenny Halevy struct referring_call *rcl_refcalls; 912d9b9ec3SBenny Halevy }; 922d9b9ec3SBenny Halevy 932d9b9ec3SBenny Halevy struct cb_sequenceargs { 9465fc64e5SRicardo Labiaga struct sockaddr *csa_addr; 952d9b9ec3SBenny Halevy struct nfs4_sessionid csa_sessionid; 962d9b9ec3SBenny Halevy uint32_t csa_sequenceid; 972d9b9ec3SBenny Halevy uint32_t csa_slotid; 982d9b9ec3SBenny Halevy uint32_t csa_highestslotid; 992d9b9ec3SBenny Halevy uint32_t csa_cachethis; 1002d9b9ec3SBenny Halevy uint32_t csa_nrclists; 1012d9b9ec3SBenny Halevy struct referring_call_list *csa_rclists; 1022d9b9ec3SBenny Halevy }; 1032d9b9ec3SBenny Halevy 1042d9b9ec3SBenny Halevy struct cb_sequenceres { 10565fc64e5SRicardo Labiaga __be32 csr_status; 1062d9b9ec3SBenny Halevy struct nfs4_sessionid csr_sessionid; 1072d9b9ec3SBenny Halevy uint32_t csr_sequenceid; 1082d9b9ec3SBenny Halevy uint32_t csr_slotid; 1092d9b9ec3SBenny Halevy uint32_t csr_highestslotid; 1102d9b9ec3SBenny Halevy uint32_t csr_target_highestslotid; 1112d9b9ec3SBenny Halevy }; 1122d9b9ec3SBenny Halevy 113c36fca52SAndy Adamson extern __be32 nfs4_callback_sequence(struct cb_sequenceargs *args, 114c36fca52SAndy Adamson struct cb_sequenceres *res, 115c36fca52SAndy Adamson struct cb_process_state *cps); 116d49433e1SBenny Halevy 1172597641dSAlexandros Batsakis extern int nfs41_validate_delegation_stateid(struct nfs_delegation *delegation, 1182597641dSAlexandros Batsakis const nfs4_stateid *stateid); 11931f09607SAlexandros Batsakis 12031f09607SAlexandros Batsakis #define RCA4_TYPE_MASK_RDATA_DLG 0 12131f09607SAlexandros Batsakis #define RCA4_TYPE_MASK_WDATA_DLG 1 12231f09607SAlexandros Batsakis 12331f09607SAlexandros Batsakis struct cb_recallanyargs { 12431f09607SAlexandros Batsakis struct sockaddr *craa_addr; 12531f09607SAlexandros Batsakis uint32_t craa_objs_to_keep; 12631f09607SAlexandros Batsakis uint32_t craa_type_mask; 12731f09607SAlexandros Batsakis }; 12831f09607SAlexandros Batsakis 129c36fca52SAndy Adamson extern __be32 nfs4_callback_recallany(struct cb_recallanyargs *args, 130c36fca52SAndy Adamson void *dummy, 131c36fca52SAndy Adamson struct cb_process_state *cps); 132b9efa1b2SAndy Adamson 133b9efa1b2SAndy Adamson struct cb_recallslotargs { 134b9efa1b2SAndy Adamson struct sockaddr *crsa_addr; 135b9efa1b2SAndy Adamson uint32_t crsa_target_max_slots; 136b9efa1b2SAndy Adamson }; 137c36fca52SAndy Adamson extern __be32 nfs4_callback_recallslot(struct cb_recallslotargs *args, 138c36fca52SAndy Adamson void *dummy, 139c36fca52SAndy Adamson struct cb_process_state *cps); 140b9efa1b2SAndy Adamson 141*f2a62561SFred Isaman struct cb_layoutrecallargs { 142*f2a62561SFred Isaman struct sockaddr *cbl_addr; 143*f2a62561SFred Isaman uint32_t cbl_recall_type; 144*f2a62561SFred Isaman uint32_t cbl_layout_type; 145*f2a62561SFred Isaman uint32_t cbl_layoutchanged; 146*f2a62561SFred Isaman union { 147*f2a62561SFred Isaman struct { 148*f2a62561SFred Isaman struct nfs_fh cbl_fh; 149*f2a62561SFred Isaman struct pnfs_layout_range cbl_range; 150*f2a62561SFred Isaman nfs4_stateid cbl_stateid; 151*f2a62561SFred Isaman }; 152*f2a62561SFred Isaman struct nfs_fsid cbl_fsid; 153*f2a62561SFred Isaman }; 154*f2a62561SFred Isaman }; 155*f2a62561SFred Isaman 156*f2a62561SFred Isaman extern unsigned nfs4_callback_layoutrecall( 157*f2a62561SFred Isaman struct cb_layoutrecallargs *args, 158*f2a62561SFred Isaman void *dummy, struct cb_process_state *cps); 159*f2a62561SFred Isaman 16042acd021SAndy Adamson extern void nfs4_check_drain_bc_complete(struct nfs4_session *ses); 16142acd021SAndy Adamson extern void nfs4_cb_take_slot(struct nfs_client *clp); 1622d9b9ec3SBenny Halevy #endif /* CONFIG_NFS_V4_1 */ 1632d9b9ec3SBenny Halevy 164c36fca52SAndy Adamson extern __be32 nfs4_callback_getattr(struct cb_getattrargs *args, 165c36fca52SAndy Adamson struct cb_getattrres *res, 166c36fca52SAndy Adamson struct cb_process_state *cps); 167c36fca52SAndy Adamson extern __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy, 168c36fca52SAndy Adamson struct cb_process_state *cps); 1695ae1fbceSDavid Howells #ifdef CONFIG_NFS_V4 17071468513SBenny Halevy extern int nfs_callback_up(u32 minorversion, struct rpc_xprt *xprt); 171e82dc22dSAndy Adamson extern void nfs_callback_down(int minorversion); 1722597641dSAlexandros Batsakis extern int nfs4_validate_delegation_stateid(struct nfs_delegation *delegation, 1732597641dSAlexandros Batsakis const nfs4_stateid *stateid); 1742c2618c6SAndy Adamson extern int nfs4_set_callback_sessionid(struct nfs_client *clp); 175e82dc22dSAndy Adamson #endif /* CONFIG_NFS_V4 */ 176a43cde94SRicardo Labiaga /* 177a43cde94SRicardo Labiaga * nfs41: Callbacks are expected to not cause substantial latency, 178a43cde94SRicardo Labiaga * so we limit their concurrency to 1 by setting up the maximum number 179a43cde94SRicardo Labiaga * of slots for the backchannel. 180a43cde94SRicardo Labiaga */ 181a43cde94SRicardo Labiaga #define NFS41_BC_MIN_CALLBACKS 1 182d49433e1SBenny Halevy #define NFS41_BC_MAX_CALLBACKS 1 183a43cde94SRicardo Labiaga 184a72b4422STrond Myklebust extern unsigned int nfs_callback_set_tcpport; 1851da177e4SLinus Torvalds extern unsigned short nfs_callback_tcpport; 186f738f517SChuck Lever extern unsigned short nfs_callback_tcpport6; 1871da177e4SLinus Torvalds 1881da177e4SLinus Torvalds #endif /* __LINUX_FS_NFS_CALLBACK_H */ 189