Merge branch 'linus' into cont_syslog
[safe/jmp/linux-2.6] / include / linux / nfs4.h
index 1477fc8..9b8299a 100644 (file)
 #define _LINUX_NFS4_H
 
 #include <linux/types.h>
-#include <linux/list.h>
 
+#define NFS4_BITMAP_SIZE       2
 #define NFS4_VERIFIER_SIZE     8
+#define NFS4_STATEID_SIZE      16
 #define NFS4_FHSIZE            128
 #define NFS4_MAXPATHLEN                PATH_MAX
 #define NFS4_MAXNAMLEN         NAME_MAX
+#define NFS4_OPAQUE_LIMIT      1024
+#define NFS4_MAX_SESSIONID_LEN 16
 
 #define NFS4_ACCESS_READ        0x0001
 #define NFS4_ACCESS_LOOKUP      0x0002
@@ -37,6 +40,7 @@
 #define NFS4_OPEN_RESULT_CONFIRM 0x0002
 #define NFS4_OPEN_RESULT_LOCKTYPE_POSIX 0x0004
 
+#define NFS4_SHARE_ACCESS_MASK 0x000F
 #define NFS4_SHARE_ACCESS_READ 0x0001
 #define NFS4_SHARE_ACCESS_WRITE        0x0002
 #define NFS4_SHARE_ACCESS_BOTH 0x0003
 #define NFS4_SHARE_DENY_WRITE  0x0002
 #define NFS4_SHARE_DENY_BOTH   0x0003
 
+/* nfs41 */
+#define NFS4_SHARE_WANT_MASK           0xFF00
+#define NFS4_SHARE_WANT_NO_PREFERENCE  0x0000
+#define NFS4_SHARE_WANT_READ_DELEG     0x0100
+#define NFS4_SHARE_WANT_WRITE_DELEG    0x0200
+#define NFS4_SHARE_WANT_ANY_DELEG      0x0300
+#define NFS4_SHARE_WANT_NO_DELEG       0x0400
+#define NFS4_SHARE_WANT_CANCEL         0x0500
+
+#define NFS4_SHARE_WHEN_MASK           0xF0000
+#define NFS4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL       0x10000
+#define NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED         0x20000
+
 #define NFS4_SET_TO_SERVER_TIME        0
 #define NFS4_SET_TO_CLIENT_TIME        1
 
@@ -64,9 +81,6 @@
 #define NFS4_ACE_SUCCESSFUL_ACCESS_ACE_FLAG   0x00000010
 #define NFS4_ACE_FAILED_ACCESS_ACE_FLAG       0x00000020
 #define NFS4_ACE_IDENTIFIER_GROUP             0x00000040
-#define NFS4_ACE_OWNER                        0x00000080
-#define NFS4_ACE_GROUP                        0x00000100
-#define NFS4_ACE_EVERYONE                     0x00000200
 
 #define NFS4_ACE_READ_DATA                    0x00000001
 #define NFS4_ACE_LIST_DIRECTORY               0x00000001
 #define NFS4_ACE_GENERIC_EXECUTE              0x001200A0
 #define NFS4_ACE_MASK_ALL                     0x001F01FF
 
