root/usr/src/uts/common/nfs/nfs4_attr.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _NFS4_ATTR_H
#define _NFS4_ATTR_H

#ifdef  __cplusplus
extern "C" {
#endif

#define FATTR4_WORD0    32
#define FATTR4_WORD1    0

/*
 * Attributes
 */
#define FATTR4_SUPPORTED_ATTRS_MASK     (1ULL << (FATTR4_WORD0 + 0))
#define FATTR4_TYPE_MASK                (1ULL << (FATTR4_WORD0 + 1))
#define FATTR4_FH_EXPIRE_TYPE_MASK      (1ULL << (FATTR4_WORD0 + 2))
#define FATTR4_CHANGE_MASK              (1ULL << (FATTR4_WORD0 + 3))
#define FATTR4_SIZE_MASK                (1ULL << (FATTR4_WORD0 + 4))
#define FATTR4_LINK_SUPPORT_MASK        (1ULL << (FATTR4_WORD0 + 5))
#define FATTR4_SYMLINK_SUPPORT_MASK     (1ULL << (FATTR4_WORD0 + 6))
#define FATTR4_NAMED_ATTR_MASK          (1ULL << (FATTR4_WORD0 + 7))
#define FATTR4_FSID_MASK                (1ULL << (FATTR4_WORD0 + 8))
#define FATTR4_UNIQUE_HANDLES_MASK      (1ULL << (FATTR4_WORD0 + 9))
#define FATTR4_LEASE_TIME_MASK          (1ULL << (FATTR4_WORD0 + 10))
#define FATTR4_RDATTR_ERROR_MASK        (1ULL << (FATTR4_WORD0 + 11))
#define FATTR4_ACL_MASK                 (1ULL << (FATTR4_WORD0 + 12))
#define FATTR4_ACLSUPPORT_MASK          (1ULL << (FATTR4_WORD0 + 13))
#define FATTR4_ARCHIVE_MASK             (1ULL << (FATTR4_WORD0 + 14))
#define FATTR4_CANSETTIME_MASK          (1ULL << (FATTR4_WORD0 + 15))
#define FATTR4_CASE_INSENSITIVE_MASK    (1ULL << (FATTR4_WORD0 + 16))
#define FATTR4_CASE_PRESERVING_MASK     (1ULL << (FATTR4_WORD0 + 17))
#define FATTR4_CHOWN_RESTRICTED_MASK    (1ULL << (FATTR4_WORD0 + 18))
#define FATTR4_FILEHANDLE_MASK          (1ULL << (FATTR4_WORD0 + 19))
#define FATTR4_FILEID_MASK              (1ULL << (FATTR4_WORD0 + 20))
#define FATTR4_FILES_AVAIL_MASK         (1ULL << (FATTR4_WORD0 + 21))
#define FATTR4_FILES_FREE_MASK          (1ULL << (FATTR4_WORD0 + 22))
#define FATTR4_FILES_TOTAL_MASK         (1ULL << (FATTR4_WORD0 + 23))
#define FATTR4_FS_LOCATIONS_MASK        (1ULL << (FATTR4_WORD0 + 24))
#define FATTR4_HIDDEN_MASK              (1ULL << (FATTR4_WORD0 + 25))
#define FATTR4_HOMOGENEOUS_MASK         (1ULL << (FATTR4_WORD0 + 26))
#define FATTR4_MAXFILESIZE_MASK         (1ULL << (FATTR4_WORD0 + 27))
#define FATTR4_MAXLINK_MASK             (1ULL << (FATTR4_WORD0 + 28))
#define FATTR4_MAXNAME_MASK             (1ULL << (FATTR4_WORD0 + 29))
#define FATTR4_MAXREAD_MASK             (1ULL << (FATTR4_WORD0 + 30))
#define FATTR4_MAXWRITE_MASK            (1ULL << (FATTR4_WORD0 + 31))

#define FATTR4_MIMETYPE_MASK            (1ULL << (FATTR4_WORD1 + 0))
#define FATTR4_MODE_MASK                (1ULL << (FATTR4_WORD1 + 1))
#define FATTR4_NO_TRUNC_MASK            (1ULL << (FATTR4_WORD1 + 2))
#define FATTR4_NUMLINKS_MASK            (1ULL << (FATTR4_WORD1 + 3))
#define FATTR4_OWNER_MASK               (1ULL << (FATTR4_WORD1 + 4))
#define FATTR4_OWNER_GROUP_MASK         (1ULL << (FATTR4_WORD1 + 5))
#define FATTR4_QUOTA_AVAIL_HARD_MASK    (1ULL << (FATTR4_WORD1 + 6))
#define FATTR4_QUOTA_AVAIL_SOFT_MASK    (1ULL << (FATTR4_WORD1 + 7))
#define FATTR4_QUOTA_USED_MASK          (1ULL << (FATTR4_WORD1 + 8))
#define FATTR4_RAWDEV_MASK              (1ULL << (FATTR4_WORD1 + 9))
#define FATTR4_SPACE_AVAIL_MASK         (1ULL << (FATTR4_WORD1 + 10))
#define FATTR4_SPACE_FREE_MASK          (1ULL << (FATTR4_WORD1 + 11))
#define FATTR4_SPACE_TOTAL_MASK         (1ULL << (FATTR4_WORD1 + 12))
#define FATTR4_SPACE_USED_MASK          (1ULL << (FATTR4_WORD1 + 13))
#define FATTR4_SYSTEM_MASK              (1ULL << (FATTR4_WORD1 + 14))
#define FATTR4_TIME_ACCESS_MASK         (1ULL << (FATTR4_WORD1 + 15))
#define FATTR4_TIME_ACCESS_SET_MASK     (1ULL << (FATTR4_WORD1 + 16))
#define FATTR4_TIME_BACKUP_MASK         (1ULL << (FATTR4_WORD1 + 17))
#define FATTR4_TIME_CREATE_MASK         (1ULL << (FATTR4_WORD1 + 18))
#define FATTR4_TIME_DELTA_MASK          (1ULL << (FATTR4_WORD1 + 19))
#define FATTR4_TIME_METADATA_MASK       (1ULL << (FATTR4_WORD1 + 20))
#define FATTR4_TIME_MODIFY_MASK         (1ULL << (FATTR4_WORD1 + 21))
#define FATTR4_TIME_MODIFY_SET_MASK     (1ULL << (FATTR4_WORD1 + 22))
#define FATTR4_MOUNTED_ON_FILEID_MASK   (1ULL << (FATTR4_WORD1 + 23))

/* nfsv4.1 */

/* Overload to fit to 64-bits bitmap4 */
#define FATTR4_SUPPATTR_EXCLCREAT_MASK_LOCAL    (1ULL << (FATTR4_WORD1 + 24))
#define FATTR4_SEC_LABEL_MASK_LOCAL     (1ULL << (FATTR4_WORD1 + 25))

/*
 * Common bitmap4 of file attributes to be gathered
 */
#define NFS4_NTOV_ATTR_MASK (           \
        FATTR4_TYPE_MASK |              \
        FATTR4_CHANGE_MASK |            \
        FATTR4_SIZE_MASK |              \
        FATTR4_FSID_MASK |              \
        FATTR4_FILEID_MASK |            \
        FATTR4_MODE_MASK |              \
        FATTR4_OWNER_MASK |             \
        FATTR4_OWNER_GROUP_MASK |       \
        FATTR4_NUMLINKS_MASK |          \
        FATTR4_TIME_ACCESS_MASK |       \
        FATTR4_TIME_MODIFY_MASK |       \
        FATTR4_TIME_METADATA_MASK |     \
        FATTR4_RAWDEV_MASK |            \
        FATTR4_SPACE_USED_MASK |        \
        FATTR4_MOUNTED_ON_FILEID_MASK)

