union nfsd4_op_u *u)
 {
        struct nfsd4_access *access = &u->access;
+       u32 access_full;
 
-       if (access->ac_req_access & ~NFS3_ACCESS_FULL)
+       access_full = NFS3_ACCESS_FULL;
+       if (cstate->minorversion >= 2)
+               access_full |= NFS4_ACCESS_XALIST | NFS4_ACCESS_XAREAD |
+                              NFS4_ACCESS_XAWRITE;
+
+       if (access->ac_req_access & ~access_full)
                return nfserr_inval;
 
        access->ac_resp_access = access->ac_req_access;
 
     {  NFS3_ACCESS_MODIFY,     NFSD_MAY_WRITE|NFSD_MAY_TRUNC   },
     {  NFS3_ACCESS_EXTEND,     NFSD_MAY_WRITE                  },
 
+#ifdef CONFIG_NFSD_V4
+    {  NFS4_ACCESS_XAREAD,     NFSD_MAY_READ                   },
+    {  NFS4_ACCESS_XAWRITE,    NFSD_MAY_WRITE                  },
+    {  NFS4_ACCESS_XALIST,     NFSD_MAY_READ                   },
+#endif
+
     {  0,                      0                               }
 };
 
     {  NFS3_ACCESS_EXTEND,     NFSD_MAY_EXEC|NFSD_MAY_WRITE    },
     {  NFS3_ACCESS_DELETE,     NFSD_MAY_REMOVE                 },
 
+#ifdef CONFIG_NFSD_V4
+    {  NFS4_ACCESS_XAREAD,     NFSD_MAY_READ                   },
+    {  NFS4_ACCESS_XAWRITE,    NFSD_MAY_WRITE                  },
+    {  NFS4_ACCESS_XALIST,     NFSD_MAY_READ                   },
+#endif
+
     {  0,                      0                               }
 };