Home | History | Annotate | Download | only in nfs
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 /*
     22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef _NFS4_ATTR_H
     27 #define	_NFS4_ATTR_H
     28 
     29 #ifdef _KERNEL
     30 #ifdef	__cplusplus
     31 extern "C" {
     32 #endif
     33 
     34 #include <nfs/nfs4_attrmap.h>
     35 
     36 /*
     37  * dword-relative bit offsets of bitmap words
     38  * bitmap word 0 is most significant word of dword0
     39  * bitmap word 1 is least significant word of dword0
     40  */
     41 #define	FATTR4_WORD0	32
     42 #define	FATTR4_WORD1	0
     43 #define	FATTR4_WORD2	FATTR4_WORD0
     44 #define	FATTR4_WORD3	FATTR4_WORD1
     45 
     46 #define	__dw_SUPPORTED_ATTRS	d.d0
     47 #define	__dw_TYPE		d.d0
     48 #define	__dw_FH_EXPIRE_TYPE	d.d0
     49 #define	__dw_CHANGE		d.d0
     50 #define	__dw_SIZE		d.d0
     51 #define	__dw_LINK_SUPPORT	d.d0
     52 #define	__dw_SYMLINK_SUPPORT	d.d0
     53 #define	__dw_NAMED_ATTR		d.d0
     54 #define	__dw_FSID		d.d0
     55 #define	__dw_UNIQUE_HANDLES	d.d0
     56 #define	__dw_LEASE_TIME		d.d0
     57 #define	__dw_RDATTR_ERROR	d.d0
     58 #define	__dw_FILEHANDLE		d.d0
     59 #define	__dw_ACL		d.d0
     60 #define	__dw_ACLSUPPORT		d.d0
     61 #define	__dw_ARCHIVE		d.d0
     62 #define	__dw_CANSETTIME		d.d0
     63 #define	__dw_CASE_INSENSITIVE	d.d0
     64 #define	__dw_CASE_PRESERVING	d.d0
     65 #define	__dw_CHOWN_RESTRICTED	d.d0
     66 #define	__dw_FILEID		d.d0
     67 #define	__dw_FILES_AVAIL	d.d0
     68 #define	__dw_FILES_FREE		d.d0
     69 #define	__dw_FILES_TOTAL	d.d0
     70 #define	__dw_FS_LOCATIONS	d.d0
     71 #define	__dw_HIDDEN		d.d0
     72 #define	__dw_HOMOGENEOUS	d.d0
     73 #define	__dw_MAXFILESIZE	d.d0
     74 #define	__dw_MAXLINK		d.d0
     75 #define	__dw_MAXNAME		d.d0
     76 #define	__dw_MAXREAD		d.d0
     77 #define	__dw_MAXWRITE		d.d0
     78 #define	__dw_MIMETYPE		d.d0
     79 #define	__dw_MODE		d.d0
     80 #define	__dw_NO_TRUNC		d.d0
     81 #define	__dw_NUMLINKS		d.d0
     82 #define	__dw_OWNER		d.d0
     83 #define	__dw_OWNER_GROUP	d.d0
     84 #define	__dw_QUOTA_AVAIL_HARD	d.d0
     85 #define	__dw_QUOTA_AVAIL_SOFT	d.d0
     86 #define	__dw_QUOTA_USED		d.d0
     87 #define	__dw_RAWDEV		d.d0
     88 #define	__dw_SPACE_AVAIL	d.d0
     89 #define	__dw_SPACE_FREE		d.d0
     90 #define	__dw_SPACE_TOTAL	d.d0
     91 #define	__dw_SPACE_USED		d.d0
     92 #define	__dw_SYSTEM		d.d0
     93 #define	__dw_TIME_ACCESS	d.d0
     94 #define	__dw_TIME_ACCESS_SET	d.d0
     95 #define	__dw_TIME_BACKUP	d.d0
     96 #define	__dw_TIME_CREATE	d.d0
     97 #define	__dw_TIME_DELTA		d.d0
     98 #define	__dw_TIME_METADATA	d.d0
     99 #define	__dw_TIME_MODIFY	d.d0
    100 #define	__dw_TIME_MODIFY_SET	d.d0
    101 #define	__dw_MOUNTED_ON_FILEID	d.d0
    102 #define	__dw_DIR_NOTIF_DELAY	d.d0
    103 #define	__dw_DIRENT_NOTIF_DELAY	d.d0
    104 #define	__dw_DACL		d.d0
    105 #define	__dw_SACL		d.d0
    106 #define	__dw_CHANGE_POLICY	d.d0
    107 #define	__dw_FS_STATUS		d.d0
    108 #define	__dw_FS_LAYOUT_TYPE	d.d0
    109 #define	__dw_LAYOUT_HINT	d.d0
    110 
    111 #define	__dw_LAYOUT_TYPE	d.d1
    112 #define	__dw_LAYOUT_BLKSIZE	d.d1
    113 #define	__dw_LAYOUT_ALIGNMENT	d.d1
    114 #define	__dw_FS_LOCATIONS_INFO	d.d1
    115 #define	__dw_MDSTHRESHOLD	d.d1
    116 #define	__dw_RETENTION_GET	d.d1
    117 #define	__dw_RETENTION_SET	d.d1
    118 #define	__dw_RETENTEVT_GET	d.d1
    119 #define	__dw_RETENTEVT_SET	d.d1
    120 #define	__dw_RETENTION_HOLD	d.d1
    121 #define	__dw_MODE_SET_MASKED	d.d1
    122 #define	__dw_SUPPATTR_EXCLCREAT	d.d1
    123 #define	__dw_FS_CHARSET_CAP	d.d1
    124 
    125 /*
    126  * Attributes
    127  */
    128 #define	FATTR4_SUPPORTED_ATTRS_MASK	(1ULL << (FATTR4_WORD0 + 0))
    129 #define	FATTR4_TYPE_MASK		(1ULL << (FATTR4_WORD0 + 1))
    130 #define	FATTR4_FH_EXPIRE_TYPE_MASK	(1ULL << (FATTR4_WORD0 + 2))
    131 #define	FATTR4_CHANGE_MASK		(1ULL << (FATTR4_WORD0 + 3))
    132 #define	FATTR4_SIZE_MASK		(1ULL << (FATTR4_WORD0 + 4))
    133 #define	FATTR4_LINK_SUPPORT_MASK	(1ULL << (FATTR4_WORD0 + 5))
    134 #define	FATTR4_SYMLINK_SUPPORT_MASK	(1ULL << (FATTR4_WORD0 + 6))
    135 #define	FATTR4_NAMED_ATTR_MASK		(1ULL << (FATTR4_WORD0 + 7))
    136 #define	FATTR4_FSID_MASK		(1ULL << (FATTR4_WORD0 + 8))
    137 #define	FATTR4_UNIQUE_HANDLES_MASK	(1ULL << (FATTR4_WORD0 + 9))
    138 #define	FATTR4_LEASE_TIME_MASK		(1ULL << (FATTR4_WORD0 + 10))
    139 #define	FATTR4_RDATTR_ERROR_MASK	(1ULL << (FATTR4_WORD0 + 11))
    140 #define	FATTR4_ACL_MASK			(1ULL << (FATTR4_WORD0 + 12))
    141 #define	FATTR4_ACLSUPPORT_MASK		(1ULL << (FATTR4_WORD0 + 13))
    142 #define	FATTR4_ARCHIVE_MASK		(1ULL << (FATTR4_WORD0 + 14))
    143 #define	FATTR4_CANSETTIME_MASK		(1ULL << (FATTR4_WORD0 + 15))
    144 #define	FATTR4_CASE_INSENSITIVE_MASK	(1ULL << (FATTR4_WORD0 + 16))
    145 #define	FATTR4_CASE_PRESERVING_MASK	(1ULL << (FATTR4_WORD0 + 17))
    146 #define	FATTR4_CHOWN_RESTRICTED_MASK	(1ULL << (FATTR4_WORD0 + 18))
    147 #define	FATTR4_FILEHANDLE_MASK		(1ULL << (FATTR4_WORD0 + 19))
    148 #define	FATTR4_FILEID_MASK		(1ULL << (FATTR4_WORD0 + 20))
    149 #define	FATTR4_FILES_AVAIL_MASK		(1ULL << (FATTR4_WORD0 + 21))
    150 #define	FATTR4_FILES_FREE_MASK		(1ULL << (FATTR4_WORD0 + 22))
    151 #define	FATTR4_FILES_TOTAL_MASK		(1ULL << (FATTR4_WORD0 + 23))
    152 #define	FATTR4_FS_LOCATIONS_MASK	(1ULL << (FATTR4_WORD0 + 24))
    153 #define	FATTR4_HIDDEN_MASK		(1ULL << (FATTR4_WORD0 + 25))
    154 #define	FATTR4_HOMOGENEOUS_MASK		(1ULL << (FATTR4_WORD0 + 26))
    155 #define	FATTR4_MAXFILESIZE_MASK		(1ULL << (FATTR4_WORD0 + 27))
    156 #define	FATTR4_MAXLINK_MASK		(1ULL << (FATTR4_WORD0 + 28))
    157 #define	FATTR4_MAXNAME_MASK		(1ULL << (FATTR4_WORD0 + 29))
    158 #define	FATTR4_MAXREAD_MASK		(1ULL << (FATTR4_WORD0 + 30))
    159 #define	FATTR4_MAXWRITE_MASK		(1ULL << (FATTR4_WORD0 + 31))
    160 
    161 #define	FATTR4_MIMETYPE_MASK		(1ULL << (FATTR4_WORD1 + 0))
    162 #define	FATTR4_MODE_MASK		(1ULL << (FATTR4_WORD1 + 1))
    163 #define	FATTR4_NO_TRUNC_MASK		(1ULL << (FATTR4_WORD1 + 2))
    164 #define	FATTR4_NUMLINKS_MASK		(1ULL << (FATTR4_WORD1 + 3))
    165 #define	FATTR4_OWNER_MASK		(1ULL << (FATTR4_WORD1 + 4))
    166 #define	FATTR4_OWNER_GROUP_MASK		(1ULL << (FATTR4_WORD1 + 5))
    167 #define	FATTR4_QUOTA_AVAIL_HARD_MASK	(1ULL << (FATTR4_WORD1 + 6))
    168 #define	FATTR4_QUOTA_AVAIL_SOFT_MASK	(1ULL << (FATTR4_WORD1 + 7))
    169 #define	FATTR4_QUOTA_USED_MASK		(1ULL << (FATTR4_WORD1 + 8))
    170 #define	FATTR4_RAWDEV_MASK		(1ULL << (FATTR4_WORD1 + 9))
    171 #define	FATTR4_SPACE_AVAIL_MASK		(1ULL << (FATTR4_WORD1 + 10))
    172 #define	FATTR4_SPACE_FREE_MASK		(1ULL << (FATTR4_WORD1 + 11))
    173 #define	FATTR4_SPACE_TOTAL_MASK		(1ULL << (FATTR4_WORD1 + 12))
    174 #define	FATTR4_SPACE_USED_MASK		(1ULL << (FATTR4_WORD1 + 13))
    175 #define	FATTR4_SYSTEM_MASK		(1ULL << (FATTR4_WORD1 + 14))
    176 #define	FATTR4_TIME_ACCESS_MASK		(1ULL << (FATTR4_WORD1 + 15))
    177 #define	FATTR4_TIME_ACCESS_SET_MASK	(1ULL << (FATTR4_WORD1 + 16))
    178 #define	FATTR4_TIME_BACKUP_MASK		(1ULL << (FATTR4_WORD1 + 17))
    179 #define	FATTR4_TIME_CREATE_MASK		(1ULL << (FATTR4_WORD1 + 18))
    180 #define	FATTR4_TIME_DELTA_MASK		(1ULL << (FATTR4_WORD1 + 19))
    181 #define	FATTR4_TIME_METADATA_MASK	(1ULL << (FATTR4_WORD1 + 20))
    182 #define	FATTR4_TIME_MODIFY_MASK		(1ULL << (FATTR4_WORD1 + 21))
    183 #define	FATTR4_TIME_MODIFY_SET_MASK	(1ULL << (FATTR4_WORD1 + 22))
    184 #define	FATTR4_MOUNTED_ON_FILEID_MASK	(1ULL << (FATTR4_WORD1 + 23))
    185 #define	FATTR4_DIR_NOTIF_DELAY_MASK	(1ULL << (FATTR4_WORD1 + 24))
    186 #define	FATTR4_DIRENT_NOTIF_DELAY_MASK	(1ULL << (FATTR4_WORD1 + 25))
    187 #define	FATTR4_DACL_MASK		(1ULL << (FATTR4_WORD1 + 26))
    188 #define	FATTR4_SACL_MASK		(1ULL << (FATTR4_WORD1 + 27))
    189 #define	FATTR4_CHANGE_POLICY_MASK	(1ULL << (FATTR4_WORD1 + 28))
    190 #define	FATTR4_FS_STATUS_MASK		(1ULL << (FATTR4_WORD1 + 29))
    191 #define	FATTR4_FS_LAYOUT_TYPE_MASK	(1ULL << (FATTR4_WORD1 + 30))
    192 #define	FATTR4_LAYOUT_HINT_MASK		(1ULL << (FATTR4_WORD1 + 31))
    193 
    194 #define	FATTR4_LAYOUT_TYPE_MASK		(1ULL << (FATTR4_WORD2 + 0))
    195 #define	FATTR4_LAYOUT_BLKSIZE_MASK	(1ULL << (FATTR4_WORD2 + 1))
    196 #define	FATTR4_LAYOUT_ALIGNMENT_MASK	(1ULL << (FATTR4_WORD2 + 2))
    197 #define	FATTR4_FS_LOCATIONS_INFO_MASK	(1ULL << (FATTR4_WORD2 + 3))
    198 #define	FATTR4_MDSTHRESHOLD_MASK	(1ULL << (FATTR4_WORD2 + 4))
    199 #define	FATTR4_RETENTION_GET_MASK	(1ULL << (FATTR4_WORD2 + 5))
    200 #define	FATTR4_RETENTION_SET_MASK	(1ULL << (FATTR4_WORD2 + 6))
    201 #define	FATTR4_RETENTEVT_GET_MASK	(1ULL << (FATTR4_WORD2 + 7))
    202 #define	FATTR4_RETENTEVT_SET_MASK	(1ULL << (FATTR4_WORD2 + 8))
    203 #define	FATTR4_RETENTION_HOLD_MASK	(1ULL << (FATTR4_WORD2 + 9))
    204 #define	FATTR4_MODE_SET_MASKED_MASK	(1ULL << (FATTR4_WORD2 + 10))
    205 #define	FATTR4_SUPPATTR_EXCLCREAT_MASK	(1ULL << (FATTR4_WORD2 + 11))
    206 #define	FATTR4_FS_CHARSET_CAP_MASK	(1ULL << (FATTR4_WORD2 + 12))
    207 #define	FATTR4_77_MASK			(1ULL << (FATTR4_WORD2 + 13))
    208 #define	FATTR4_78_MASK			(1ULL << (FATTR4_WORD2 + 14))
    209 #define	FATTR4_79_MASK			(1ULL << (FATTR4_WORD2 + 15))
    210 #define	FATTR4_80_MASK			(1ULL << (FATTR4_WORD2 + 16))
    211 #define	FATTR4_81_MASK			(1ULL << (FATTR4_WORD2 + 17))
    212 #define	FATTR4_82_MASK			(1ULL << (FATTR4_WORD2 + 18))
    213 #define	FATTR4_83_MASK			(1ULL << (FATTR4_WORD2 + 19))
    214 #define	FATTR4_84_MASK			(1ULL << (FATTR4_WORD2 + 20))
    215 #define	FATTR4_85_MASK			(1ULL << (FATTR4_WORD2 + 21))
    216 #define	FATTR4_86_MASK			(1ULL << (FATTR4_WORD2 + 22))
    217 #define	FATTR4_87_MASK			(1ULL << (FATTR4_WORD2 + 23))
    218 #define	FATTR4_88_MASK			(1ULL << (FATTR4_WORD2 + 24))
    219 #define	FATTR4_89_MASK			(1ULL << (FATTR4_WORD2 + 25))
    220 #define	FATTR4_90_MASK			(1ULL << (FATTR4_WORD2 + 26))
    221 #define	FATTR4_91_MASK			(1ULL << (FATTR4_WORD2 + 27))
    222 #define	FATTR4_92_MASK			(1ULL << (FATTR4_WORD2 + 28))
    223 #define	FATTR4_93_MASK			(1ULL << (FATTR4_WORD2 + 29))
    224 #define	FATTR4_94_MASK			(1ULL << (FATTR4_WORD2 + 30))
    225 #define	FATTR4_95_MASK			(1ULL << (FATTR4_WORD2 + 31))
    226 
    227 #define	FATTR4_96_MASK	(1ULL << (FATTR4_WORD3 + 0))
    228 #define	FATTR4_97_MASK	(1ULL << (FATTR4_WORD3 + 1))
    229 #define	FATTR4_98_MASK	(1ULL << (FATTR4_WORD3 + 2))
    230 #define	FATTR4_99_MASK	(1ULL << (FATTR4_WORD3 + 3))
    231 #define	FATTR4_100_MASK	(1ULL << (FATTR4_WORD3 + 4))
    232 #define	FATTR4_101_MASK	(1ULL << (FATTR4_WORD3 + 5))
    233 #define	FATTR4_102_MASK	(1ULL << (FATTR4_WORD3 + 6))
    234 #define	FATTR4_103_MASK	(1ULL << (FATTR4_WORD3 + 7))
    235 #define	FATTR4_104_MASK	(1ULL << (FATTR4_WORD3 + 8))
    236 #define	FATTR4_105_MASK	(1ULL << (FATTR4_WORD3 + 9))
    237 #define	FATTR4_106_MASK	(1ULL << (FATTR4_WORD3 + 10))
    238 #define	FATTR4_107_MASK	(1ULL << (FATTR4_WORD3 + 11))
    239 #define	FATTR4_108_MASK	(1ULL << (FATTR4_WORD3 + 12))
    240 #define	FATTR4_109_MASK	(1ULL << (FATTR4_WORD3 + 13))
    241 #define	FATTR4_110_MASK	(1ULL << (FATTR4_WORD3 + 14))
    242 #define	FATTR4_111_MASK	(1ULL << (FATTR4_WORD3 + 15))
    243 #define	FATTR4_112_MASK	(1ULL << (FATTR4_WORD3 + 16))
    244 #define	FATTR4_113_MASK	(1ULL << (FATTR4_WORD3 + 17))
    245 #define	FATTR4_114_MASK	(1ULL << (FATTR4_WORD3 + 18))
    246 #define	FATTR4_115_MASK	(1ULL << (FATTR4_WORD3 + 19))
    247 #define	FATTR4_116_MASK	(1ULL << (FATTR4_WORD3 + 20))
    248 #define	FATTR4_117_MASK	(1ULL << (FATTR4_WORD3 + 21))
    249 #define	FATTR4_118_MASK	(1ULL << (FATTR4_WORD3 + 22))
    250 #define	FATTR4_119_MASK	(1ULL << (FATTR4_WORD3 + 23))
    251 #define	FATTR4_120_MASK	(1ULL << (FATTR4_WORD3 + 24))
    252 #define	FATTR4_121_MASK	(1ULL << (FATTR4_WORD3 + 25))
    253 #define	FATTR4_122_MASK	(1ULL << (FATTR4_WORD3 + 26))
    254 #define	FATTR4_123_MASK	(1ULL << (FATTR4_WORD3 + 27))
    255 #define	FATTR4_124_MASK	(1ULL << (FATTR4_WORD3 + 28))
    256 #define	FATTR4_125_MASK	(1ULL << (FATTR4_WORD3 + 29))
    257 #define	FATTR4_126_MASK	(1ULL << (FATTR4_WORD3 + 30))
    258 #define	FATTR4_127_MASK	(1ULL << (FATTR4_WORD3 + 31))
    259 
    260 /*
    261  * NFS4 attrs which map directly to vattr_t attrs
    262  */
    263 #define	NFS4_VATTR_MASK (		\
    264 	FATTR4_TYPE_MASK |		\
    265 	FATTR4_CHANGE_MASK |		\
    266 	FATTR4_SIZE_MASK |		\
    267 	FATTR4_FSID_MASK |		\
    268 	FATTR4_FILEID_MASK |		\
    269 	FATTR4_MODE_MASK |		\
    270 	FATTR4_OWNER_MASK |		\
    271 	FATTR4_OWNER_GROUP_MASK |	\
    272 	FATTR4_NUMLINKS_MASK |		\
    273 	FATTR4_TIME_ACCESS_MASK |	\
    274 	FATTR4_TIME_MODIFY_MASK |	\
    275 	FATTR4_TIME_METADATA_MASK |	\
    276 	FATTR4_RAWDEV_MASK |		\
    277 	FATTR4_SPACE_USED_MASK |	\
    278 	FATTR4_MOUNTED_ON_FILEID_MASK)
    279 
    280 #define	NFS4_NTOV_ATTR_MASK NFS4_VATTR_MASK
    281 
    282 /*
    283  * NFS4 attrs requested by default.
    284  *
    285  * DEBUG: The pNFS attrs are included in the default
    286  * NFS41 set for now just to exercise the new attr code.
    287  * It doesn't cause misbehavior to request the pNFS attrs
    288  * if the server does not support them; however, it would
    289  * be better to stop requesting pnfs attrs from servers
    290  * and that don't support pNFS.
    291  */
    292 #define	NFS41_DEFAULT_MASK0	NFS4_VATTR_MASK
    293 
    294 #define	NFS41_DEFAULT_MASK1 (		\
    295 	FATTR4_LAYOUT_TYPE_MASK |	\
    296 	FATTR4_LAYOUT_BLKSIZE_MASK |	\
    297 	FATTR4_LAYOUT_ALIGNMENT_MASK |	\
    298 	FATTR4_MDSTHRESHOLD_MASK)
    299 
    300 #define	NFS4_PATHCONF_MASK (		\
    301 	NFS4_VATTR_MASK |		\
    302 	FATTR4_NO_TRUNC_MASK |		\
    303 	FATTR4_CHOWN_RESTRICTED_MASK |	\
    304 	FATTR4_CASE_INSENSITIVE_MASK |	\
    305 	FATTR4_CASE_PRESERVING_MASK |	\
    306 	FATTR4_NAMED_ATTR_MASK |	\
    307 	FATTR4_LINK_SUPPORT_MASK |	\
    308 	FATTR4_SYMLINK_SUPPORT_MASK |	\
    309 	FATTR4_UNIQUE_HANDLES_MASK |	\
    310 	FATTR4_CANSETTIME_MASK |	\
    311 	FATTR4_HOMOGENEOUS_MASK |	\
    312 	FATTR4_MAXLINK_MASK |		\
    313 	FATTR4_MAXNAME_MASK |		\
    314 	FATTR4_MAXFILESIZE_MASK)
    315 
    316 /*
    317  * The corresponding AT_MASK
    318  */
    319 #define	NFS4_NTOV_ATTR_AT_MASK (	\
    320 	AT_TYPE |			\
    321 	AT_SIZE |			\
    322 	AT_FSID |			\
    323 	AT_NODEID |			\
    324 	AT_MODE |			\
    325 	AT_UID |			\
    326 	AT_GID |			\
    327 	AT_NLINK |			\
    328 	AT_ATIME |			\
    329 	AT_MTIME |			\
    330 	AT_CTIME |			\
    331 	AT_RDEV |			\
    332 	AT_NBLOCKS)
    333 
    334 /*
    335  * Common bitmap4 of filesystem attributes to be gathered
    336  */
    337 #define	NFS4_FS_ATTR_MASK (		\
    338 	FATTR4_FILES_AVAIL_MASK |	\
    339 	FATTR4_FILES_FREE_MASK |	\
    340 	FATTR4_FILES_TOTAL_MASK |	\
    341 	FATTR4_SPACE_AVAIL_MASK |	\
    342 	FATTR4_SPACE_FREE_MASK |	\
    343 	FATTR4_SPACE_TOTAL_MASK)
    344 
    345 #define	NFS4_STATFS_ATTR_MASK (		\
    346 	NFS4_FS_ATTR_MASK |		\
    347 	FATTR4_MAXNAME_MASK)
    348 
    349 /*
    350  * The corresponding AT_MASK
    351  */
    352 #define	NFS4_FS_ATTR_AT_MASK	0
    353 
    354 /*
    355  * Common bitmap4 to gather attr cache state
    356  */
    357 #define	NFS4_NTOV_ATTR_CACHE_MASK (	\
    358 	FATTR4_TIME_METADATA_MASK |	\
    359 	FATTR4_TIME_MODIFY_MASK |	\
    360 	FATTR4_SIZE_MASK)
    361 
    362 /*
    363  * The corresponding AT_MASK
    364  */
    365 #define	NFS4_NTOV_ATTR_CACHE_AT_MASK (	\
    366 	AT_CTIME |			\
    367 	AT_MTIME |			\
    368 	AT_SIZE)
    369 
    370 #define	NFS4_VTON_ATTR_MASK (		\
    371 	AT_TYPE |			\
    372 	AT_MODE |			\
    373 	AT_UID |			\
    374 	AT_GID |			\
    375 	AT_NODEID |			\
    376 	AT_SIZE |			\
    377 	AT_NLINK |			\
    378 	AT_ATIME |			\
    379 	AT_MTIME |			\
    380 	AT_CTIME |			\
    381 	AT_RDEV |			\
    382 	AT_NBLOCKS |			\
    383 	AT_FSID)
    384 
    385 #define	NFS4_VTON_ATTR_MASK_SET (	\
    386 	AT_MODE |			\
    387 	AT_UID |			\
    388 	AT_GID |			\
    389 	AT_SIZE |			\
    390 	AT_ATIME |			\
    391 	AT_MTIME)
    392 
    393 #define	FATTR4_MANDATTR_MASK0 (		\
    394 	FATTR4_SUPPORTED_ATTRS_MASK |	\
    395 	FATTR4_TYPE_MASK |		\
    396 	FATTR4_FH_EXPIRE_TYPE_MASK |	\
    397 	FATTR4_CHANGE_MASK |		\
    398 	FATTR4_SIZE_MASK |		\
    399 	FATTR4_LINK_SUPPORT_MASK |	\
    400 	FATTR4_SYMLINK_SUPPORT_MASK |	\
    401 	FATTR4_NAMED_ATTR_MASK |	\
    402 	FATTR4_FSID_MASK |		\
    403 	FATTR4_UNIQUE_HANDLES_MASK |	\
    404 	FATTR4_LEASE_TIME_MASK |	\
    405 	FATTR4_RDATTR_ERROR_MASK |	\
    406 	FATTR4_FILEHANDLE_MASK)
    407 
    408 #define	NFS4_FSINFO_MASK (		\
    409 	FATTR4_SUPPORTED_ATTRS_MASK |	\
    410 	FATTR4_TYPE_MASK |		\
    411 	FATTR4_FH_EXPIRE_TYPE_MASK |	\
    412 	FATTR4_LINK_SUPPORT_MASK |	\
    413 	FATTR4_SYMLINK_SUPPORT_MASK |	\
    414 	FATTR4_FSID_MASK |		\
    415 	FATTR4_MAXFILESIZE_MASK |	\
    416 	FATTR4_MAXREAD_MASK |		\
    417 	FATTR4_MAXWRITE_MASK)
    418 
    419 #define	NFS41_FSINFO_MASK0 (		\
    420 	NFS4_FSINFO_MASK |		\
    421 	FATTR4_FS_LAYOUT_TYPE_MASK)
    422 
    423 #define	NFS41_FSINFO_MASK1	FATTR4_SUPPATTR_EXCLCREAT_MASK
    424 
    425 /*
    426  * default layout alignment / blksizes for now
    427  */
    428 #define	RFS41_DEFAULT_LAYOUT_ALIGNMENT  8192
    429 #define	RFS41_DEFAULT_LAYOUT_BLKSIZE    131072
    430 #define	NFS41_DEFAULT_LAYOUT_STRIPELEN	131072
    431 #define	NFS41_DEFAULT_LAYOUT_NUMSTRIPE	2
    432 
    433 enum attrvers {
    434 	AV_NFS40 = 0,
    435 	AV_NFS41,
    436 	AV_COUNT
    437 };
    438 typedef enum attrvers attrvers_t;
    439 
    440 #define	NFS4_ATTR_COUNT(avers)	\
    441 	((avers) == AV_NFS40 ? NFS40_ATTR_COUNT : NFS41_ATTR_COUNT)
    442 
    443 #define	NFS4_NTOV_MAP_SIZE(avers)	NFS4_ATTR_COUNT(avers)
    444 
    445 #define	NFS4_NTOV_MAP(avers)	\
    446 	((avers) == AV_NFS40 ? nfs40_ntov_map : nfs41_ntov_map)
    447 
    448 extern attrmap4 nfs4_empty_attrmap;
    449 extern attrmap4 nfs4_pathconf_attrmap;
    450 extern attrmap4 nfs4_vattr_attrmap;
    451 extern attrmap4 nfs4_statfs_attrmap;
    452 extern attrmap4 nfs4_extres_attrmap;
    453 extern attrmap4 nfs4_minrddir_attrmap;
    454 extern attrmap4 rfs41_supp_exclcreat_attrmap;
    455 extern attrmap4 nfs4_attrcache_attrmap;
    456 extern attrmap4 nfs4_leasetime_attrmap;
    457 extern attrmap4 rfs4_fsspace_attrmap;
    458 
    459 /*
    460  * These macros take and ignore vers just for consistency.
    461  * attr vers 0 and vers 1 contain the same bits.
    462  */
    463 #define	NFS4_EMPTY_ATTRMAP(vers)	nfs4_empty_attrmap
    464 #define	NFS4_PATHCONF_ATTRMAP(vers)	nfs4_pathconf_attrmap
    465 #define	NFS4_VATTR_ATTRMAP(vers)	nfs4_vattr_attrmap
    466 #define	NFS4_STATFS_ATTRMAP(vers)	nfs4_statfs_attrmap
    467 #define	NFS4_EXTRES_ATTRMAP(vers)	nfs4_extres_attrmap
    468 #define	NFS4_MINRDDIR_ATTRMAP(vers)	nfs4_minrddir_attrmap
    469 #define	RFS41_EXCLCREAT_ATTRMAP(vers)	rfs41_supp_exclcreat_attrmap
    470 #define	NFS4_ATTRCACHE_ATTRMAP(vers)	nfs4_attrcache_attrmap
    471 #define	NFS4_LEASETIME_ATTRMAP(vers)	nfs4_leasetime_attrmap
    472 #define	RFS4_FS_SPACE_ATTRMAP(vers)	rfs4_fsspace_attrmap
    473 
    474 #define	MI4_ATTRVERS(m)			((m)->mi_attrvers)
    475 #define	MI4_EMPTY_ATTRMAP(m)		NFS4_EMPTY_ATTRMAP(MI4_ATTRVERS(m))
    476 #define	MI4_PATHCONF_ATTRMAP(m)		NFS4_PATHCONF_ATTRMAP(MI4_ATTRVERS(m))
    477 #define	MI4_VATTR_ATTRMAP(m)		NFS4_VATTR_ATTRMAP(MI4_ATTRVERS(m))
    478 #define	MI4_STATFS_ATTRMAP(m)		NFS4_STATFS_ATTRMAP(MI4_ATTRVERS(m))
    479 #define	MI4_EXTRES_ATTRMAP(m)		NFS4_EXTRES_ATTRMAP(MI4_ATTRVERS(m))
    480 #define	MI4_MINRDDIR_ATTRMAP(m)		NFS4_MINRDDIR_ATTRMAP(MI4_ATTRVERS(m))
    481 #define	MI4_ATTRCACHE_ATTRMAP(m)	NFS4_ATTRCACHE_ATTRMAP(MI4_ATTRVERS(m))
    482 #define	MI4_LEASETIME_ATTRMAP(m)	NFS4_LEASETIME_ATTRMAP(MI4_ATTRVERS(m))
    483 
    484 extern attrmap4 nfs4_default_attrmap[];
    485 extern attrmap4 nfs4_fsinfo_attrmap[];
    486 extern attrmap4 nfs4_mandatory_attrmap[];
    487 extern attrmap4 nfs4_rddir_attrmap[];
    488 extern attrmap4 rfs4_supp_attrmap[];
    489 extern attrmap4 rfs4_rddir_supp_attrmap[];
    490 
    491 #define	NFS4_DEFAULT_ATTRMAP(vers)	nfs4_default_attrmap[vers]
    492 #define	NFS4_FSINFO_ATTRMAP(vers)	nfs4_fsinfo_attrmap[vers]
    493 #define	NFS4_MAND_ATTRMAP(vers)		nfs4_mandatory_attrmap[vers]
    494 #define	NFS4_RDDIR_ATTRMAP(vers)	nfs4_rddir_attrmap[vers]
    495 #define	RFS4_SUPP_ATTRMAP(vers)		rfs4_supp_attrmap[vers]
    496 #define	RFS4_RDDIR_SUPP_ATTRMAP(vers)	rfs4_rddir_supp_attrmap[vers]
    497 
    498 #define	MI4_DEFAULT_ATTRMAP(m)		NFS4_DEFAULT_ATTRMAP(MI4_ATTRVERS(m))
    499 #define	MI4_FSINFO_ATTRMAP(m)		NFS4_FSINFO_ATTRMAP(MI4_ATTRVERS(m))
    500 #define	MI4_MAND_ATTRMAP(m)		NFS4_MAND_ATTRMAP(MI4_ATTRVERS(m))
    501 #define	MI4_RDDIR_ATTRMAP(m)		NFS4_RDDIR_ATTRMAP(MI4_ATTRVERS(m))
    502 
    503 #define	NFS4_VPDFL_ATTRMAP(vp)		(MI4_DEFAULT_ATTRMAP(VTOMI4(vp)))
    504 
    505 /*
    506  * These are the support attributes for the NFSv4 server
    507  */
    508 #define	NFS4_SRV_RDDIR_SUPP_MASK (	\
    509 	FATTR4_SUPPORTED_ATTRS_MASK |	\
    510 	FATTR4_TYPE_MASK |		\
    511 	FATTR4_FH_EXPIRE_TYPE_MASK |	\
    512 	FATTR4_CHANGE_MASK |		\
    513 	FATTR4_SIZE_MASK |		\
    514 	FATTR4_LINK_SUPPORT_MASK |	\
    515 	FATTR4_SYMLINK_SUPPORT_MASK |	\
    516 	FATTR4_NAMED_ATTR_MASK |	\
    517 	FATTR4_FSID_MASK |		\
    518 	FATTR4_UNIQUE_HANDLES_MASK |	\
    519 	FATTR4_LEASE_TIME_MASK |	\
    520 	FATTR4_RDATTR_ERROR_MASK |	\
    521 	FATTR4_CANSETTIME_MASK |	\
    522 	FATTR4_CASE_INSENSITIVE_MASK |	\
    523 	FATTR4_CASE_PRESERVING_MASK |	\
    524 	FATTR4_CHOWN_RESTRICTED_MASK |	\
    525 	FATTR4_FILEHANDLE_MASK |	\
    526 	FATTR4_FILEID_MASK |		\
    527 	FATTR4_FILES_AVAIL_MASK |	\
    528 	FATTR4_FILES_FREE_MASK |	\
    529 	FATTR4_FILES_TOTAL_MASK |	\
    530 	FATTR4_HOMOGENEOUS_MASK |	\
    531 	FATTR4_MAXFILESIZE_MASK |	\
    532 	FATTR4_MAXLINK_MASK |		\
    533 	FATTR4_MAXNAME_MASK |		\
    534 	FATTR4_MAXREAD_MASK |		\
    535 	FATTR4_MAXWRITE_MASK |		\
    536 	FATTR4_MODE_MASK |		\
    537 	FATTR4_NO_TRUNC_MASK |		\
    538 	FATTR4_NUMLINKS_MASK |		\
    539 	FATTR4_OWNER_MASK |		\
    540 	FATTR4_OWNER_GROUP_MASK |	\
    541 	FATTR4_RAWDEV_MASK |		\
    542 	FATTR4_SPACE_AVAIL_MASK |	\
    543 	FATTR4_SPACE_FREE_MASK |	\
    544 	FATTR4_SPACE_TOTAL_MASK |	\
    545 	FATTR4_SPACE_USED_MASK |	\
    546 	FATTR4_TIME_ACCESS_MASK |	\
    547 	FATTR4_TIME_DELTA_MASK |	\
    548 	FATTR4_TIME_METADATA_MASK |	\
    549 	FATTR4_TIME_MODIFY_MASK |	\
    550 	FATTR4_MOUNTED_ON_FILEID_MASK	\
    551 )
    552 
    553 #define	NFS4_SRV_SUPP_MASK (		\
    554 	NFS4_SRV_RDDIR_SUPP_MASK |	\
    555 	FATTR4_ACL_MASK |		\
    556 	FATTR4_ACLSUPPORT_MASK |	\
    557 	FATTR4_TIME_ACCESS_SET_MASK |	\
    558 	FATTR4_TIME_MODIFY_SET_MASK	\
    559 )
    560 
    561 #define	NFS41_SRV_SUPP_MASK0 (		\
    562 	NFS4_SRV_SUPP_MASK |		\
    563 	FATTR4_FS_LAYOUT_TYPE_MASK |	\
    564 	FATTR4_LAYOUT_HINT_MASK		\
    565 )
    566 
    567 #define	NFS41_SRV_SUPP_MASK1 (		\
    568 	FATTR4_LAYOUT_TYPE_MASK |	\
    569 	FATTR4_LAYOUT_BLKSIZE_MASK |	\
    570 	FATTR4_LAYOUT_ALIGNMENT_MASK |	\
    571 	FATTR4_MDSTHRESHOLD_MASK |	\
    572 	FATTR4_SUPPATTR_EXCLCREAT_MASK	\
    573 )
    574 
    575 #define	NFS41_SRV_RDDIR_SUPP_MASK0 (	\
    576 	NFS4_SRV_RDDIR_SUPP_MASK |	\
    577 	NFS41_SRV_SUPP_MASK0		\
    578 )
    579 #define	NFS41_SRV_RDDIR_SUPP_MASK1 NFS41_SRV_SUPP_MASK1
    580 
    581 /*
    582  * other settable attrs
    583  * hidden
    584  * mimetype
    585  * archive
    586  * system
    587  * time_backup
    588  * time_create
    589  * dacl
    590  * sacl
    591  * retentevt_set
    592  * retention_set
    593  * retention_hold
    594  * mode_set_masked
    595  *
    596  * Note: time_modify_set not in mask because time_modify is the
    597  * verifier used to implement exclusive create
    598  */
    599 #define	NFS41_SRV_EXCLCREAT_ATTRS (		\
    600 	FATTR4_SIZE_MASK		|	\
    601 	FATTR4_MODE_MASK		|	\
    602 	FATTR4_ACL_MASK			|	\
    603 	FATTR4_OWNER_MASK		|	\
    604 	FATTR4_OWNER_GROUP_MASK		|	\
    605 	FATTR4_LAYOUT_HINT_MASK		|	\
    606 	FATTR4_TIME_ACCESS_SET_MASK)
    607 
    608 #define	FATTR4_FSID_EQ(a, b)					\
    609 	((a)->major == (b)->major && (a)->minor == (b)->minor)
    610 
    611 #define	NFS4_MAXNUM_BITWORDS	3
    612 #define	NFS4_MAXNUM_ATTRS	(FATTR4_FS_CHARSET_CAP + 1)
    613 
    614 
    615 union nfs4_attr_u {
    616 	attrmap4			supported_attrs;
    617 	fattr4_type			type;
    618 	fattr4_fh_expire_type		fh_expire_type;
    619 	fattr4_change			change;
    620 	fattr4_size			size;
    621 	fattr4_link_support		link_support;
    622 	fattr4_symlink_support		symlink_support;
    623 	fattr4_named_attr		named_attr;
    624 	fattr4_fsid			fsid;
    625 	fattr4_unique_handles		unique_handles;
    626 	fattr4_lease_time		lease_time;
    627 	fattr4_rdattr_error		rdattr_error;
    628 	fattr4_acl			acl;
    629 	fattr4_aclsupport		aclsupport;
    630 	fattr4_archive			archive;
    631 	fattr4_cansettime		cansettime;
    632 	fattr4_case_insensitive		case_insensitive;
    633 	fattr4_case_preserving		case_preserving;
    634 	fattr4_chown_restricted		chown_restricted;
    635 	fattr4_fileid			fileid;
    636 	fattr4_files_avail		files_avail;
    637 	fattr4_filehandle		filehandle;
    638 	fattr4_files_free		files_free;
    639 	fattr4_files_total		files_total;
    640 	fattr4_fs_locations		fs_locations;
    641 	fattr4_hidden			hidden;
    642 	fattr4_homogeneous		homogeneous;
    643 	fattr4_maxfilesize		maxfilesize;
    644 	fattr4_maxlink			maxlink;
    645 	fattr4_maxname			maxname;
    646 	fattr4_maxread			maxread;
    647 	fattr4_maxwrite			maxwrite;
    648 	fattr4_mimetype			mimetype;
    649 	fattr4_mode			mode;
    650 	fattr4_no_trunc			no_trunc;
    651 	fattr4_numlinks			numlinks;
    652 	fattr4_owner			owner;
    653 	fattr4_owner_group		owner_group;
    654 	fattr4_quota_avail_hard		quota_avail_hard;
    655 	fattr4_quota_avail_soft		quota_avail_soft;
    656 	fattr4_quota_used		quota_used;
    657 	fattr4_rawdev			rawdev;
    658 	fattr4_space_avail		space_avail;
    659 	fattr4_space_free		space_free;
    660 	fattr4_space_total		space_total;
    661 	fattr4_space_used		space_used;
    662 	fattr4_system			system;
    663 	fattr4_time_access		time_access;
    664 	fattr4_time_access_set		time_access_set;
    665 	fattr4_time_backup		time_backup;
    666 	fattr4_time_create		time_create;
    667 	fattr4_time_delta		time_delta;
    668 	fattr4_time_metadata		time_metadata;
    669 	fattr4_time_modify		time_modify;
    670 	fattr4_time_modify_set		time_modify_set;
    671 	fattr4_mounted_on_fileid	mounted_on_fileid;
    672 	layouttypes4_t			fs_layout_types;
    673 	file_layouthint4		file_layouthint;
    674 	layouttypes4_t			layout_types;
    675 	fattr4_layout_blksize		layout_blksize;
    676 	fattr4_layout_alignment		layout_alignment;
    677 	file_mdsthreshold4		file_mdsthreshold;
    678 	attrmap4			supp_exclcreat;
    679 };
    680 
    681 /*
    682  * Error details when processing the getattr response.
    683  */
    684 #define	NFS4_GETATTR_OP_OK		0
    685 #define	NFS4_GETATTR_STATUS_ERR		1
    686 #define	NFS4_GETATTR_MANDATTR_ERR	2
    687 #define	NFS4_GETATTR_BITMAP_ERR		3
    688 #define	NFS4_GETATTR_ATSIZE_ERR		4
    689 #define	NFS4_GETATTR_ATUID_ERR		5
    690 #define	NFS4_GETATTR_ATGID_ERR		6
    691 #define	NFS4_GETATTR_ATATIME_ERR	7
    692 #define	NFS4_GETATTR_ATMTIME_ERR	8
    693 #define	NFS4_GETATTR_ATCTIME_ERR	9
    694 #define	NFS4_GETATTR_RAWDEV_ERR		10
    695 #define	NFS4_GETATTR_ATNBLOCK_ERR	11
    696 #define	NFS4_GETATTR_MAXFILESIZE_ERR	12
    697 #define	NFS4_GETATTR_FHANDLE_ERR	13
    698 #define	NFS4_GETATTR_MAXREAD_ERR	14
    699 #define	NFS4_GETATTR_MAXWRITE_ERR	15
    700 #define	NFS4_GETATTR_NOCACHE_OK		16
    701 
    702 struct nfs4_pathconf_info {
    703 	unsigned pc4_cache_valid:1;	/* When in rnode4, is data valid? */
    704 	unsigned pc4_no_trunc:1;
    705 	unsigned pc4_chown_restricted:1;
    706 	unsigned pc4_case_insensitive:1;
    707 	unsigned pc4_case_preserving:1;
    708 	unsigned pc4_xattr_valid:1;
    709 	unsigned pc4_xattr_exists:1;
    710 	unsigned pc4_link_support:1;
    711 	unsigned pc4_symlink_support:1;
    712 	unsigned pc4_unique_handles:1;
    713 	unsigned pc4_cansettime:1;
    714 	unsigned pc4_homogeneous:1;
    715 	uint_t	pc4_link_max;
    716 	uint_t	pc4_name_max;
    717 	uint_t	pc4_filesizebits;
    718 };
    719 typedef struct nfs4_pathconf_info nfs4_pathconf_info_t;
    720 
    721 struct nfs4_pnfs_attr {
    722 	layouttypes4_t		n4g_fs_layout_type;
    723 	layouttypes4_t		n4g_layout_type;
    724 	fattr4_layout_alignment	n4g_layout_alignment;
    725 	fattr4_layout_blksize	n4g_layout_blksize;
    726 	/*
    727 	 * client only decodes layout hint and mdsthreshold associated
    728 	 * with file-typed layouts.
    729 	 */
    730 	file_layouthint4	n4g_layouthint;
    731 	file_mdsthreshold4	n4g_file_mdsthreshold;
    732 };
    733 typedef struct nfs4_pnfs_attr nfs4_pnfs_attr_t;
    734 
    735 /*
    736  * Used for client only to process incoming getattr results.
    737  */
    738 typedef struct nfs4_ga_ext_res {
    739 	attrmap4			n4g_suppattrs;
    740 	nfsstat4			n4g_rdattr_error;
    741 	fattr4_fh_expire_type		n4g_fet;
    742 	fattr4_lease_time		n4g_leasetime;
    743 	uint64_t			n4g_maxfilesize;
    744 	uint64_t			n4g_maxread;
    745 	uint64_t			n4g_maxwrite;
    746 	nfstime4			n4g_delta;
    747 	nfs4_pathconf_info_t		n4g_pc4;
    748 	struct statvfs64		n4g_sb;
    749 	union {
    750 		nfs_fh4 n4g_fh;
    751 		struct {
    752 			uint_t len;
    753 			char *val;
    754 			char data[NFS4_FHSIZE];
    755 		} nfs_fh4_alt;
    756 	} n4g_fh_u;
    757 	/*
    758 	 * Bitmask with valid fields being:
    759 	 * ACL4_SUPPORT_ALLOW_ACL
    760 	 * ACL4_SUPPORT_DENY_ACL
    761 	 * ACL4_SUPPORT_AUDIT_ACL
    762 	 * ACL4_SUPPORT_ALARM_ACL
    763 	 */
    764 	fattr4_aclsupport		n4g_aclsupport;
    765 	attrmap4			n4g_supp_exclcreat;
    766 	nfs4_pnfs_attr_t		n4g_pnfs;
    767 } nfs4_ga_ext_res_t;
    768 
    769 #ifdef	__cplusplus
    770 }
    771 #endif
    772 #endif /* _KERNEL */
    773 #endif /* _NFS4_ATTR_H */
    774