#define NFS4_VATTR_MASK (               \
        FATTR4_TYPE_MASK |              \
        FATTR4_CHANGE_MASK |            \
        FATTR4_SIZE_MASK |              \
        FATTR4_FSID_MASK |              \
        FATTR4_FILEID_MASK |            \
        FATTR4_MODE_MASK |              \
        FATTR4_OWNER_MASK |             \
        FATTR4_OWNER_GROUP_MASK |       \
        FATTR4_NUMLINKS_MASK |          \
        FATTR4_TIME_ACCESS_MASK |       \
        FATTR4_TIME_MODIFY_MASK |       \
        FATTR4_TIME_METADATA_MASK |     \
        FATTR4_RAWDEV_MASK |            \
        FATTR4_SPACE_USED_MASK |        \
        FATTR4_MOUNTED_ON_FILEID_MASK)

#define NFS4_PATHCONF_MASK (            \
        NFS4_VATTR_MASK |               \
        FATTR4_NO_TRUNC_MASK |          \
        FATTR4_CHOWN_RESTRICTED_MASK |  \
        FATTR4_CASE_INSENSITIVE_MASK |  \
        FATTR4_CASE_PRESERVING_MASK |   \
        FATTR4_NAMED_ATTR_MASK |        \
        FATTR4_LINK_SUPPORT_MASK |      \
        FATTR4_SYMLINK_SUPPORT_MASK |   \
        FATTR4_UNIQUE_HANDLES_MASK |    \
        FATTR4_CANSETTIME_MASK |        \
        FATTR4_HOMOGENEOUS_MASK |       \
        FATTR4_MAXLINK_MASK |           \
        FATTR4_MAXNAME_MASK |           \
        FATTR4_MAXFILESIZE_MASK)

