*** /tmp/geta111469 Thu Feb 3 15:31:51 2005 --- /tmp/getb111469 Thu Feb 3 15:31:51 2005 *************** *** 1,5 **** /* ! * Copyright (C) The Internet Society (1998,1999,2000,2001). * All Rights Reserved. */ --- 1,5 ---- /* ! * Copyright (C) The Internet Society (1998-2003). * All Rights Reserved. */ *************** *** 8,14 **** * */ ! %#pragma ident "%W% %D%" /* * Basic typedefs for RFC 1832 data type definitions --- 8,14 ---- * */ ! %#pragma ident "%W%" /* * Basic typedefs for RFC 1832 data type definitions *************** *** 21,40 **** /* * Sizes */ ! const NFS4_FHSIZE = 128; const NFS4_VERIFIER_SIZE = 8; /* * File types */ enum nfs_ftype4 { ! NF4REG = 1, /* Regular File */ ! NF4DIR = 2, /* Directory */ ! NF4BLK = 3, /* Special File - block device */ ! NF4CHR = 4, /* Special File - character device */ ! NF4LNK = 5, /* Symbolic Link */ ! NF4SOCK = 6, /* Special File - socket */ ! NF4FIFO = 7, /* Special File - fifo */ NF4ATTRDIR = 8, /* Attribute Directory */ NF4NAMEDATTR = 9 /* Named Attribute */ }; --- 21,41 ---- /* * Sizes */ ! const NFS4_FHSIZE = 128; const NFS4_VERIFIER_SIZE = 8; + const NFS4_OPAQUE_LIMIT = 1024; /* * File types */ enum nfs_ftype4 { ! NF4REG = 1, /* Regular File */ ! NF4DIR = 2, /* Directory */ ! NF4BLK = 3, /* Special File - block device */ ! NF4CHR = 4, /* Special File - character device */ ! NF4LNK = 5, /* Symbolic Link */ ! NF4SOCK = 6, /* Special File - socket */ ! NF4FIFO = 7, /* Special File - fifo */ NF4ATTRDIR = 8, /* Attribute Directory */ NF4NAMEDATTR = 9 /* Named Attribute */ }; *************** *** 43,110 **** * Error status */ enum nfsstat4 { ! NFS4_OK = 0, ! NFS4ERR_PERM = 1, ! NFS4ERR_NOENT = 2, ! NFS4ERR_IO = 5, ! NFS4ERR_NXIO = 6, ! NFS4ERR_ACCES = 13, ! NFS4ERR_EXIST = 17, ! NFS4ERR_XDEV = 18, ! NFS4ERR_NODEV = 19, ! NFS4ERR_NOTDIR = 20, ! NFS4ERR_ISDIR = 21, ! NFS4ERR_INVAL = 22, ! NFS4ERR_FBIG = 27, ! NFS4ERR_NOSPC = 28, ! NFS4ERR_ROFS = 30, ! NFS4ERR_MLINK = 31, ! NFS4ERR_NAMETOOLONG = 63, ! NFS4ERR_NOTEMPTY = 66, ! NFS4ERR_DQUOT = 69, ! NFS4ERR_STALE = 70, ! NFS4ERR_BADHANDLE = 10001, ! NFS4ERR_BAD_COOKIE = 10003, ! NFS4ERR_NOTSUPP = 10004, ! NFS4ERR_TOOSMALL = 10005, ! NFS4ERR_SERVERFAULT = 10006, ! NFS4ERR_BADTYPE = 10007, ! NFS4ERR_DELAY = 10008, ! NFS4ERR_SAME = 10009,/* nverify says attrs same */ ! NFS4ERR_DENIED = 10010,/* lock unavailable */ ! NFS4ERR_EXPIRED = 10011,/* lock lease expired */ ! NFS4ERR_LOCKED = 10012,/* I/O failed due to lock */ ! NFS4ERR_GRACE = 10013,/* in grace period */ ! NFS4ERR_FHEXPIRED = 10014,/* file handle expired */ ! NFS4ERR_SHARE_DENIED = 10015,/* share reserve denied */ NFS4ERR_WRONGSEC = 10016,/* wrong security flavor */ ! NFS4ERR_CLID_INUSE = 10017,/* clientid in use */ ! NFS4ERR_RESOURCE = 10018,/* resource exhaustion */ ! NFS4ERR_MOVED = 10019,/* filesystem relocated */ NFS4ERR_NOFILEHANDLE = 10020,/* current FH is not set */ NFS4ERR_MINOR_VERS_MISMATCH = 10021,/* minor vers not supp */ ! NFS4ERR_STALE_CLIENTID = 10022, ! NFS4ERR_STALE_STATEID = 10023, ! NFS4ERR_OLD_STATEID = 10024, ! NFS4ERR_BAD_STATEID = 10025, ! NFS4ERR_BAD_SEQID = 10026, ! NFS4ERR_NOT_SAME = 10027,/* verify - attrs not same */ ! NFS4ERR_LOCK_RANGE = 10028, ! NFS4ERR_SYMLINK = 10029, ! NFS4ERR_READDIR_NOSPC = 10030, ! NFS4ERR_LEASE_MOVED = 10031, ! NFS4ERR_ATTRNOTSUPP = 10032, ! NFS4ERR_NO_GRACE = 10033, ! NFS4ERR_RECLAIM_BAD = 10034, ! NFS4ERR_RECLAIM_CONFLICT = 10035, ! NFS4ERR_BADXDR = 10036, ! NFS4ERR_LOCKS_HELD = 10037 }; /* * Basic data types */ ! typedef uint32_t bitmap4<>; typedef uint64_t offset4; typedef uint32_t count4; typedef uint64_t length4; --- 44,122 ---- * Error status */ enum nfsstat4 { ! NFS4_OK = 0, /* everything is okay */ ! NFS4ERR_PERM = 1, /* caller not privileged */ ! NFS4ERR_NOENT = 2, /* no such file/directory */ ! NFS4ERR_IO = 5, /* hard I/O error */ ! NFS4ERR_NXIO = 6, /* no such device */ ! NFS4ERR_ACCESS = 13, /* access denied */ ! NFS4ERR_EXIST = 17, /* file already exists */ ! NFS4ERR_XDEV = 18, /* different filesystems */ ! /* Unused/reserved 19 */ ! NFS4ERR_NOTDIR = 20, /* should be a directory */ ! NFS4ERR_ISDIR = 21, /* should not be directory */ ! NFS4ERR_INVAL = 22, /* invalid argument */ ! NFS4ERR_FBIG = 27, /* file exceeds server max */ ! NFS4ERR_NOSPC = 28, /* no space on filesystem */ ! NFS4ERR_ROFS = 30, /* read-only filesystem */ ! NFS4ERR_MLINK = 31, /* too many hard links */ ! NFS4ERR_NAMETOOLONG = 63, /* name exceeds server max */ ! NFS4ERR_NOTEMPTY = 66, /* directory not empty */ ! NFS4ERR_DQUOT = 69, /* hard quota limit reached*/ ! NFS4ERR_STALE = 70, /* file no longer exists */ ! NFS4ERR_BADHANDLE = 10001,/* Illegal filehandle */ ! NFS4ERR_BAD_COOKIE = 10003,/* READDIR cookie is stale */ ! NFS4ERR_NOTSUPP = 10004,/* operation not supported */ ! NFS4ERR_TOOSMALL = 10005,/* response limit exceeded */ ! NFS4ERR_SERVERFAULT = 10006,/* undefined server error */ ! NFS4ERR_BADTYPE = 10007,/* type invalid for CREATE */ ! NFS4ERR_DELAY = 10008,/* file "busy" - retry */ ! NFS4ERR_SAME = 10009,/* nverify says attrs same */ ! NFS4ERR_DENIED = 10010,/* lock unavailable */ ! NFS4ERR_EXPIRED = 10011,/* lock lease expired */ ! NFS4ERR_LOCKED = 10012,/* I/O failed due to lock */ ! NFS4ERR_GRACE = 10013,/* in grace period */ ! NFS4ERR_FHEXPIRED = 10014,/* filehandle expired */ ! NFS4ERR_SHARE_DENIED = 10015,/* share reserve denied */ NFS4ERR_WRONGSEC = 10016,/* wrong security flavor */ ! NFS4ERR_CLID_INUSE = 10017,/* clientid in use */ ! NFS4ERR_RESOURCE = 10018,/* resource exhaustion */ ! NFS4ERR_MOVED = 10019,/* filesystem relocated */ NFS4ERR_NOFILEHANDLE = 10020,/* current FH is not set */ NFS4ERR_MINOR_VERS_MISMATCH = 10021,/* minor vers not supp */ ! NFS4ERR_STALE_CLIENTID = 10022,/* server has rebooted */ ! NFS4ERR_STALE_STATEID = 10023,/* server has rebooted */ ! NFS4ERR_OLD_STATEID = 10024,/* state is out of sync */ ! NFS4ERR_BAD_STATEID = 10025,/* incorrect stateid */ ! NFS4ERR_BAD_SEQID = 10026,/* request is out of seq. */ ! NFS4ERR_NOT_SAME = 10027,/* verify - attrs not same */ ! NFS4ERR_LOCK_RANGE = 10028,/* lock range not supported*/ ! NFS4ERR_SYMLINK = 10029,/* should be file/directory*/ ! NFS4ERR_RESTOREFH = 10030,/* no saved filehandle */ ! NFS4ERR_LEASE_MOVED = 10031,/* some filesystem moved */ ! NFS4ERR_ATTRNOTSUPP = 10032,/* recommended attr not sup*/ ! NFS4ERR_NO_GRACE = 10033,/* reclaim outside of grace*/ ! NFS4ERR_RECLAIM_BAD = 10034,/* reclaim error at server */ ! NFS4ERR_RECLAIM_CONFLICT = 10035,/* conflict on reclaim */ ! NFS4ERR_BADXDR = 10036,/* XDR decode failed */ ! NFS4ERR_LOCKS_HELD = 10037,/* file locks held at CLOSE*/ ! NFS4ERR_OPENMODE = 10038,/* conflict in OPEN and I/O*/ ! NFS4ERR_BADOWNER = 10039,/* owner translation bad */ ! NFS4ERR_BADCHAR = 10040,/* utf-8 char not supported*/ ! NFS4ERR_BADNAME = 10041,/* name not supported */ ! NFS4ERR_BAD_RANGE = 10042,/* lock range not supported*/ ! NFS4ERR_LOCK_NOTSUPP = 10043,/* no atomic up/downgrade */ ! NFS4ERR_OP_ILLEGAL = 10044,/* undefined operation */ ! NFS4ERR_DEADLOCK = 10045,/* file locking deadlock */ ! NFS4ERR_FILE_OPEN = 10046,/* open file blocks op. */ ! NFS4ERR_ADMIN_REVOKED = 10047,/* lockowner state revoked */ ! NFS4ERR_CB_PATH_DOWN = 10048 /* callback path down */ }; /* * Basic data types */ ! typedef uint32_t bitmap4<>; typedef uint64_t offset4; typedef uint32_t count4; typedef uint64_t length4; *************** *** 111,121 **** typedef uint64_t clientid4; typedef uint32_t seqid4; typedef opaque utf8string<>; ! typedef utf8string component4; typedef component4 pathname4<>; typedef uint64_t nfs_lockid4; typedef uint64_t nfs_cookie4; ! typedef utf8string linktext4; typedef opaque sec_oid4<>; typedef uint32_t qop4; typedef uint32_t mode4; --- 123,136 ---- typedef uint64_t clientid4; typedef uint32_t seqid4; typedef opaque utf8string<>; ! typedef utf8string utf8str_cis; ! typedef utf8string utf8str_cs; ! typedef utf8string utf8str_mixed; ! typedef utf8str_cs component4; typedef component4 pathname4<>; typedef uint64_t nfs_lockid4; typedef uint64_t nfs_cookie4; ! typedef utf8str_cs linktext4; typedef opaque sec_oid4<>; typedef uint32_t qop4; typedef uint32_t mode4; *************** *** 164,170 **** * Filesystem locations attribute for relocation/migration */ struct fs_location4 { ! utf8string server<>; pathname4 rootpath; }; --- 179,185 ---- * Filesystem locations attribute for relocation/migration */ struct fs_location4 { ! utf8str_cis server<>; pathname4 rootpath; }; *************** *** 254,260 **** /* * ACE4_GENERIC_WRITE -- defined as combination of ! * ACE4_READ_ACL | * ACE4_WRITE_DATA | * ACE4_WRITE_ATTRIBUTES | * ACE4_WRITE_ACL | --- 269,275 ---- /* * ACE4_GENERIC_WRITE -- defined as combination of ! * ACE4_READ_ACL | * ACE4_WRITE_DATA | * ACE4_WRITE_ATTRIBUTES | * ACE4_WRITE_ACL | *************** *** 281,296 **** acetype4 type; aceflag4 flag; acemask4 access_mask; ! utf8string who; }; /* * Special data/attribute associated with * file types NF4BLK and NF4CHR. */ struct specdata4 { ! uint32_t specdata1; ! uint32_t specdata2; }; /* --- 296,327 ---- acetype4 type; aceflag4 flag; acemask4 access_mask; ! utf8str_mixed who; }; /* + * Field definitions for the fattr4_mode attribute + */ + const MODE4_SUID = 0x800; /* set user id on execution */ + const MODE4_SGID = 0x400; /* set group id on execution */ + const MODE4_SVTX = 0x200; /* save text even after use */ + const MODE4_RUSR = 0x100; /* read permission: owner */ + const MODE4_WUSR = 0x080; /* write permission: owner */ + const MODE4_XUSR = 0x040; /* execute permission: owner */ + const MODE4_RGRP = 0x020; /* read permission: group */ + const MODE4_WGRP = 0x010; /* write permission: group */ + const MODE4_XGRP = 0x008; /* execute permission: group */ + const MODE4_ROTH = 0x004; /* read permission: other */ + const MODE4_WOTH = 0x002; /* write permission: other */ + const MODE4_XOTH = 0x001; /* execute permission: other */ + + /* * Special data/attribute associated with * file types NF4BLK and NF4CHR. */ struct specdata4 { ! uint32_t specdata1; /* major device number */ ! uint32_t specdata2; /* minor device number */ }; /* *************** *** 336,347 **** typedef uint32_t fattr4_maxname; typedef uint64_t fattr4_maxread; typedef uint64_t fattr4_maxwrite; ! typedef utf8string fattr4_mimetype; typedef mode4 fattr4_mode; typedef bool fattr4_no_trunc; typedef uint32_t fattr4_numlinks; ! typedef utf8string fattr4_owner; ! typedef utf8string fattr4_owner_group; typedef uint64_t fattr4_quota_avail_hard; typedef uint64_t fattr4_quota_avail_soft; typedef uint64_t fattr4_quota_used; --- 367,379 ---- typedef uint32_t fattr4_maxname; typedef uint64_t fattr4_maxread; typedef uint64_t fattr4_maxwrite; ! typedef utf8str_cs fattr4_mimetype; typedef mode4 fattr4_mode; + typedef uint64_t fattr4_mounted_on_fileid; typedef bool fattr4_no_trunc; typedef uint32_t fattr4_numlinks; ! typedef utf8str_mixed fattr4_owner; ! typedef utf8str_mixed fattr4_owner_group; typedef uint64_t fattr4_quota_avail_hard; typedef uint64_t fattr4_quota_avail_soft; typedef uint64_t fattr4_quota_used; *************** *** 376,381 **** --- 408,414 ---- const FATTR4_UNIQUE_HANDLES = 9; const FATTR4_LEASE_TIME = 10; const FATTR4_RDATTR_ERROR = 11; + const FATTR4_FILEHANDLE = 19; /* * Recommended Attributes *************** *** 387,393 **** const FATTR4_CASE_INSENSITIVE = 16; const FATTR4_CASE_PRESERVING = 17; const FATTR4_CHOWN_RESTRICTED = 18; - const FATTR4_FILEHANDLE = 19; const FATTR4_FILEID = 20; const FATTR4_FILES_AVAIL = 21; const FATTR4_FILES_FREE = 22; --- 420,425 ---- *************** *** 423,430 **** const FATTR4_TIME_METADATA = 52; const FATTR4_TIME_MODIFY = 53; const FATTR4_TIME_MODIFY_SET = 54; - typedef opaque attrlist4<>; /* --- 455,462 ---- const FATTR4_TIME_METADATA = 52; const FATTR4_TIME_MODIFY = 53; const FATTR4_TIME_MODIFY_SET = 54; + const FATTR4_MOUNTED_ON_FILEID = 55; typedef opaque attrlist4<>; /* *************** *** 439,445 **** * Change info for the client */ struct change_info4 { ! bool atomic; changeid4 before; changeid4 after; }; --- 471,477 ---- * Change info for the client */ struct change_info4 { ! bool atomic; changeid4 before; changeid4 after; }; *************** *** 471,495 **** */ struct nfs_client_id4 { verifier4 verifier; ! opaque id<>; }; struct open_owner4 { clientid4 clientid; ! opaque owner<>; }; struct lock_owner4 { clientid4 clientid; ! opaque owner<>; }; enum nfs_lock_type4 { ! READ_LT = 1, ! WRITE_LT = 2, ! READW_LT = 3, /* blocking read */ ! WRITEW_LT = 4, /* blocking write */ ! RELEASE_STATE = 5 /* release lock_stateid state at server */ }; /* --- 503,526 ---- */ struct nfs_client_id4 { verifier4 verifier; ! opaque id; }; struct open_owner4 { clientid4 clientid; ! opaque owner; }; struct lock_owner4 { clientid4 clientid; ! opaque owner; }; enum nfs_lock_type4 { ! READ_LT = 1, ! WRITE_LT = 2, ! READW_LT = 3, /* blocking read */ ! WRITEW_LT = 4 /* blocking write */ }; /* *************** *** 520,526 **** }; /* ! * CLOSE: Close a file and release share locks */ struct CLOSE4args { /* CURRENT_FH: object */ --- 551,557 ---- }; /* ! * CLOSE: Close a file and release share reservations */ struct CLOSE4args { /* CURRENT_FH: object */ *************** *** 569,574 **** --- 600,607 ---- case NF4FIFO: case NF4DIR: void; + default: + void; /* server should return NFS4ERR_BADTYPE */ }; struct CREATE4args { *************** *** 579,585 **** }; struct CREATE4resok { ! change_info4 cinfo; bitmap4 attrset; /* attributes set */ }; --- 612,618 ---- }; struct CREATE4resok { ! change_info4 cinfo; bitmap4 attrset; /* attributes set */ }; *************** *** 605,610 **** --- 638,644 ---- * DELEGRETURN: Return a delegation */ struct DELEGRETURN4args { + /* CURRENT_FH: delegated file */ stateid4 deleg_stateid; }; *************** *** 617,627 **** */ struct GETATTR4args { /* CURRENT_FH: directory or file */ ! bitmap4 attr_request; }; struct GETATTR4resok { ! fattr4 obj_attributes; }; union GETATTR4res switch (nfsstat4 status) { --- 651,661 ---- */ struct GETATTR4args { /* CURRENT_FH: directory or file */ ! bitmap4 attr_request; }; struct GETATTR4resok { ! fattr4 obj_attributes; }; union GETATTR4res switch (nfsstat4 status) { *************** *** 635,641 **** * GETFH: Get current filehandle */ struct GETFH4resok { ! nfs_fh4 object; }; union GETFH4res switch (nfsstat4 status) { --- 669,675 ---- * GETFH: Get current filehandle */ struct GETFH4resok { ! nfs_fh4 object; }; union GETFH4res switch (nfsstat4 status) { *************** *** 709,719 **** lock_owner4 owner; }; - /* Client must confirm lock */ - const LOCK4_RESULT_CONFIRM = 0x000000001; - struct LOCK4resok { - uint32_t rflags; /* Result flags */ stateid4 lock_stateid; }; --- 743,749 ---- *************** *** 764,770 **** */ struct LOOKUP4args { /* CURRENT_FH: directory */ ! component4 objname; }; struct LOOKUP4res { --- 794,800 ---- */ struct LOOKUP4args { /* CURRENT_FH: directory */ ! component4 objname; }; struct LOOKUP4res { *************** *** 785,791 **** */ struct NVERIFY4args { /* CURRENT_FH: object */ ! fattr4 obj_attributes; }; struct NVERIFY4res { --- 815,821 ---- */ struct NVERIFY4args { /* CURRENT_FH: object */ ! fattr4 obj_attributes; }; struct NVERIFY4res { *************** *** 829,836 **** }; struct nfs_modified_limit4 { ! uint32_t num_blocks; ! uint32_t bytes_per_block; }; union nfs_space_limit4 switch (limit_by4 limitby) { --- 859,866 ---- }; struct nfs_modified_limit4 { ! uint32_t num_blocks; ! uint32_t bytes_per_block; }; union nfs_space_limit4 switch (limit_by4 limitby) { *************** *** 856,862 **** enum open_delegation_type4 { OPEN_DELEGATE_NONE = 0, ! OPEN_DELEGATE_READ = 1, OPEN_DELEGATE_WRITE = 2 }; --- 886,892 ---- enum open_delegation_type4 { OPEN_DELEGATE_NONE = 0, ! OPEN_DELEGATE_READ = 1, OPEN_DELEGATE_WRITE = 2 }; *************** *** 919,925 **** struct open_read_delegation4 { stateid4 stateid; /* Stateid for delegation*/ ! bool recall; /* Pre-recalled flag for delegations obtained by reclaim (CLAIM_PREVIOUS) */ --- 949,955 ---- struct open_read_delegation4 { stateid4 stateid; /* Stateid for delegation*/ ! bool recall; /* Pre-recalled flag for delegations obtained by reclaim (CLAIM_PREVIOUS) */ *************** *** 930,936 **** struct open_write_delegation4 { stateid4 stateid; /* Stateid for delegation */ ! bool recall; /* Pre-recalled flag for delegations obtained by reclaim (CLAIM_PREVIOUS) */ --- 960,966 ---- struct open_write_delegation4 { stateid4 stateid; /* Stateid for delegation */ ! bool recall; /* Pre-recalled flag for delegations obtained by reclaim (CLAIM_PREVIOUS) */ *************** *** 959,974 **** /* * Result flags */ - /* Mandatory locking is in effect for this file. */ - const OPEN4_RESULT_MLOCK = 0x00000001; /* Client must confirm open */ const OPEN4_RESULT_CONFIRM = 0x00000002; struct OPEN4resok { stateid4 stateid; /* Stateid for open */ change_info4 cinfo; /* Directory Change Info */ uint32_t rflags; /* Result flags */ ! bitmap4 attrset; /* attributes set for create */ open_delegation4 delegation; /* Info on any open delegation */ }; --- 989,1004 ---- /* * Result flags */ /* Client must confirm open */ const OPEN4_RESULT_CONFIRM = 0x00000002; + /* Type of file locking behavior at the server */ + const OPEN4_RESULT_LOCKTYPE_POSIX = 0x00000004; struct OPEN4resok { stateid4 stateid; /* Stateid for open */ change_info4 cinfo; /* Directory Change Info */ uint32_t rflags; /* Result flags */ ! bitmap4 attrset; /* attribute set for create*/ open_delegation4 delegation; /* Info on any open delegation */ }; *************** *** 1040,1046 **** * PUTFH: Set current filehandle */ struct PUTFH4args { ! nfs_fh4 object; }; struct PUTFH4res { --- 1070,1076 ---- * PUTFH: Set current filehandle */ struct PUTFH4args { ! nfs_fh4 object; }; struct PUTFH4res { *************** *** 1219,1235 **** * From RFC 2203 */ enum rpc_gss_svc_t { ! RPC_GSS_SVC_NONE = 1, ! RPC_GSS_SVC_INTEGRITY = 2, ! RPC_GSS_SVC_PRIVACY = 3 }; struct rpcsec_gss_info { ! sec_oid4 oid; ! qop4 qop; rpc_gss_svc_t service; }; union secinfo4 switch (uint32_t flavor) { case RPCSEC_GSS: rpcsec_gss_info flavor_info; --- 1249,1266 ---- * From RFC 2203 */ enum rpc_gss_svc_t { ! RPC_GSS_SVC_NONE = 1, ! RPC_GSS_SVC_INTEGRITY = 2, ! RPC_GSS_SVC_PRIVACY = 3 }; struct rpcsec_gss_info { ! sec_oid4 oid; ! qop4 qop; rpc_gss_svc_t service; }; + /* RPCSEC_GSS has a value of '6' - See RFC 2203 */ union secinfo4 switch (uint32_t flavor) { case RPCSEC_GSS: rpcsec_gss_info flavor_info; *************** *** 1252,1258 **** struct SETATTR4args { /* CURRENT_FH: target object */ stateid4 stateid; ! fattr4 obj_attributes; }; struct SETATTR4res { --- 1283,1289 ---- struct SETATTR4args { /* CURRENT_FH: target object */ stateid4 stateid; ! fattr4 obj_attributes; }; struct SETATTR4res { *************** *** 1266,1275 **** --- 1297,1308 ---- struct SETCLIENTID4args { nfs_client_id4 client; cb_client4 callback; + uint32_t callback_ident; }; struct SETCLIENTID4resok { clientid4 clientid; + verifier4 setclientid_confirm; }; union SETCLIENTID4res switch (nfsstat4 status) { *************** *** 1283,1288 **** --- 1316,1322 ---- struct SETCLIENTID_CONFIRM4args { clientid4 clientid; + verifier4 setclientid_confirm; }; struct SETCLIENTID_CONFIRM4res { *************** *** 1294,1300 **** */ struct VERIFY4args { /* CURRENT_FH: object */ ! fattr4 obj_attributes; }; struct VERIFY4res { --- 1328,1334 ---- */ struct VERIFY4args { /* CURRENT_FH: object */ ! fattr4 obj_attributes; }; struct VERIFY4res { *************** *** 1305,1313 **** * WRITE: Write to file */ enum stable_how4 { ! UNSTABLE4 = 0, ! DATA_SYNC4 = 1, ! FILE_SYNC4 = 2 }; struct WRITE4args { --- 1339,1347 ---- * WRITE: Write to file */ enum stable_how4 { ! UNSTABLE4 = 0, ! DATA_SYNC4 = 1, ! FILE_SYNC4 = 2 }; struct WRITE4args { *************** *** 1332,1337 **** --- 1366,1389 ---- }; /* + * RELEASE_LOCKOWNER: Notify server to release lockowner + */ + struct RELEASE_LOCKOWNER4args { + lock_owner4 lock_owner; + }; + + struct RELEASE_LOCKOWNER4res { + nfsstat4 status; + }; + + /* + * ILLEGAL: Response for illegal operation numbers + */ + struct ILLEGAL4res { + nfsstat4 status; + }; + + /* * Operation arrays */ *************** *** 1371,1377 **** OP_SETCLIENTID = 35, OP_SETCLIENTID_CONFIRM = 36, OP_VERIFY = 37, ! OP_WRITE = 38 }; union nfs_argop4 switch (nfs_opnum4 argop) { --- 1423,1431 ---- OP_SETCLIENTID = 35, OP_SETCLIENTID_CONFIRM = 36, OP_VERIFY = 37, ! OP_WRITE = 38, ! OP_RELEASE_LOCKOWNER = 39, ! OP_ILLEGAL = 10044 }; union nfs_argop4 switch (nfs_opnum4 argop) { *************** *** 1412,1417 **** --- 1466,1474 ---- opsetclientid_confirm; case OP_VERIFY: VERIFY4args opverify; case OP_WRITE: WRITE4args opwrite; + case OP_RELEASE_LOCKOWNER: RELEASE_LOCKOWNER4args + oprelease_lockowner; + case OP_ILLEGAL: void; }; union nfs_resop4 switch (nfs_opnum4 resop){ *************** *** 1452,1461 **** opsetclientid_confirm; case OP_VERIFY: VERIFY4res opverify; case OP_WRITE: WRITE4res opwrite; }; struct COMPOUND4args { ! utf8string tag; uint32_t minorversion; nfs_argop4 argarray<>; }; --- 1509,1521 ---- opsetclientid_confirm; case OP_VERIFY: VERIFY4res opverify; case OP_WRITE: WRITE4res opwrite; + case OP_RELEASE_LOCKOWNER: RELEASE_LOCKOWNER4res + oprelease_lockowner; + case OP_ILLEGAL: ILLEGAL4res opillegal; }; struct COMPOUND4args { ! utf8str_cs tag; uint32_t minorversion; nfs_argop4 argarray<>; }; *************** *** 1462,1469 **** struct COMPOUND4res { nfsstat4 status; ! utf8string tag; ! nfs_resop4 resarray<>; }; /* --- 1522,1529 ---- struct COMPOUND4res { nfsstat4 status; ! utf8str_cs tag; ! nfs_resop4 resarray<>; }; /* *************** *** 1519,1551 **** }; /* * Various definitions for CB_COMPOUND */ enum nfs_cb_opnum4 { OP_CB_GETATTR = 3, ! OP_CB_RECALL = 4 }; union nfs_cb_argop4 switch (unsigned argop) { case OP_CB_GETATTR: CB_GETATTR4args opcbgetattr; case OP_CB_RECALL: CB_RECALL4args opcbrecall; }; union nfs_cb_resop4 switch (unsigned resop){ case OP_CB_GETATTR: CB_GETATTR4res opcbgetattr; case OP_CB_RECALL: CB_RECALL4res opcbrecall; }; struct CB_COMPOUND4args { ! utf8string tag; uint32_t minorversion; nfs_cb_argop4 argarray<>; }; struct CB_COMPOUND4res { nfsstat4 status; ! utf8string tag; ! nfs_cb_resop4 resarray<>; }; --- 1579,1622 ---- }; /* + * CB_ILLEGAL: Response for illegal operation numbers + */ + struct CB_ILLEGAL4res { + nfsstat4 status; + }; + + /* * Various definitions for CB_COMPOUND */ enum nfs_cb_opnum4 { OP_CB_GETATTR = 3, ! OP_CB_RECALL = 4, ! OP_CB_ILLEGAL = 10044 }; union nfs_cb_argop4 switch (unsigned argop) { case OP_CB_GETATTR: CB_GETATTR4args opcbgetattr; case OP_CB_RECALL: CB_RECALL4args opcbrecall; + case OP_CB_ILLEGAL: void; }; union nfs_cb_resop4 switch (unsigned resop){ case OP_CB_GETATTR: CB_GETATTR4res opcbgetattr; case OP_CB_RECALL: CB_RECALL4res opcbrecall; + case OP_CB_ILLEGAL: CB_ILLEGAL4res opcbillegal; }; struct CB_COMPOUND4args { ! utf8str_cs tag; uint32_t minorversion; + uint32_t callback_ident; nfs_cb_argop4 argarray<>; }; struct CB_COMPOUND4res { nfsstat4 status; ! utf8str_cs tag; ! nfs_cb_resop4 resarray<>; };