/* 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_NFS_OPS_H__ #define __NFS41_NFS_OPS_H__ #include "nfs41.h" #include "pnfs.h" /* Operation arrays */ enum nfs_opnum4 { OP_ACCESS = 3, OP_CLOSE = 4, OP_COMMIT = 5, OP_CREATE = 6, OP_DELEGPURGE = 7, OP_DELEGRETURN = 8, OP_GETATTR = 9, OP_GETFH = 10, OP_LINK = 11, OP_LOCK = 12, OP_LOCKT = 13, OP_LOCKU = 14, OP_LOOKUP = 15, OP_LOOKUPP = 16, OP_NVERIFY = 17, OP_OPEN = 18, OP_OPENATTR = 19, OP_OPEN_CONFIRM = 20, /* Mandatory not-to-implement */ OP_OPEN_DOWNGRADE = 21, OP_PUTFH = 22, OP_PUTPUBFH = 23, OP_PUTROOTFH = 24, OP_READ = 25, OP_READDIR = 26, OP_READLINK = 27, OP_REMOVE = 28, OP_RENAME = 29, OP_RENEW = 30, /* Mandatory not-to-implement */ OP_RESTOREFH = 31, OP_SAVEFH = 32, OP_SECINFO = 33, OP_SETATTR = 34, OP_SETCLIENTID = 35, /* Mandatory not-to-implement */ OP_SETCLIENTID_CONFIRM = 36, /* Mandatory not-to-implement */ OP_VERIFY = 37, OP_WRITE = 38, OP_RELEASE_LOCKOWNER = 39, /* Mandatory not-to-implement */ /* new operations for NFSv4.1 */ OP_BACKCHANNEL_CTL = 40, OP_BIND_CONN_TO_SESSION = 41, OP_EXCHANGE_ID = 42, OP_CREATE_SESSION = 43, OP_DESTROY_SESSION = 44, OP_FREE_STATEID = 45, OP_GET_DIR_DELEGATION = 46, OP_GETDEVICEINFO = 47, OP_GETDEVICELIST = 48, OP_LAYOUTCOMMIT = 49, OP_LAYOUTGET = 50, OP_LAYOUTRETURN = 51, OP_SECINFO_NO_NAME = 52, OP_SEQUENCE = 53, OP_SET_SSV = 54, OP_TEST_STATEID = 55, OP_WANT_DELEGATION = 56, OP_DESTROY_CLIENTID = 57, OP_RECLAIM_COMPLETE = 58, OP_ILLEGAL = 10044 }; /* OP_EXCHANGE_ID */ enum { EXCHGID4_FLAG_SUPP_MOVED_REFER = 0x00000001, EXCHGID4_FLAG_SUPP_MOVED_MIGR = 0x00000002, EXCHGID4_FLAG_BIND_PRINC_STATEID = 0x00000100, EXCHGID4_FLAG_USE_NON_PNFS = 0x00010000, EXCHGID4_FLAG_USE_PNFS_MDS = 0x00020000, EXCHGID4_FLAG_USE_PNFS_DS = 0x00040000, EXCHGID4_FLAG_MASK_PNFS = 0x00070000, EXCHGID4_FLAG_UPD_CONFIRMED_REC_A = 0x40000000, EXCHGID4_FLAG_CONFIRMED_R = 0x80000000 }; typedef enum { SP4_NONE = 0, SP4_MACH_CRED = 1, SP4_SSV = 2 } state_protect_how4; typedef struct __state_protect4_a { state_protect_how4 spa_how; } state_protect4_a; typedef struct __nfs41_exchange_id_args { client_owner4 *eia_clientowner; uint32_t eia_flags; state_protect4_a eia_state_protect; nfs_impl_id4 *eia_client_impl_id; /* <1> */ } nfs41_exchange_id_args; typedef struct __state_protect4_r { state_protect_how4 spr_how; } state_protect4_r; typedef struct __nfs41_exchange_id_res { uint32_t status; uint64_t clientid; uint32_t sequenceid; uint32_t flags; state_protect4_r state_protect; server_owner4 server_owner; uint32_t server_scope_len; char server_scope[NFS4_OPAQUE_LIMIT]; } nfs41_exchange_id_res; typedef struct __nfs41_callback_sec_parms { uint32_t type; union { /* case AUTH_SYS */ struct __authsys_parms { uint32_t stamp; char *machinename; } auth_sys; /* case RPCSEC_GSS */ struct __rpcsec_gss_parms { uint32_t gss_srv_type; char *srv_gssctx_handle; uint32_t srv_gssctx_hdle_len; char *clnt_gssctx_handle; uint32_t clnt_gssctx_hdle_len; } rpcsec_gss; } u; } nfs41_callback_secparms; /* OP_CREATE_SESSION */ typedef struct __nfs41_create_session_args { uint64_t csa_clientid; uint32_t csa_sequence; uint32_t csa_flags; nfs41_channel_attrs csa_fore_chan_attrs; nfs41_channel_attrs csa_back_chan_attrs; uint32_t csa_cb_program; nfs41_callback_secparms csa_cb_secparams[2]; } nfs41_create_session_args; typedef struct __nfs41_create_session_res { unsigned char *csr_sessionid; uint32_t csr_sequence; uint32_t csr_flags; nfs41_channel_attrs *csr_fore_chan_attrs; nfs41_channel_attrs *csr_back_chan_attrs; } nfs41_create_session_res; /* OP_BIND_CONN_TO_SESSION */ enum channel_dir_from_client4 { CDFC4_FORE = 0x1, CDFC4_BACK = 0x2, CDFC4_FORE_OR_BOTH = 0x3, CDFC4_BACK_OR_BOTH = 0x7 }; enum channel_dir_from_server4 { CDFS4_FORE = 0x1, CDFS4_BACK = 0x2, CDFS4_BOTH = 0x3 }; typedef struct __nfs41_bind_conn_to_session_args { unsigned char *sessionid; enum channel_dir_from_client4 dir; } nfs41_bind_conn_to_session_args; typedef struct __nfs41_bind_conn_to_session_res { enum nfsstat4 status; /* case NFS4_OK: */ enum channel_dir_from_server4 dir; } nfs41_bind_conn_to_session_res; /* OP_DESTROY_SESSION */ typedef struct __nfs41_destroy_session_args { unsigned char *dsa_sessionid; } nfs41_destroy_session_args; typedef struct __nfs41_destroy_session_res { uint32_t dsr_status; } nfs41_destroy_session_res; /* OP_DESTROY_CLIENTID */ typedef struct __nfs41_destroy_clientid_args { uint64_t dca_clientid; } nfs41_destroy_clientid_args; typedef struct __nfs41_destroy_clientid_res { uint32_t dcr_status; } nfs41_destroy_clientid_res; /* OP_SEQUENCE */ typedef struct __nfs41_sequence_args { unsigned char *sa_sessionid; uint32_t sa_sequenceid; uint32_t sa_slotid; uint32_t sa_highest_slotid; bool_t sa_cachethis; } nfs41_sequence_args; enum { SEQ4_STATUS_CB_PATH_DOWN = 0x00000001, SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRING = 0x00000002, SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRED = 0x00000004, SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED = 0x00000008, SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED = 0x00000010, SEQ4_STATUS_ADMIN_STATE_REVOKED = 0x00000020, SEQ4_STATUS_RECALLABLE_STATE_REVOKED = 0x00000040, SEQ4_STATUS_LEASE_MOVED = 0x00000080, SEQ4_STATUS_RESTART_RECLAIM_NEEDED = 0x00000100, SEQ4_STATUS_CB_PATH_DOWN_SESSION = 0x00000200, SEQ4_STATUS_BACKCHANNEL_FAULT = 0x00000400, SEQ4_STATUS_DEVID_CHANGED = 0x00000800, SEQ4_STATUS_DEVID_DELETED = 0x00001000 }; typedef struct __nfs41_sequence_res_ok { unsigned char sr_sessionid[NFS4_SESSIONID_SIZE]; uint32_t sr_sequenceid; uint32_t sr_slotid; uint32_t sr_highest_slotid; uint32_t sr_target_highest_slotid; uint32_t sr_status_flags; } nfs41_sequence_res_ok; typedef struct __nfs41_sequence_res { uint32_t sr_status; /* case NFS4_OK: */ nfs41_sequence_res_ok sr_resok4; } nfs41_sequence_res; /* OP_RECLAIM_COMPLETE */ typedef struct __nfs41_reclaim_complete_res { enum nfsstat4 status; } nfs41_reclaim_complete_res; /* recoverable stateid argument */ enum stateid_type { STATEID_OPEN, STATEID_LOCK, STATEID_DELEG_FILE, STATEID_DELEG_DIR, STATEID_LAYOUT, STATEID_SPECIAL }; typedef struct __stateid_arg { stateid4 stateid; enum stateid_type type; nfs41_open_state *open; nfs41_delegation_state *delegation; } stateid_arg; /* OP_ACCESS */ enum { ACCESS4_READ = 0x00000001, ACCESS4_LOOKUP = 0x00000002, ACCESS4_MODIFY = 0x00000004, ACCESS4_EXTEND = 0x00000008, ACCESS4_DELETE = 0x00000010, ACCESS4_EXECUTE = 0x00000020 }; typedef struct __nfs41_access_args { uint32_t access; } nfs41_access_args; typedef struct __nfs41_access_res { uint32_t status; /* case NFS4_OK: */ uint32_t supported; uint32_t access; } nfs41_access_res; /* OP_CLOSE */ typedef struct __nfs41_op_close_args { // uint32_t seqid; // not used, always 0 stateid_arg *stateid; } nfs41_op_close_args; typedef struct __nfs41_op_close_res { uint32_t status; } nfs41_op_close_res; /* OP_COMMIT */ typedef struct __nfs41_commit_args { uint64_t offset; uint32_t count; } nfs41_commit_args; typedef struct __nfs41_commit_res { uint32_t status; nfs41_write_verf *verf; } nfs41_commit_res; /* OP_CREATE */ typedef struct __specdata4 { uint32_t specdata1; uint32_t specdata2; } specdata4; typedef struct __createtype4 { uint32_t type; union { /* case NF4LNK: */ struct __create_type_lnk { uint32_t linkdata_len; const char *linkdata; } lnk; /* case NF4BLK, NF4CHR: */ specdata4 devdata; } u; } createtype4; typedef struct __nfs41_create_args { createtype4 objtype; const nfs41_component *name; nfs41_file_info *createattrs; } nfs41_create_args; typedef struct __nfs41_create_res { uint32_t status; /* case NFS4_OK: */ change_info4 cinfo; bitmap4 attrset; } nfs41_create_res; /* OP_DELEGPURGE */ typedef struct __nfs41_delegpurge_res { uint32_t status; } nfs41_delegpurge_res; /* OP_DELEGRETURN */ typedef struct __nfs41_delegreturn_args { stateid_arg *stateid; } nfs41_delegreturn_args; typedef struct __nfs41_delegreturn_res { uint32_t status; } nfs41_delegreturn_res; /* OP_LINK */ typedef struct __nfs41_link_args { const nfs41_component *newname; } nfs41_link_args; typedef struct __nfs41_link_res { uint32_t status; /* case NFS4_OK */ change_info4 cinfo; } nfs41_link_res; /* OP_LOCK */ enum { READ_LT = 1, WRITE_LT = 2, READW_LT = 3, /* blocking read */ WRITEW_LT = 4 /* blocking write */ }; typedef struct __open_to_lock_owner4 { uint32_t open_seqid; stateid_arg *open_stateid; uint32_t lock_seqid; state_owner4 *lock_owner; } open_to_lock_owner4; typedef struct __exist_lock_owner4 { stateid_arg *lock_stateid; uint32_t lock_seqid; } exist_lock_owner4; typedef struct __locker4 { bool_t new_lock_owner; union { /* case TRUE: */ open_to_lock_owner4 open_owner; /* case FALSE: */ exist_lock_owner4 lock_owner; } u; } locker4; typedef struct __nfs41_lock_args { uint32_t locktype; bool_t reclaim; uint64_t offset; uint64_t length; locker4 locker; } nfs41_lock_args; typedef struct __lock_res_denied { uint64_t offset; uint64_t length; uint32_t locktype; state_owner4 owner; } lock_res_denied; typedef struct __lock_res_ok { stateid4 *lock_stateid; } lock_res_ok; typedef struct __nfs41_lock_res { uint32_t status; union { /* case NFS4_OK: */ lock_res_ok resok4; /* case NFS4ERR_DENIED: */ lock_res_denied denied; /* default: void; */ } u; } nfs41_lock_res; /* OP_LOCKT */ typedef struct __nfs41_lockt_args { uint32_t locktype; uint64_t offset; uint64_t length; state_owner4 *owner; } nfs41_lockt_args; typedef struct __nfs41_lockt_res { uint32_t status; /* case NFS4ERR_DENIED: */ lock_res_denied denied; /* default: void; */ } nfs41_lockt_res; /* OP_LOCKU */ typedef struct __nfs41_locku_args { uint32_t locktype; uint32_t seqid; stateid_arg *lock_stateid; uint64_t offset; uint64_t length; } nfs41_locku_args; typedef struct __nfs41_locku_res { uint32_t status; /* case NFS4_OK: */ stateid4 *lock_stateid; } nfs41_locku_res; /* OP_LOOKUP */ typedef struct __nfs41_lookup_args { const nfs41_component *name; } nfs41_lookup_args; typedef struct __nfs41_lookup_res { uint32_t status; } nfs41_lookup_res; /* OP_GETFH */ typedef struct __nfs41_getfh_res { uint32_t status; /* case NFS4_OK: */ nfs41_fh *fh; } nfs41_getfh_res; /* OP_PUTFH */ typedef struct __nfs41_putfh_args { nfs41_path_fh *file; bool_t in_recovery; } nfs41_putfh_args; typedef struct __nfs41_putfh_res { uint32_t status; } nfs41_putfh_res; /* OP_PUTROOTFH */ typedef struct __nfs41_putrootfh_res { uint32_t status; } nfs41_putrootfh_res; /* OP_GETATTR */ typedef struct __nfs41_getattr_args { bitmap4 *attr_request; } nfs41_getattr_args; typedef struct __nfs41_getattr_res { uint32_t status; /* case NFS4_OK: */ fattr4 obj_attributes; nfs41_file_info *info; } nfs41_getattr_res; /* OP_OPEN */ enum createmode4 { UNCHECKED4 = 0, GUARDED4 = 1, EXCLUSIVE4 = 2, EXCLUSIVE4_1 = 3 }; typedef struct __createhow4 { uint32_t mode; nfs41_file_info *createattrs; unsigned char createverf[NFS4_VERIFIER_SIZE]; } createhow4; enum opentype4 { OPEN4_NOCREATE = 0, OPEN4_CREATE = 1 }; typedef struct __openflag4 { uint32_t opentype; /* case OPEN4_CREATE: */ createhow4 how; } openflag4; enum { OPEN4_SHARE_ACCESS_READ = 0x00000001, OPEN4_SHARE_ACCESS_WRITE = 0x00000002, OPEN4_SHARE_ACCESS_BOTH = 0x00000003, OPEN4_SHARE_DENY_NONE = 0x00000000, OPEN4_SHARE_DENY_READ = 0x00000001, OPEN4_SHARE_DENY_WRITE = 0x00000002, OPEN4_SHARE_DENY_BOTH = 0x00000003, OPEN4_SHARE_ACCESS_WANT_DELEG_MASK = 0xFF00, OPEN4_SHARE_ACCESS_WANT_NO_PREFERENCE = 0x0000, OPEN4_SHARE_ACCESS_WANT_READ_DELEG = 0x0100, OPEN4_SHARE_ACCESS_WANT_WRITE_DELEG = 0x0200, OPEN4_SHARE_ACCESS_WANT_ANY_DELEG = 0x0300, OPEN4_SHARE_ACCESS_WANT_NO_DELEG = 0x0400, OPEN4_SHARE_ACCESS_WANT_CANCEL = 0x0500, OPEN4_SHARE_ACCESS_WANT_SIGNAL_DELEG_WHEN_RESRC_AVAIL = 0x10000, OPEN4_SHARE_ACCESS_WANT_PUSH_DELEG_WHEN_UNCONTENDED = 0x20000 }; enum open_delegation_type4 { OPEN_DELEGATE_NONE = 0, OPEN_DELEGATE_READ = 1, OPEN_DELEGATE_WRITE = 2, OPEN_DELEGATE_NONE_EXT = 3 }; enum open_claim_type4 { CLAIM_NULL = 0, CLAIM_PREVIOUS = 1, CLAIM_DELEGATE_CUR = 2, CLAIM_DELEGATE_PREV = 3, CLAIM_FH = 4, CLAIM_DELEG_CUR_FH = 5, CLAIM_DELEG_PREV_FH = 6 }; enum why_no_delegation4 { WND4_NOT_WANTED = 0, WND4_CONTENTION = 1, WND4_RESOURCE = 2, WND4_NOT_SUPP_FTYPE = 3, WND4_WRITE_DELEG_NOT_SUPP_FTYPE = 4, WND4_NOT_SUPP_UPGRADE = 5, WND4_NOT_SUPP_DOWNGRADE = 6, WND4_CANCELED = 7, WND4_IS_DIR = 8 }; typedef struct __open_claim4 { uint32_t claim; union { /* case CLAIM_NULL: */ struct __open_claim_null { const nfs41_component *filename; } null; /* case CLAIM_PREVIOUS: */ struct __open_claim_prev { uint32_t delegate_type; } prev; /* case CLAIM_DELEGATE_CUR: */ struct __open_claim_deleg_cur { stateid_arg *delegate_stateid; nfs41_component *name; } deleg_cur; /* case CLAIM_DELEG_CUR_FH: */ struct __open_claim_deleg_cur_fh { stateid_arg *delegate_stateid; } deleg_cur_fh; /* case CLAIM_DELEGATE_PREV: */ struct __open_claim_deleg_prev { const nfs41_component *filename; } deleg_prev; } u; } open_claim4; typedef struct __nfs41_op_open_args { uint32_t seqid; uint32_t share_access; uint32_t share_deny; state_owner4 *owner; openflag4 openhow; open_claim4 *claim; } nfs41_op_open_args; enum { OPEN4_RESULT_CONFIRM = 0x00000002, OPEN4_RESULT_LOCKTYPE_POSIX = 0x00000004, OPEN4_RESULT_PRESERVE_UNLINKED = 0x00000008, OPEN4_RESULT_MAY_NOTIFY_LOCK = 0x00000020 }; typedef struct __nfs41_op_open_res_ok { stateid4 *stateid; change_info4 cinfo; uint32_t rflags; bitmap4 attrset; open_delegation4 *delegation; } nfs41_op_open_res_ok; typedef struct __nfs41_op_open_res { uint32_t status; /* case NFS4_OK: */ nfs41_op_open_res_ok resok4; } nfs41_op_open_res; /* OP_OPENATTR */ typedef struct __nfs41_openattr_args { bool_t createdir; } nfs41_openattr_args; typedef struct __nfs41_openattr_res { uint32_t status; } nfs41_openattr_res; /* OP_READ */ typedef struct __nfs41_read_args { stateid_arg *stateid; /* -> nfs41_op_open_res_ok.stateid */ uint64_t offset; uint32_t count; } nfs41_read_args; typedef struct __nfs41_read_res_ok { bool_t eof; uint32_t data_len; unsigned char *data; /* caller-allocated */ } nfs41_read_res_ok; typedef struct __nfs41_read_res { uint32_t status; /* case NFS4_OK: */ nfs41_read_res_ok resok4; } nfs41_read_res; /* OP_READDIR */ typedef struct __nfs41_readdir_args { nfs41_readdir_cookie cookie; uint32_t dircount; uint32_t maxcount; bitmap4 *attr_request; } nfs41_readdir_args; typedef struct __nfs41_readdir_entry { uint64_t cookie; uint32_t name_len; uint32_t next_entry_offset; nfs41_file_info attr_info; char name[1]; } nfs41_readdir_entry; typedef struct __nfs41_readdir_list { bool_t has_entries; uint32_t entries_len; unsigned char *entries; bool_t eof; } nfs41_readdir_list; typedef struct __nfs41_readdir_res { uint32_t status; /* case NFS4_OK: */ unsigned char cookieverf[NFS4_VERIFIER_SIZE]; nfs41_readdir_list reply; } nfs41_readdir_res; /* OP_READLINK */ typedef struct __nfs41_readlink_res { uint32_t status; /* case NFS4_OK: */ uint32_t link_len; char *link; } nfs41_readlink_res; /* OP_REMOVE */ typedef struct __nfs41_remove_args { const nfs41_component *target; } nfs41_remove_args; typedef struct __nfs41_remove_res { uint32_t status; /* case NFS4_OK: */ change_info4 cinfo; } nfs41_remove_res; /* OP_RENAME */ typedef struct __nfs41_rename_args { const nfs41_component *oldname; const nfs41_component *newname; } nfs41_rename_args; typedef struct __nfs41_rename_res { uint32_t status; /* case NFS4_OK: */ change_info4 source_cinfo; change_info4 target_cinfo; } nfs41_rename_res; /* OP_RESTOREFH */ /* OP_SAVEFH */ typedef struct __nfs41_restorefh_savefh_res { uint32_t status; } nfs41_restorefh_res, nfs41_savefh_res; /* OP_SETATTR */ enum time_how4 { SET_TO_SERVER_TIME4 = 0, SET_TO_CLIENT_TIME4 = 1 }; typedef struct __nfs41_setattr_args { stateid_arg *stateid; nfs41_file_info *info; } nfs41_setattr_args; typedef struct __nfs41_setattr_res { uint32_t status; bitmap4 attrsset; } nfs41_setattr_res; /* OP_WANT_DELEGATION */ typedef struct __deleg_claim4 { uint32_t claim; /* case CLAIM_PREVIOUS: */ uint32_t prev_delegate_type; } deleg_claim4; typedef struct __nfs41_want_delegation_args { uint32_t want; deleg_claim4 *claim; } nfs41_want_delegation_args; typedef struct __nfs41_want_delegation_res { uint32_t status; /* case NFS4_OK: */ open_delegation4 *delegation; } nfs41_want_delegation_res; /* OP_FREE_STATEID */ typedef struct __nfs41_free_stateid_args { stateid4 *stateid; } nfs41_free_stateid_args; typedef struct __nfs41_free_stateid_res { uint32_t status; } nfs41_free_stateid_res; /* OP_TEST_STATEID */ typedef struct __nfs41_test_stateid_args { uint32_t count; stateid_arg *stateids; // caller-allocated array } nfs41_test_stateid_args; typedef struct __nfs41_test_stateid_res { uint32_t status; struct { uint32_t count; uint32_t *status; // caller-allocated array } resok; } nfs41_test_stateid_res; /* OP_WRITE */ enum stable_how4 { UNSTABLE4 = 0, DATA_SYNC4 = 1, FILE_SYNC4 = 2 }; typedef struct __nfs41_write_args { stateid_arg *stateid; /* -> nfs41_op_open_res_ok.stateid */ uint64_t offset; uint32_t stable; /* stable_how4 */ uint32_t data_len; unsigned char *data; /* caller-allocated */ } nfs41_write_args; typedef struct __nfs41_write_res_ok { uint32_t count; nfs41_write_verf *verf; } nfs41_write_res_ok; typedef struct __nfs41_write_res { uint32_t status; /* case NFS4_OK: */ nfs41_write_res_ok resok4; } nfs41_write_res; /* OP_SECINFO */ enum sec_flavor { RPC_GSS_SVC_NONE = 1, RPC_GSS_SVC_INTEGRITY = 2, RPC_GSS_SVC_PRIVACY = 3, }; #define RPCSEC_GSS 6 #define MAX_OID_LEN 128 typedef struct __nfs41_secinfo_info { char oid[MAX_OID_LEN]; uint32_t oid_len; uint32_t sec_flavor; uint32_t qop; enum sec_flavor type; } nfs41_secinfo_info; typedef struct __nfs41_secinfo_args { const nfs41_component *name; } nfs41_secinfo_args; #define MAX_SECINFOS 6 /* OP_SECINFO_NO_NAME */ enum secinfo_no_name_type { SECINFO_STYLE4_CURRENT_FH = 0, SECINFO_STYLE4_PARENT = 1 }; typedef struct __nfs41_secinfo_noname_args { #ifdef __REACTOS__ uint32_t type; #else enum secinfo_noname_type type; #endif } nfs41_secinfo_noname_args; typedef struct __nfs41_secinfo_noname_res { uint32_t status; /* case NFS4_OK: */ nfs41_secinfo_info *secinfo; uint32_t count; } nfs41_secinfo_noname_res; /* LAYOUTGET */ typedef struct __pnfs_layoutget_args { bool_t signal_layout_avail; enum pnfs_layout_type layout_type; enum pnfs_iomode iomode; uint64_t offset; uint64_t length; uint64_t minlength; stateid_arg *stateid; uint32_t maxcount; } pnfs_layoutget_args; typedef struct __pnfs_layoutget_res_ok { bool_t return_on_close; stateid4 stateid; uint32_t count; struct list_entry layouts; /* list of pnfs_layouts */ } pnfs_layoutget_res_ok; typedef struct __pnfs_layoutget_res { enum nfsstat4 status; union { /* case NFS4_OK: */ pnfs_layoutget_res_ok *res_ok; /* case NFS4ERR_LAYOUTTRYLATER: */ bool_t will_signal_layout_avail; /* default: void; */ } u; } pnfs_layoutget_res; /* LAYOUTCOMMIT */ typedef struct __pnfs_layoutcommit_args { uint64_t offset; uint64_t length; stateid4 *stateid; nfstime4 *new_time; uint64_t *new_offset; } pnfs_layoutcommit_args; typedef struct __pnfs_layoutcommit_res { uint32_t status; /* case NFS4_OK */ bool_t has_new_size; /* case TRUE */ uint64_t new_size; } pnfs_layoutcommit_res; /* LAYOUTRETURN */ typedef struct __pnfs_layoutreturn_args { bool_t reclaim; enum pnfs_layout_type type; enum pnfs_iomode iomode; enum pnfs_return_type return_type; /* case LAYOUTRETURN4_FILE: */ uint64_t offset; uint64_t length; stateid4 *stateid; } pnfs_layoutreturn_args; typedef struct __pnfs_layoutreturn_res { enum nfsstat4 status; /* case NFS4_OK: */ bool_t stateid_present; /* case true: */ stateid4 stateid; } pnfs_layoutreturn_res; /* GETDEVICEINFO */ typedef struct __pnfs_getdeviceinfo_args { unsigned char *deviceid; enum pnfs_layout_type layout_type; uint32_t maxcount; bitmap4 notify_types; } pnfs_getdeviceinfo_args; typedef struct __pnfs_getdeviceinfo_res_ok { pnfs_file_device *device; bitmap4 notification; } pnfs_getdeviceinfo_res_ok; typedef struct __pnfs_getdeviceinfo_res { enum nfsstat4 status; union { /* case NFS4_OK: */ pnfs_getdeviceinfo_res_ok res_ok; /* case NFS4ERR_TOOSMALL: */ uint32_t mincount; /* default: void; */ } u; } pnfs_getdeviceinfo_res; /* nfs41_ops.c */ int nfs41_exchange_id( IN nfs41_rpc_clnt *rpc, IN client_owner4 *owner, IN uint32_t flags_in, OUT nfs41_exchange_id_res *res_out); int nfs41_create_session( IN nfs41_client *clnt, OUT nfs41_session *session, IN bool_t try_recovery); enum nfsstat4 nfs41_bind_conn_to_session( IN nfs41_rpc_clnt *rpc, IN const unsigned char *sessionid, IN enum channel_dir_from_client4 dir); int nfs41_destroy_session( IN nfs41_session *session); int nfs41_destroy_clientid( IN nfs41_rpc_clnt *rpc, IN uint64_t clientid); int nfs41_send_sequence( IN nfs41_session *session); enum nfsstat4 nfs41_reclaim_complete( IN nfs41_session *session); int nfs41_lookup( IN nfs41_root *root, IN nfs41_session *session, IN OUT nfs41_abs_path *path, OUT OPTIONAL nfs41_path_fh *parent_out, OUT OPTIONAL nfs41_path_fh *target_out, OUT OPTIONAL nfs41_file_info *info_out, OUT nfs41_session **session_out); int nfs41_open( IN nfs41_session *session, IN nfs41_path_fh *parent, IN nfs41_path_fh *file, IN state_owner4 *owner, IN open_claim4 *claim, IN uint32_t allow, IN uint32_t deny, IN uint32_t create, IN uint32_t how_mode, IN OPTIONAL nfs41_file_info *createattrs, IN bool_t try_recovery, OUT stateid4 *stateid, OUT open_delegation4 *delegation, OUT OPTIONAL nfs41_file_info *info); int nfs41_create( IN nfs41_session *session, IN uint32_t type, IN nfs41_file_info *createattrs, IN OPTIONAL const char *symlink, IN nfs41_path_fh *parent, OUT nfs41_path_fh *file, OUT nfs41_file_info *info); int nfs41_close( IN nfs41_session *session, IN nfs41_path_fh *file, IN stateid_arg *stateid); int nfs41_write( IN nfs41_session *session, IN nfs41_path_fh *file, IN stateid_arg *stateid, IN unsigned char *data, IN uint32_t data_len, IN uint64_t offset, IN enum stable_how4 stable, OUT uint32_t *bytes_written, OUT nfs41_write_verf *verf, OUT nfs41_file_info *cinfo); int nfs41_read( IN nfs41_session *session, IN nfs41_path_fh *file, IN stateid_arg *stateid, IN uint64_t offset, IN uint32_t count, OUT unsigned char *data_out, OUT uint32_t *data_len_out, OUT bool_t *eof_out); int nfs41_commit( IN nfs41_session *session, IN nfs41_path_fh *file, IN uint64_t offset, IN uint32_t count, IN bool_t do_getattr, OUT nfs41_write_verf *verf, OUT nfs41_file_info *cinfo); int nfs41_lock( IN nfs41_session *session, IN nfs41_path_fh *file, IN state_owner4 *owner, IN uint32_t type, IN uint64_t offset, IN uint64_t length, IN bool_t reclaim, IN bool_t try_recovery, IN OUT stateid_arg *stateid); int nfs41_unlock( IN nfs41_session *session, IN nfs41_path_fh *file, IN uint64_t offset, IN uint64_t length, IN OUT stateid_arg *stateid); stateid4* nfs41_lock_stateid_copy( IN nfs41_lock_state *lock_state, IN OUT stateid4 *dest); int nfs41_readdir( IN nfs41_session *session, IN nfs41_path_fh *file, IN bitmap4 *attr_request, IN nfs41_readdir_cookie *cookie, OUT unsigned char *entries, IN OUT uint32_t *entries_len, OUT bool_t *eof_out); int nfs41_getattr( IN nfs41_session *session, IN OPTIONAL nfs41_path_fh *file, IN bitmap4 *attr_request, OUT nfs41_file_info *info); int nfs41_superblock_getattr( IN nfs41_session *session, IN nfs41_path_fh *file, IN bitmap4 *attr_request, OUT nfs41_file_info *info, OUT bool_t *supports_named_attrs); /* getattr.c */ int nfs41_cached_getattr( IN nfs41_session *session, IN nfs41_path_fh *file, OUT nfs41_file_info *info); int nfs41_remove( IN nfs41_session *session, IN nfs41_path_fh *parent, IN const nfs41_component *target, IN uint64_t fileid); int nfs41_rename( IN nfs41_session *session, IN nfs41_path_fh *src_dir, IN const nfs41_component *src_name, IN nfs41_path_fh *dst_dir, IN const nfs41_component *dst_name); int nfs41_setattr( IN nfs41_session *session, IN nfs41_path_fh *file, IN stateid_arg *stateid, IN nfs41_file_info *info); int nfs41_link( IN nfs41_session *session, IN nfs41_path_fh *src, IN nfs41_path_fh *dst_dir, IN const nfs41_component *target, OUT nfs41_file_info *cinfo); /* symlink.c */ int nfs41_symlink_target( IN nfs41_session *session, IN nfs41_path_fh *file, OUT nfs41_abs_path *target); int nfs41_symlink_follow( IN nfs41_root *root, IN nfs41_session *session, IN nfs41_path_fh *symlink, OUT nfs41_file_info *info); int nfs41_readlink( IN nfs41_session *session, IN nfs41_path_fh *file, IN uint32_t max_len, OUT char *link_out, OUT uint32_t *len_out); int nfs41_access( IN nfs41_session *session, IN nfs41_path_fh *file, IN uint32_t requested, OUT uint32_t *supported OPTIONAL, OUT uint32_t *access OPTIONAL); enum nfsstat4 nfs41_want_delegation( IN nfs41_session *session, IN nfs41_path_fh *file, IN deleg_claim4 *claim, IN uint32_t want, IN bool_t try_recovery, OUT open_delegation4 *delegation); int nfs41_delegpurge( IN nfs41_session *session); int nfs41_delegreturn( IN nfs41_session *session, IN nfs41_path_fh *file, IN stateid_arg *stateid, IN bool_t try_recovery); enum nfsstat4 nfs41_fs_locations( IN nfs41_session *session, IN nfs41_path_fh *parent, IN const nfs41_component *name, OUT fs_locations4 *locations); int nfs41_secinfo( IN nfs41_session *session, IN nfs41_path_fh *file, IN const nfs41_component *name, OUT nfs41_secinfo_info *secinfo); int nfs41_secinfo_noname( IN nfs41_session *session, IN nfs41_path_fh *file, OUT nfs41_secinfo_info *secinfo); enum nfsstat4 nfs41_free_stateid( IN nfs41_session *session, IN stateid4 *stateid); enum nfsstat4 nfs41_test_stateid( IN nfs41_session *session, IN stateid_arg *stateid_array, IN uint32_t count, OUT uint32_t *status_array); enum nfsstat4 pnfs_rpc_layoutget( IN nfs41_session *session, IN nfs41_path_fh *file, IN stateid_arg *stateid, IN enum pnfs_iomode iomode, IN uint64_t offset, IN uint64_t minlength, IN uint64_t length, OUT pnfs_layoutget_res_ok *layoutget_res); enum nfsstat4 pnfs_rpc_layoutcommit( IN nfs41_session *session, IN nfs41_path_fh *file, IN stateid4 *stateid, IN uint64_t offset, IN uint64_t length, IN OPTIONAL uint64_t *new_last_offset, IN OPTIONAL nfstime4 *new_time_modify, OUT nfs41_file_info *info); enum nfsstat4 pnfs_rpc_layoutreturn( IN nfs41_session *session, IN nfs41_path_fh *file, IN enum pnfs_layout_type type, IN enum pnfs_iomode iomode, IN uint64_t offset, IN uint64_t length, IN stateid4 *stateid, OUT pnfs_layoutreturn_res *layoutreturn_res); enum nfsstat4 pnfs_rpc_getdeviceinfo( IN nfs41_session *session, IN unsigned char *deviceid, OUT pnfs_file_device *device); enum nfsstat4 nfs41_rpc_openattr( IN nfs41_session *session, IN nfs41_path_fh *file, IN bool_t createdir, OUT nfs41_fh *fh_out); #endif /* !__NFS41_NFS_OPS_H__ */