/*
 * The corresponding AT_MASK
 */
#define NFS4_NTOV_ATTR_AT_MASK (        \
        AT_TYPE |                       \
        AT_SIZE |                       \
        AT_FSID |                       \
        AT_NODEID |                     \
        AT_MODE |                       \
        AT_UID |                        \
        AT_GID |                        \
        AT_NLINK |                      \
        AT_ATIME |                      \
        AT_MTIME |                      \
        AT_CTIME |                      \
        AT_RDEV |                       \
        AT_NBLOCKS)

/*
 * Common bitmap4 of filesystem attributes to be gathered
 */
#define NFS4_FS_ATTR_MASK (             \
        FATTR4_FILES_AVAIL_MASK |       \
        FATTR4_FILES_FREE_MASK |        \
        FATTR4_FILES_TOTAL_MASK |       \
        FATTR4_SPACE_AVAIL_MASK |       \
        FATTR4_SPACE_FREE_MASK |        \
        FATTR4_SPACE_TOTAL_MASK)

#define NFS4_STATFS_ATTR_MASK (         \
        FATTR4_FILES_AVAIL_MASK |       \
        FATTR4_FILES_FREE_MASK |        \
        FATTR4_FILES_TOTAL_MASK |       \
        FATTR4_SPACE_AVAIL_MASK |       \
        FATTR4_SPACE_FREE_MASK |        \
        FATTR4_SPACE_TOTAL_MASK |       \
        FATTR4_MAXNAME_MASK)

/*
 * The corresponding AT_MASK
 */
#define NFS4_FS_ATTR_AT_MASK    0

/*
 * Common bitmap4 to gather attr cache state
 */
#define NFS4_NTOV_ATTR_CACHE_MASK (     \
        FATTR4_TIME_METADATA_MASK |     \
        FATTR4_TIME_MODIFY_MASK |       \
        FATTR4_SIZE_MASK)

/*
 * The corresponding AT_MASK
 */
#define NFS4_NTOV_ATTR_CACHE_AT_MASK (  \
        AT_CTIME |                      \
        AT_MTIME |                      \
        AT_SIZE)

#define NFS4_VTON_ATTR_MASK (           \
        AT_TYPE |                       \
        AT_MODE |                       \
        AT_UID |                        \
        AT_GID |                        \
        AT_NODEID |                     \
        AT_SIZE |                       \
        AT_NLINK |                      \
        AT_ATIME |                      \
        AT_MTIME |                      \
        AT_CTIME |                      \
        AT_RDEV |                       \
        AT_NBLOCKS |                    \
        AT_FSID)

#define NFS4_VTON_ATTR_MASK_SET (       \
        AT_MODE |                       \
        AT_UID |                        \
        AT_GID |                        \
        AT_SIZE |                       \
        AT_ATIME |                      \
        AT_MTIME)

/* solaris-supported, non-vattr_t per-vnode scoped attrs */
#define NFS4_VP_ATTR_MASK (             \
        FATTR4_CHANGE_MASK |            \
        FATTR4_CHOWN_RESTRICTED_MASK |  \
        FATTR4_FILEHANDLE_MASK |        \
        FATTR4_MAXFILESIZE_MASK |       \
        FATTR4_MAXLINK_MASK |           \
        FATTR4_MAXNAME_MASK |           \
        FATTR4_MOUNTED_ON_FILEID_MASK)

#define FATTR4_FSINFO_MASK (            \
        FATTR4_SUPPORTED_ATTRS_MASK |   \
        FATTR4_TYPE_MASK |              \
        FATTR4_FH_EXPIRE_TYPE_MASK |    \
        FATTR4_LINK_SUPPORT_MASK |      \
        FATTR4_SYMLINK_SUPPORT_MASK |   \
        FATTR4_FSID_MASK |              \
        FATTR4_MAXFILESIZE_MASK |       \
        FATTR4_MAXREAD_MASK |           \
        FATTR4_MAXWRITE_MASK)

/*
 * These are the support attributes for the NFSv4 server
 */
