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