+#define EXCHGID4_FLAG_SUPP_MOVED_REFER         0x00000001
+#define EXCHGID4_FLAG_SUPP_MOVED_MIGR          0x00000002
+#define EXCHGID4_FLAG_USE_NON_PNFS             0x00010000
+#define EXCHGID4_FLAG_USE_PNFS_MDS             0x00020000
+#define EXCHGID4_FLAG_USE_PNFS_DS              0x00040000
+#define EXCHGID4_FLAG_UPD_CONFIRMED_REC_A      0x40000000
+#define EXCHGID4_FLAG_CONFIRMED_R              0x80000000
+/*
+ * Since the validity of these bits depends on whether
+ * they're set in the argument or response, have separate
+ * invalid flag masks for arg (_A) and resp (_R).
+ */
+#define EXCHGID4_FLAG_MASK_A                   0x40070003
+#define EXCHGID4_FLAG_MASK_R                   0x80070003
+
+#define SEQ4_STATUS_CB_PATH_DOWN               0x00000001
+#define SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRING   0x00000002
+#define SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRED    0x00000004
+#define SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED  0x00000008
+#define SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED 0x00000010
+#define SEQ4_STATUS_ADMIN_STATE_REVOKED                0x00000020
+#define SEQ4_STATUS_RECALLABLE_STATE_REVOKED   0x00000040
+#define SEQ4_STATUS_LEASE_MOVED                        0x00000080
+#define SEQ4_STATUS_RESTART_RECLAIM_NEEDED     0x00000100
+#define SEQ4_STATUS_CB_PATH_DOWN_SESSION       0x00000200
+#define SEQ4_STATUS_BACKCHANNEL_FAULT          0x00000400
+
+#define NFS4_MAX_UINT64        (~(u64)0)
+
+/* An NFS4 sessions server must support at least NFS4_MAX_OPS operations.
+ * If a compound requires more operations, adjust NFS4_MAX_OPS accordingly.
+ */
+#define NFS4_MAX_OPS   8
+
+/* Our NFS4 client back channel server only wants the cb_sequene and the
+ * actual operation per compound
+ */
+#define NFS4_MAX_BACK_CHANNEL_OPS 2
+
 enum nfs4_acl_whotype {
        NFS4_ACL_WHO_NAMED = 0,
        NFS4_ACL_WHO_OWNER,
@@ -97,22 +150,24 @@ enum nfs4_acl_whotype {
        NFS4_ACL_WHO_EVERYONE,
 };
 
+#ifdef __KERNEL__
+#include <linux/list.h>
+
 struct nfs4_ace {
        uint32_t        type;
        uint32_t        flag;
        uint32_t        access_mask;
        int             whotype;
        uid_t           who;
-       struct list_head l_ace;
 };
 
 struct nfs4_acl {
        uint32_t        naces;
-       struct list_head ace_head;
+       struct nfs4_ace aces[0];
 };
 
 typedef struct { char data[NFS4_VERIFIER_SIZE]; } nfs4_verifier;
-typedef struct { char data[16]; } nfs4_stateid;
+typedef struct { char data[NFS4_STATEID_SIZE]; } nfs4_stateid;
 
 enum nfs_opnum4 {
        OP_ACCESS = 3,
@@ -152,9 +207,37 @@ enum nfs_opnum4 {
        OP_VERIFY = 37,
        OP_WRITE = 38,
        OP_RELEASE_LOCKOWNER = 39,
+
+       /* nfs41 */
+       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,
 };
 
+/*Defining first and last NFS4 operations implemented.
+Needs to be updated if more operations are defined in future.*/
+
+#define FIRST_NFS4_OP  OP_ACCESS
+#define LAST_NFS4_OP   OP_RECLAIM_COMPLETE
+
 enum nfsstat4 {
        NFS4_OK = 0,
        NFS4ERR_PERM = 1,
@@ -222,7 +305,48 @@ enum nfsstat4 {
        NFS4ERR_DEADLOCK = 10045,
        NFS4ERR_FILE_OPEN = 10046,
        NFS4ERR_ADMIN_REVOKED = 10047,
-       NFS4ERR_CB_PATH_DOWN = 10048
+       NFS4ERR_CB_PATH_DOWN = 10048,
+
+       /* nfs41 */
+       NFS4ERR_BADIOMODE       = 10049,
+       NFS4ERR_BADLAYOUT       = 10050,
+       NFS4ERR_BAD_SESSION_DIGEST = 10051,
+       NFS4ERR_BADSESSION      = 10052,
+       NFS4ERR_BADSLOT         = 10053,
+       NFS4ERR_COMPLETE_ALREADY = 10054,
+       NFS4ERR_CONN_NOT_BOUND_TO_SESSION = 10055,
+       NFS4ERR_DELEG_ALREADY_WANTED = 10056,
+       NFS4ERR_BACK_CHAN_BUSY  = 10057,        /* backchan reqs outstanding */
+       NFS4ERR_LAYOUTTRYLATER  = 10058,
+       NFS4ERR_LAYOUTUNAVAILABLE = 10059,
+       NFS4ERR_NOMATCHING_LAYOUT = 10060,
+       NFS4ERR_RECALLCONFLICT  = 10061,
+       NFS4ERR_UNKNOWN_LAYOUTTYPE = 10062,
+       NFS4ERR_SEQ_MISORDERED = 10063,         /* unexpected seq.id in req */
+       NFS4ERR_SEQUENCE_POS    = 10064,        /* [CB_]SEQ. op not 1st op */
+       NFS4ERR_REQ_TOO_BIG     = 10065,        /* request too big */
+       NFS4ERR_REP_TOO_BIG     = 10066,        /* reply too big */
+       NFS4ERR_REP_TOO_BIG_TO_CACHE = 10067,   /* rep. not all cached */
+       NFS4ERR_RETRY_UNCACHED_REP = 10068,     /* retry & rep. uncached */
+       NFS4ERR_UNSAFE_COMPOUND = 10069,        /* retry/recovery too hard */
+       NFS4ERR_TOO_MANY_OPS    = 10070,        /* too many ops in [CB_]COMP */
+       NFS4ERR_OP_NOT_IN_SESSION = 10071,      /* op needs [CB_]SEQ. op */
+       NFS4ERR_HASH_ALG_UNSUPP = 10072,        /* hash alg. not supp. */
+                                               /* Error 10073 is unused. */
+       NFS4ERR_CLIENTID_BUSY   = 10074,        /* clientid has state */
+       NFS4ERR_PNFS_IO_HOLE    = 10075,        /* IO to _SPARSE file hole */
+       NFS4ERR_SEQ_FALSE_RETRY = 10076,        /* retry not origional */
+       NFS4ERR_BAD_HIGH_SLOT   = 10077,        /* sequence arg bad */
+       NFS4ERR_DEADSESSION     = 10078,        /* persistent session dead */
+       NFS4ERR_ENCR_ALG_UNSUPP = 10079,        /* SSV alg mismatch */
+       NFS4ERR_PNFS_NO_LAYOUT  = 10080,        /* direct I/O with no layout */
+       NFS4ERR_NOT_ONLY_OP     = 10081,        /* bad compound */
+       NFS4ERR_WRONG_CRED      = 10082,        /* permissions:state change */
+       NFS4ERR_WRONG_TYPE      = 10083,        /* current operation mismatch */
+       NFS4ERR_DIRDELEG_UNAVAIL = 10084,       /* no directory delegation */
+       NFS4ERR_REJECT_DELEG    = 10085,        /* on callback */
+       NFS4ERR_RETURNCONFLICT  = 10086,        /* outstanding layoutreturn */
+       NFS4ERR_DELEG_REVOKED   = 10087,        /* deleg./layout revoked */
 };
 
 /*
@@ -257,7 +381,13 @@ enum opentype4 {
 enum createmode4 {
        NFS4_CREATE_UNCHECKED = 0,
        NFS4_CREATE_GUARDED = 1,
-       NFS4_CREATE_EXCLUSIVE = 2
+       NFS4_CREATE_EXCLUSIVE = 2,
+       /*
+        * New to NFSv4.1. If session is persistent,
+        * GUARDED4 MUST be used. Otherwise, use
+        * EXCLUSIVE4_1 instead of EXCLUSIVE4.
+        */
+       NFS4_CREATE_EXCLUSIVE4_1 = 3
 };
 
 enum limit_by4 {
@@ -293,6 +423,8 @@ enum lock_type4 {
 #define FATTR4_WORD0_UNIQUE_HANDLES     (1UL << 9)
 #define FATTR4_WORD0_LEASE_TIME         (1UL << 10)
 #define FATTR4_WORD0_RDATTR_ERROR       (1UL << 11)
+/* Mandatory in NFSv4.1 */
+#define FATTR4_WORD2_SUPPATTR_EXCLCREAT (1UL << 11)
 
 /* Recommended Attributes */
 #define FATTR4_WORD0_ACL                (1UL << 12)
@@ -342,10 +474,16 @@ enum lock_type4 {
 
 #define NFSPROC4_NULL 0
 #define NFSPROC4_COMPOUND 1
+#define NFS4_VERSION 4
 #define NFS4_MINOR_VERSION 0
-#define NFS4_DEBUG 1
 
-#ifdef __KERNEL__
+#if defined(CONFIG_NFS_V4_1)
+#define NFS4_MAX_MINOR_VERSION 1
+#else
+#define NFS4_MAX_MINOR_VERSION 0
+#endif /* CONFIG_NFS_V4_1 */
+
+#define NFS4_DEBUG 1
 
 /* Index of predefined Linux client operations */
 
@@ -385,6 +523,30 @@ enum {
        NFSPROC4_CLNT_GETACL,
        NFSPROC4_CLNT_SETACL,
        NFSPROC4_CLNT_FS_LOCATIONS,
+
+       /* nfs41 */
+       NFSPROC4_CLNT_EXCHANGE_ID,
+       NFSPROC4_CLNT_CREATE_SESSION,
+       NFSPROC4_CLNT_DESTROY_SESSION,
+       NFSPROC4_CLNT_SEQUENCE,
+       NFSPROC4_CLNT_GET_LEASE_TIME,
+       NFSPROC4_CLNT_RECLAIM_COMPLETE,
+};
+
+/* nfs41 types */
+struct nfs4_sessionid {
+       unsigned char data[NFS4_MAX_SESSIONID_LEN];
+};
+
+/* Create Session Flags */
+#define SESSION4_PERSIST        0x001
+#define SESSION4_BACK_CHAN      0x002
+#define SESSION4_RDMA           0x004
+
+enum state_protect_how4 {
+       SP4_NONE        = 0,
+       SP4_MACH_CRED   = 1,
+       SP4_SSV         = 2
 };
 
 #endif