#define NFS4_SRV_RDDIR_SUPPORTED_ATTRS (        \
        FATTR4_SUPPORTED_ATTRS_MASK |   \
        FATTR4_TYPE_MASK |              \
        FATTR4_FH_EXPIRE_TYPE_MASK |    \
        FATTR4_CHANGE_MASK |            \
        FATTR4_SIZE_MASK |              \
        FATTR4_LINK_SUPPORT_MASK |      \
        FATTR4_SYMLINK_SUPPORT_MASK |   \
        FATTR4_NAMED_ATTR_MASK |        \
        FATTR4_FSID_MASK |              \
        FATTR4_UNIQUE_HANDLES_MASK |    \
        FATTR4_LEASE_TIME_MASK |        \
        FATTR4_RDATTR_ERROR_MASK |      \
        FATTR4_CANSETTIME_MASK |        \
        FATTR4_CASE_INSENSITIVE_MASK |  \
        FATTR4_CASE_PRESERVING_MASK |   \
        FATTR4_CHOWN_RESTRICTED_MASK |  \
        FATTR4_FILEHANDLE_MASK |        \
        FATTR4_FILEID_MASK |            \
        FATTR4_FILES_AVAIL_MASK |       \
        FATTR4_FILES_FREE_MASK |        \
        FATTR4_FILES_TOTAL_MASK |       \
        FATTR4_FS_LOCATIONS_MASK |      \
        FATTR4_HOMOGENEOUS_MASK |       \
        FATTR4_MAXFILESIZE_MASK |       \
        FATTR4_MAXLINK_MASK |           \
        FATTR4_MAXNAME_MASK |           \
        FATTR4_MAXREAD_MASK |           \
        FATTR4_MAXWRITE_MASK |          \
        FATTR4_MODE_MASK |              \
        FATTR4_NO_TRUNC_MASK |          \
        FATTR4_NUMLINKS_MASK |          \
        FATTR4_OWNER_MASK |             \
        FATTR4_OWNER_GROUP_MASK |       \
        FATTR4_RAWDEV_MASK |            \
        FATTR4_SPACE_AVAIL_MASK |       \
        FATTR4_SPACE_FREE_MASK |        \
        FATTR4_SPACE_TOTAL_MASK |       \
        FATTR4_SPACE_USED_MASK |        \
        FATTR4_TIME_ACCESS_MASK |       \
        FATTR4_TIME_DELTA_MASK |        \
        FATTR4_TIME_METADATA_MASK |     \
        FATTR4_TIME_MODIFY_MASK |       \
        FATTR4_MOUNTED_ON_FILEID_MASK   \
)

/* nfsv4.1  */
#define RFS4_SUPPATTR_EXCLCREAT (               \
        FATTR4_SIZE_MASK                |       \
        FATTR4_MODE_MASK                |       \
        FATTR4_ACL_MASK                 |       \
        FATTR4_OWNER_MASK               |       \
        FATTR4_OWNER_GROUP_MASK         |       \
        FATTR4_TIME_ACCESS_SET_MASK)

#define FATTR4_FSID_EQ(a, b)    \
        ((a)->major == (b)->major && (a)->minor == (b)->minor)

#define NFS4_MAXNUM_BITWORDS    2
#define NFS4_MAXNUM_ATTRS       57

union nfs4_attr_u {
        fattr4_supported_attrs          supported_attrs;
        fattr4_type                     type;
        fattr4_fh_expire_type           fh_expire_type;
        fattr4_change                   change;
        fattr4_size                     size;
        fattr4_link_support             link_support;
        fattr4_symlink_support          symlink_support;
        fattr4_named_attr               named_attr;
        fattr4_fsid                     fsid;
        fattr4_unique_handles           unique_handles;
        fattr4_lease_time               lease_time;
        fattr4_rdattr_error             rdattr_error;
        fattr4_acl                      acl;
        fattr4_aclsupport               aclsupport;
        fattr4_archive                  archive;
        fattr4_cansettime               cansettime;
        fattr4_case_insensitive         case_insensitive;
        fattr4_case_preserving          case_preserving;
        fattr4_chown_restricted         chown_restricted;
        fattr4_fileid                   fileid;
        fattr4_files_avail              files_avail;
        fattr4_filehandle               filehandle;
        fattr4_files_free               files_free;
        fattr4_files_total              files_total;
        fattr4_fs_locations             fs_locations;
        fattr4_hidden                   hidden;
        fattr4_homogeneous              homogeneous;
        fattr4_maxfilesize              maxfilesize;
        fattr4_maxlink                  maxlink;
        fattr4_maxname                  maxname;
        fattr4_maxread                  maxread;
        fattr4_maxwrite                 maxwrite;
        fattr4_mimetype                 mimetype;
        fattr4_mode                     mode;
        fattr4_no_trunc                 no_trunc;
        fattr4_numlinks                 numlinks;
        fattr4_owner                    owner;
        fattr4_owner_group              owner_group;
        fattr4_quota_avail_hard         quota_avail_hard;
        fattr4_quota_avail_soft         quota_avail_soft;
        fattr4_quota_used               quota_used;
        fattr4_rawdev                   rawdev;
        fattr4_space_avail              space_avail;
        fattr4_space_free               space_free;
        fattr4_space_total              space_total;
        fattr4_space_used               space_used;
        fattr4_system                   system;
        fattr4_time_access              time_access;
        fattr4_time_access_set          time_access_set;
        fattr4_time_backup              time_backup;
        fattr4_time_create              time_create;
        fattr4_time_delta               time_delta;
        fattr4_time_metadata            time_metadata;
        fattr4_time_modify              time_modify;
        fattr4_time_modify_set          time_modify_set;
        fattr4_mounted_on_fileid        mounted_on_fileid;
        fattr4_suppattr_exclcreat       supp_exclcreat;
};

