/* NFSv4.1 client for Windows * Copyright © 2012 The Regents of the University of Michigan * * Olga Kornievskaia * Casey Bodley * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2.1 of the License, or (at * your option) any later version. * * This library is distributed in the hope that it will be useful, but * without any warranty; without even the implied warranty of merchantability * or fitness for a particular purpose. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA */ #ifndef __NFS41_CALLBACK_H__ #define __NFS41_CALLBACK_H__ #include "wintirpc.h" #include "rpc/rpc.h" #include "nfs41_types.h" enum nfs41_callback_proc { CB_NULL = 0, CB_COMPOUND = 1, }; enum nfs41_callback_op { OP_CB_GETATTR = 3, OP_CB_RECALL = 4, OP_CB_LAYOUTRECALL = 5, OP_CB_NOTIFY = 6, OP_CB_PUSH_DELEG = 7, OP_CB_RECALL_ANY = 8, OP_CB_RECALLABLE_OBJ_AVAIL = 9, OP_CB_RECALL_SLOT = 10, OP_CB_SEQUENCE = 11, OP_CB_WANTS_CANCELLED = 12, OP_CB_NOTIFY_LOCK = 13, OP_CB_NOTIFY_DEVICEID = 14, OP_CB_ILLEGAL = 10044 }; int nfs41_handle_callback(void *, void *, void *); /* OP_CB_LAYOUTRECALL */ struct cb_recall_file { nfs41_fh fh; uint64_t offset; uint64_t length; stateid4 stateid; }; union cb_recall_file_args { struct cb_recall_file file; nfs41_fsid fsid; }; struct cb_recall { #ifdef __REACTOS__ uint32_t type; #else enum pnfs_return_type type; #endif union cb_recall_file_args args; }; struct cb_layoutrecall_args { #ifdef __REACTOS__ uint32_t type; uint32_t iomode; #else enum pnfs_return_type type; enum pnfs_iomode iomode; #endif bool_t changed; struct cb_recall recall; }; struct cb_layoutrecall_res { enum_t status; }; /* OP_CB_RECALL_SLOT */ struct cb_recall_slot_args { uint32_t target_highest_slotid; }; struct cb_recall_slot_res { enum_t status; }; /* OP_CB_SEQUENCE */ struct cb_sequence_ref { uint32_t sequenceid; uint32_t slotid; }; struct cb_sequence_ref_list { char sessionid[NFS4_SESSIONID_SIZE]; struct cb_sequence_ref *calls; uint32_t call_count; }; struct cb_sequence_args { char sessionid[NFS4_SESSIONID_SIZE]; uint32_t sequenceid; uint32_t slotid; uint32_t highest_slotid; bool_t cachethis; struct cb_sequence_ref_list *ref_lists; uint32_t ref_list_count; }; struct cb_sequence_res_ok { char sessionid[NFS4_SESSIONID_SIZE]; uint32_t sequenceid; uint32_t slotid; uint32_t highest_slotid; uint32_t target_highest_slotid; }; struct cb_sequence_res { enum_t status; struct cb_sequence_res_ok ok; }; /* OP_CB_GETATTR */ struct cb_getattr_args { nfs41_fh fh; bitmap4 attr_request; }; struct cb_getattr_res { enum_t status; nfs41_file_info info; }; /* OP_CB_RECALL */ struct cb_recall_args { stateid4 stateid; bool_t truncate; nfs41_fh fh; }; struct cb_recall_res { enum_t status; }; /* OP_CB_NOTIFY */ struct cb_notify_args { uint32_t target_highest_slotid; }; struct cb_notify_res { enum_t status; }; /* OP_CB_PUSH_DELEG */ struct cb_push_deleg_args { uint32_t target_highest_slotid; }; struct cb_push_deleg_res { enum_t status; }; /* OP_CB_RECALL_ANY */ struct cb_recall_any_args { uint32_t target_highest_slotid; }; struct cb_recall_any_res { enum_t status; }; /* OP_CB_RECALLABLE_OBJ_AVAIL */ struct cb_recallable_obj_avail_args { uint32_t target_highest_slotid; }; struct cb_recallable_obj_avail_res { enum_t status; }; /* OP_CB_WANTS_CANCELLED */ struct cb_wants_cancelled_args { uint32_t target_highest_slotid; }; struct cb_wants_cancelled_res { enum_t status; }; /* OP_CB_NOTIFY_LOCK */ struct cb_notify_lock_args { uint32_t target_highest_slotid; }; struct cb_notify_lock_res { enum_t status; }; /* OP_CB_NOTIFY_DEVICEID */ enum notify_deviceid_type4 { NOTIFY_DEVICEID4_CHANGE = 1, NOTIFY_DEVICEID4_DELETE = 2 }; struct notify_deviceid4 { unsigned char deviceid[16]; enum notify_deviceid_type4 type; #ifdef __REACTOS__ uint32_t layouttype; #else enum pnfs_layout_type layouttype; #endif bool_t immediate; }; struct notify4 { bitmap4 mask; char *list; uint32_t len; }; struct cb_notify_deviceid_args { struct notify4 *notify_list; uint32_t notify_count; struct notify_deviceid4 *change_list; uint32_t change_count; }; struct cb_notify_deviceid_res { enum_t status; }; /* CB_COMPOUND */ #define CB_COMPOUND_MAX_TAG 64 #define CB_COMPOUND_MAX_OPERATIONS 16 union cb_op_args { struct cb_layoutrecall_args layoutrecall; struct cb_recall_slot_args recall_slot; struct cb_sequence_args sequence; struct cb_getattr_args getattr; struct cb_recall_args recall; struct cb_notify_deviceid_args notify_deviceid; }; struct cb_argop { enum_t opnum; union cb_op_args args; }; struct cb_compound_tag { char str[CB_COMPOUND_MAX_TAG]; uint32_t len; }; struct cb_compound_args { struct cb_compound_tag tag; uint32_t minorversion; uint32_t callback_ident; /* client MUST ignore */ struct cb_argop *argarray; uint32_t argarray_count; /* <= CB_COMPOUND_MAX_OPERATIONS */ }; union cb_op_res { enum_t status; /* all results start with status */ struct cb_layoutrecall_res layoutrecall; struct cb_recall_slot_res recall_slot; struct cb_sequence_res sequence; struct cb_getattr_res getattr; struct cb_recall_res recall; struct cb_notify_deviceid_res notify_deviceid; }; struct cb_resop { enum_t opnum; union cb_op_res res; bool_t xdr_ok; }; struct cb_compound_res { enum_t status; struct cb_compound_tag tag; struct cb_resop *resarray; uint32_t resarray_count; /* <= CB_COMPOUND_MAX_OPERATIONS */ }; /* callback_xdr.c */ bool_t proc_cb_compound_args(XDR *xdr, struct cb_compound_args *args); bool_t proc_cb_compound_res(XDR *xdr, struct cb_compound_res *res); /* callback_server.c */ struct __nfs41_session; void nfs41_callback_session_init( IN struct __nfs41_session *session); #endif /* !__NFS41_CALLBACK_H__ */