/*
 * Error details when processing the getattr response.
 */
#define NFS4_GETATTR_OP_OK              0
#define NFS4_GETATTR_STATUS_ERR         1
#define NFS4_GETATTR_MANDATTR_ERR       2
#define NFS4_GETATTR_BITMAP_ERR         3
#define NFS4_GETATTR_ATSIZE_ERR         4
#define NFS4_GETATTR_ATUID_ERR          5
#define NFS4_GETATTR_ATGID_ERR          6
#define NFS4_GETATTR_ATATIME_ERR        7
#define NFS4_GETATTR_ATMTIME_ERR        8
#define NFS4_GETATTR_ATCTIME_ERR        9
#define NFS4_GETATTR_RAWDEV_ERR         10
#define NFS4_GETATTR_ATNBLOCK_ERR       11
#define NFS4_GETATTR_MAXFILESIZE_ERR    12
#define NFS4_GETATTR_FHANDLE_ERR        13
#define NFS4_GETATTR_MAXREAD_ERR        14
#define NFS4_GETATTR_MAXWRITE_ERR       15
#define NFS4_GETATTR_NOCACHE_OK         16

typedef struct nfs4_pathconf_info {
        unsigned pc4_cache_valid:1;     /* When in rnode4, is data valid? */
        unsigned pc4_no_trunc:1;
        unsigned pc4_chown_restricted:1;
        unsigned pc4_case_insensitive:1;
        unsigned pc4_case_preserving:1;
        unsigned pc4_xattr_valid:1;
        unsigned pc4_xattr_exists:1;
        unsigned pc4_link_support:1;
        unsigned pc4_symlink_support:1;
        unsigned pc4_unique_handles:1;
        unsigned pc4_cansettime:1;
        unsigned pc4_homogeneous:1;
        uint_t  pc4_link_max;
        uint_t  pc4_name_max;
        uint_t  pc4_filesizebits;
} nfs4_pathconf_info_t;

/*
 * Used for client only to process incoming getattr results.
 */
typedef struct nfs4_ga_ext_res {
        bitmap4                         n4g_suppattrs;
        nfsstat4                        n4g_rdattr_error;
        fattr4_fh_expire_type           n4g_fet;
        fattr4_lease_time               n4g_leasetime;
        uint64_t                        n4g_maxfilesize;
        uint64_t                        n4g_maxread;
        uint64_t                        n4g_maxwrite;
        nfstime4                        n4g_delta;
        nfs4_pathconf_info_t            n4g_pc4;
        struct statvfs64                n4g_sb;
        union {
                nfs_fh4 n4g_fh;
                struct {
                        uint_t len;
                        char *val;
                        char data[NFS4_FHSIZE];
                } nfs_fh4_alt;
        } n4g_fh_u;
        /*
         * Bitmask with valid fields being:
         * ACL4_SUPPORT_ALLOW_ACL
         * ACL4_SUPPORT_DENY_ACL
         * ACL4_SUPPORT_AUDIT_ACL
         * ACL4_SUPPORT_ALARM_ACL
         */
        fattr4_aclsupport               n4g_aclsupport;
        fattr4_fs_locations             n4g_fslocations;
} nfs4_ga_ext_res_t;

extern bitmap4 rfs4_supported_attrs;

#ifdef  __cplusplus
}
#endif

#endif /* _NFS4_ATTR_H */