0001
0002
0003
0004
0005
0006 #ifndef __XFS_FORMAT_H__
0007 #define __XFS_FORMAT_H__
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 struct xfs_mount;
0019 struct xfs_trans;
0020 struct xfs_inode;
0021 struct xfs_buf;
0022 struct xfs_ifork;
0023
0024
0025
0026
0027
0028
0029 #define XFS_SB_MAGIC 0x58465342
0030 #define XFS_SB_VERSION_1 1
0031 #define XFS_SB_VERSION_2 2
0032 #define XFS_SB_VERSION_3 3
0033 #define XFS_SB_VERSION_4 4
0034 #define XFS_SB_VERSION_5 5
0035 #define XFS_SB_VERSION_NUMBITS 0x000f
0036 #define XFS_SB_VERSION_ALLFBITS 0xfff0
0037 #define XFS_SB_VERSION_ATTRBIT 0x0010
0038 #define XFS_SB_VERSION_NLINKBIT 0x0020
0039 #define XFS_SB_VERSION_QUOTABIT 0x0040
0040 #define XFS_SB_VERSION_ALIGNBIT 0x0080
0041 #define XFS_SB_VERSION_DALIGNBIT 0x0100
0042 #define XFS_SB_VERSION_SHAREDBIT 0x0200
0043 #define XFS_SB_VERSION_LOGV2BIT 0x0400
0044 #define XFS_SB_VERSION_SECTORBIT 0x0800
0045 #define XFS_SB_VERSION_EXTFLGBIT 0x1000
0046 #define XFS_SB_VERSION_DIRV2BIT 0x2000
0047 #define XFS_SB_VERSION_BORGBIT 0x4000
0048 #define XFS_SB_VERSION_MOREBITSBIT 0x8000
0049
0050
0051
0052
0053
0054
0055
0056 #define XFS_XATTR_SIZE_MAX (1 << 16)
0057
0058
0059
0060
0061
0062
0063 #define XFS_SB_VERSION_OKBITS \
0064 ((XFS_SB_VERSION_NUMBITS | XFS_SB_VERSION_ALLFBITS) & \
0065 ~XFS_SB_VERSION_SHAREDBIT)
0066
0067
0068
0069
0070
0071
0072
0073
0074 #define XFS_SB_VERSION2_RESERVED1BIT 0x00000001
0075 #define XFS_SB_VERSION2_LAZYSBCOUNTBIT 0x00000002
0076 #define XFS_SB_VERSION2_RESERVED4BIT 0x00000004
0077 #define XFS_SB_VERSION2_ATTR2BIT 0x00000008
0078 #define XFS_SB_VERSION2_PARENTBIT 0x00000010
0079 #define XFS_SB_VERSION2_PROJID32BIT 0x00000080
0080 #define XFS_SB_VERSION2_CRCBIT 0x00000100
0081 #define XFS_SB_VERSION2_FTYPE 0x00000200
0082
0083 #define XFS_SB_VERSION2_OKBITS \
0084 (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \
0085 XFS_SB_VERSION2_ATTR2BIT | \
0086 XFS_SB_VERSION2_PROJID32BIT | \
0087 XFS_SB_VERSION2_FTYPE)
0088
0089
0090 #define XFSLABEL_MAX 12
0091
0092
0093
0094
0095
0096 typedef struct xfs_sb {
0097 uint32_t sb_magicnum;
0098 uint32_t sb_blocksize;
0099 xfs_rfsblock_t sb_dblocks;
0100 xfs_rfsblock_t sb_rblocks;
0101 xfs_rtblock_t sb_rextents;
0102 uuid_t sb_uuid;
0103 xfs_fsblock_t sb_logstart;
0104 xfs_ino_t sb_rootino;
0105 xfs_ino_t sb_rbmino;
0106 xfs_ino_t sb_rsumino;
0107 xfs_agblock_t sb_rextsize;
0108 xfs_agblock_t sb_agblocks;
0109 xfs_agnumber_t sb_agcount;
0110 xfs_extlen_t sb_rbmblocks;
0111 xfs_extlen_t sb_logblocks;
0112 uint16_t sb_versionnum;
0113 uint16_t sb_sectsize;
0114 uint16_t sb_inodesize;
0115 uint16_t sb_inopblock;
0116 char sb_fname[XFSLABEL_MAX];
0117 uint8_t sb_blocklog;
0118 uint8_t sb_sectlog;
0119 uint8_t sb_inodelog;
0120 uint8_t sb_inopblog;
0121 uint8_t sb_agblklog;
0122 uint8_t sb_rextslog;
0123 uint8_t sb_inprogress;
0124 uint8_t sb_imax_pct;
0125
0126
0127
0128
0129
0130
0131 uint64_t sb_icount;
0132 uint64_t sb_ifree;
0133 uint64_t sb_fdblocks;
0134 uint64_t sb_frextents;
0135
0136
0137
0138 xfs_ino_t sb_uquotino;
0139 xfs_ino_t sb_gquotino;
0140 uint16_t sb_qflags;
0141 uint8_t sb_flags;
0142 uint8_t sb_shared_vn;
0143 xfs_extlen_t sb_inoalignmt;
0144 uint32_t sb_unit;
0145 uint32_t sb_width;
0146 uint8_t sb_dirblklog;
0147 uint8_t sb_logsectlog;
0148 uint16_t sb_logsectsize;
0149 uint32_t sb_logsunit;
0150 uint32_t sb_features2;
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161 uint32_t sb_bad_features2;
0162
0163
0164
0165
0166 uint32_t sb_features_compat;
0167 uint32_t sb_features_ro_compat;
0168 uint32_t sb_features_incompat;
0169 uint32_t sb_features_log_incompat;
0170
0171 uint32_t sb_crc;
0172 xfs_extlen_t sb_spino_align;
0173
0174 xfs_ino_t sb_pquotino;
0175 xfs_lsn_t sb_lsn;
0176 uuid_t sb_meta_uuid;
0177
0178
0179 } xfs_sb_t;
0180
0181 #define XFS_SB_CRC_OFF offsetof(struct xfs_sb, sb_crc)
0182
0183
0184
0185
0186
0187 struct xfs_dsb {
0188 __be32 sb_magicnum;
0189 __be32 sb_blocksize;
0190 __be64 sb_dblocks;
0191 __be64 sb_rblocks;
0192 __be64 sb_rextents;
0193 uuid_t sb_uuid;
0194 __be64 sb_logstart;
0195 __be64 sb_rootino;
0196 __be64 sb_rbmino;
0197 __be64 sb_rsumino;
0198 __be32 sb_rextsize;
0199 __be32 sb_agblocks;
0200 __be32 sb_agcount;
0201 __be32 sb_rbmblocks;
0202 __be32 sb_logblocks;
0203 __be16 sb_versionnum;
0204 __be16 sb_sectsize;
0205 __be16 sb_inodesize;
0206 __be16 sb_inopblock;
0207 char sb_fname[XFSLABEL_MAX];
0208 __u8 sb_blocklog;
0209 __u8 sb_sectlog;
0210 __u8 sb_inodelog;
0211 __u8 sb_inopblog;
0212 __u8 sb_agblklog;
0213 __u8 sb_rextslog;
0214 __u8 sb_inprogress;
0215 __u8 sb_imax_pct;
0216
0217
0218
0219
0220
0221
0222 __be64 sb_icount;
0223 __be64 sb_ifree;
0224 __be64 sb_fdblocks;
0225 __be64 sb_frextents;
0226
0227
0228
0229 __be64 sb_uquotino;
0230 __be64 sb_gquotino;
0231 __be16 sb_qflags;
0232 __u8 sb_flags;
0233 __u8 sb_shared_vn;
0234 __be32 sb_inoalignmt;
0235 __be32 sb_unit;
0236 __be32 sb_width;
0237 __u8 sb_dirblklog;
0238 __u8 sb_logsectlog;
0239 __be16 sb_logsectsize;
0240 __be32 sb_logsunit;
0241 __be32 sb_features2;
0242
0243
0244
0245
0246
0247
0248 __be32 sb_bad_features2;
0249
0250
0251
0252
0253 __be32 sb_features_compat;
0254 __be32 sb_features_ro_compat;
0255 __be32 sb_features_incompat;
0256 __be32 sb_features_log_incompat;
0257
0258 __le32 sb_crc;
0259 __be32 sb_spino_align;
0260
0261 __be64 sb_pquotino;
0262 __be64 sb_lsn;
0263 uuid_t sb_meta_uuid;
0264
0265
0266 };
0267
0268
0269
0270
0271
0272 #define XFS_SBF_NOFLAGS 0x00
0273 #define XFS_SBF_READONLY 0x01
0274
0275
0276
0277
0278 #define XFS_SB_MAX_SHARED_VN 0
0279
0280 #define XFS_SB_VERSION_NUM(sbp) ((sbp)->sb_versionnum & XFS_SB_VERSION_NUMBITS)
0281
0282 static inline bool xfs_sb_is_v5(struct xfs_sb *sbp)
0283 {
0284 return XFS_SB_VERSION_NUM(sbp) == XFS_SB_VERSION_5;
0285 }
0286
0287
0288
0289
0290
0291 static inline bool xfs_sb_has_mismatched_features2(struct xfs_sb *sbp)
0292 {
0293 return sbp->sb_bad_features2 != sbp->sb_features2;
0294 }
0295
0296 static inline bool xfs_sb_version_hasmorebits(struct xfs_sb *sbp)
0297 {
0298 return xfs_sb_is_v5(sbp) ||
0299 (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT);
0300 }
0301
0302 static inline void xfs_sb_version_addattr(struct xfs_sb *sbp)
0303 {
0304 sbp->sb_versionnum |= XFS_SB_VERSION_ATTRBIT;
0305 }
0306
0307 static inline void xfs_sb_version_addquota(struct xfs_sb *sbp)
0308 {
0309 sbp->sb_versionnum |= XFS_SB_VERSION_QUOTABIT;
0310 }
0311
0312 static inline void xfs_sb_version_addattr2(struct xfs_sb *sbp)
0313 {
0314 sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT;
0315 sbp->sb_features2 |= XFS_SB_VERSION2_ATTR2BIT;
0316 }
0317
0318 static inline void xfs_sb_version_addprojid32(struct xfs_sb *sbp)
0319 {
0320 sbp->sb_versionnum |= XFS_SB_VERSION_MOREBITSBIT;
0321 sbp->sb_features2 |= XFS_SB_VERSION2_PROJID32BIT;
0322 }
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342 #define XFS_SB_FEAT_COMPAT_ALL 0
0343 #define XFS_SB_FEAT_COMPAT_UNKNOWN ~XFS_SB_FEAT_COMPAT_ALL
0344 static inline bool
0345 xfs_sb_has_compat_feature(
0346 struct xfs_sb *sbp,
0347 uint32_t feature)
0348 {
0349 return (sbp->sb_features_compat & feature) != 0;
0350 }
0351
0352 #define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0)
0353 #define XFS_SB_FEAT_RO_COMPAT_RMAPBT (1 << 1)
0354 #define XFS_SB_FEAT_RO_COMPAT_REFLINK (1 << 2)
0355 #define XFS_SB_FEAT_RO_COMPAT_INOBTCNT (1 << 3)
0356 #define XFS_SB_FEAT_RO_COMPAT_ALL \
0357 (XFS_SB_FEAT_RO_COMPAT_FINOBT | \
0358 XFS_SB_FEAT_RO_COMPAT_RMAPBT | \
0359 XFS_SB_FEAT_RO_COMPAT_REFLINK| \
0360 XFS_SB_FEAT_RO_COMPAT_INOBTCNT)
0361 #define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL
0362 static inline bool
0363 xfs_sb_has_ro_compat_feature(
0364 struct xfs_sb *sbp,
0365 uint32_t feature)
0366 {
0367 return (sbp->sb_features_ro_compat & feature) != 0;
0368 }
0369
0370 #define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0)
0371 #define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1)
0372 #define XFS_SB_FEAT_INCOMPAT_META_UUID (1 << 2)
0373 #define XFS_SB_FEAT_INCOMPAT_BIGTIME (1 << 3)
0374 #define XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR (1 << 4)
0375 #define XFS_SB_FEAT_INCOMPAT_NREXT64 (1 << 5)
0376 #define XFS_SB_FEAT_INCOMPAT_ALL \
0377 (XFS_SB_FEAT_INCOMPAT_FTYPE| \
0378 XFS_SB_FEAT_INCOMPAT_SPINODES| \
0379 XFS_SB_FEAT_INCOMPAT_META_UUID| \
0380 XFS_SB_FEAT_INCOMPAT_BIGTIME| \
0381 XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR| \
0382 XFS_SB_FEAT_INCOMPAT_NREXT64)
0383
0384 #define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL
0385 static inline bool
0386 xfs_sb_has_incompat_feature(
0387 struct xfs_sb *sbp,
0388 uint32_t feature)
0389 {
0390 return (sbp->sb_features_incompat & feature) != 0;
0391 }
0392
0393 #define XFS_SB_FEAT_INCOMPAT_LOG_XATTRS (1 << 0)
0394 #define XFS_SB_FEAT_INCOMPAT_LOG_ALL \
0395 (XFS_SB_FEAT_INCOMPAT_LOG_XATTRS)
0396 #define XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_LOG_ALL
0397 static inline bool
0398 xfs_sb_has_incompat_log_feature(
0399 struct xfs_sb *sbp,
0400 uint32_t feature)
0401 {
0402 return (sbp->sb_features_log_incompat & feature) != 0;
0403 }
0404
0405 static inline void
0406 xfs_sb_remove_incompat_log_features(
0407 struct xfs_sb *sbp)
0408 {
0409 sbp->sb_features_log_incompat &= ~XFS_SB_FEAT_INCOMPAT_LOG_ALL;
0410 }
0411
0412 static inline void
0413 xfs_sb_add_incompat_log_features(
0414 struct xfs_sb *sbp,
0415 unsigned int features)
0416 {
0417 sbp->sb_features_log_incompat |= features;
0418 }
0419
0420 static inline bool xfs_sb_version_haslogxattrs(struct xfs_sb *sbp)
0421 {
0422 return xfs_sb_is_v5(sbp) && (sbp->sb_features_log_incompat &
0423 XFS_SB_FEAT_INCOMPAT_LOG_XATTRS);
0424 }
0425
0426 static inline bool
0427 xfs_is_quota_inode(struct xfs_sb *sbp, xfs_ino_t ino)
0428 {
0429 return (ino == sbp->sb_uquotino ||
0430 ino == sbp->sb_gquotino ||
0431 ino == sbp->sb_pquotino);
0432 }
0433
0434 #define XFS_SB_DADDR ((xfs_daddr_t)0)
0435 #define XFS_SB_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_SB_DADDR)
0436
0437 #define XFS_HDR_BLOCK(mp,d) ((xfs_agblock_t)XFS_BB_TO_FSBT(mp,d))
0438 #define XFS_DADDR_TO_FSB(mp,d) XFS_AGB_TO_FSB(mp, \
0439 xfs_daddr_to_agno(mp,d), xfs_daddr_to_agbno(mp,d))
0440 #define XFS_FSB_TO_DADDR(mp,fsbno) XFS_AGB_TO_DADDR(mp, \
0441 XFS_FSB_TO_AGNO(mp,fsbno), XFS_FSB_TO_AGBNO(mp,fsbno))
0442
0443
0444
0445
0446 #define XFS_FSS_TO_BB(mp,sec) ((sec) << (mp)->m_sectbb_log)
0447
0448
0449
0450
0451 #define XFS_FSB_TO_BB(mp,fsbno) ((fsbno) << (mp)->m_blkbb_log)
0452 #define XFS_BB_TO_FSB(mp,bb) \
0453 (((bb) + (XFS_FSB_TO_BB(mp,1) - 1)) >> (mp)->m_blkbb_log)
0454 #define XFS_BB_TO_FSBT(mp,bb) ((bb) >> (mp)->m_blkbb_log)
0455
0456
0457
0458
0459 #define XFS_FSB_TO_B(mp,fsbno) ((xfs_fsize_t)(fsbno) << (mp)->m_sb.sb_blocklog)
0460 #define XFS_B_TO_FSB(mp,b) \
0461 ((((uint64_t)(b)) + (mp)->m_blockmask) >> (mp)->m_sb.sb_blocklog)
0462 #define XFS_B_TO_FSBT(mp,b) (((uint64_t)(b)) >> (mp)->m_sb.sb_blocklog)
0463
0464
0465
0466
0467
0468
0469
0470 #define XFS_AGF_MAGIC 0x58414746
0471 #define XFS_AGI_MAGIC 0x58414749
0472 #define XFS_AGFL_MAGIC 0x5841464c
0473 #define XFS_AGF_VERSION 1
0474 #define XFS_AGI_VERSION 1
0475
0476 #define XFS_AGF_GOOD_VERSION(v) ((v) == XFS_AGF_VERSION)
0477 #define XFS_AGI_GOOD_VERSION(v) ((v) == XFS_AGI_VERSION)
0478
0479
0480
0481
0482
0483 #define XFS_BTNUM_AGF ((int)XFS_BTNUM_RMAPi + 1)
0484
0485
0486
0487
0488
0489
0490
0491 typedef struct xfs_agf {
0492
0493
0494
0495 __be32 agf_magicnum;
0496 __be32 agf_versionnum;
0497 __be32 agf_seqno;
0498 __be32 agf_length;
0499
0500
0501
0502 __be32 agf_roots[XFS_BTNUM_AGF];
0503 __be32 agf_levels[XFS_BTNUM_AGF];
0504
0505 __be32 agf_flfirst;
0506 __be32 agf_fllast;
0507 __be32 agf_flcount;
0508 __be32 agf_freeblks;
0509
0510 __be32 agf_longest;
0511 __be32 agf_btreeblks;
0512 uuid_t agf_uuid;
0513
0514 __be32 agf_rmap_blocks;
0515 __be32 agf_refcount_blocks;
0516
0517 __be32 agf_refcount_root;
0518 __be32 agf_refcount_level;
0519
0520
0521
0522
0523
0524
0525 __be64 agf_spare64[14];
0526
0527
0528 __be64 agf_lsn;
0529 __be32 agf_crc;
0530 __be32 agf_spare2;
0531
0532
0533 } xfs_agf_t;
0534
0535 #define XFS_AGF_CRC_OFF offsetof(struct xfs_agf, agf_crc)
0536
0537 #define XFS_AGF_MAGICNUM (1u << 0)
0538 #define XFS_AGF_VERSIONNUM (1u << 1)
0539 #define XFS_AGF_SEQNO (1u << 2)
0540 #define XFS_AGF_LENGTH (1u << 3)
0541 #define XFS_AGF_ROOTS (1u << 4)
0542 #define XFS_AGF_LEVELS (1u << 5)
0543 #define XFS_AGF_FLFIRST (1u << 6)
0544 #define XFS_AGF_FLLAST (1u << 7)
0545 #define XFS_AGF_FLCOUNT (1u << 8)
0546 #define XFS_AGF_FREEBLKS (1u << 9)
0547 #define XFS_AGF_LONGEST (1u << 10)
0548 #define XFS_AGF_BTREEBLKS (1u << 11)
0549 #define XFS_AGF_UUID (1u << 12)
0550 #define XFS_AGF_RMAP_BLOCKS (1u << 13)
0551 #define XFS_AGF_REFCOUNT_BLOCKS (1u << 14)
0552 #define XFS_AGF_REFCOUNT_ROOT (1u << 15)
0553 #define XFS_AGF_REFCOUNT_LEVEL (1u << 16)
0554 #define XFS_AGF_SPARE64 (1u << 17)
0555 #define XFS_AGF_NUM_BITS 18
0556 #define XFS_AGF_ALL_BITS ((1u << XFS_AGF_NUM_BITS) - 1)
0557
0558 #define XFS_AGF_FLAGS \
0559 { XFS_AGF_MAGICNUM, "MAGICNUM" }, \
0560 { XFS_AGF_VERSIONNUM, "VERSIONNUM" }, \
0561 { XFS_AGF_SEQNO, "SEQNO" }, \
0562 { XFS_AGF_LENGTH, "LENGTH" }, \
0563 { XFS_AGF_ROOTS, "ROOTS" }, \
0564 { XFS_AGF_LEVELS, "LEVELS" }, \
0565 { XFS_AGF_FLFIRST, "FLFIRST" }, \
0566 { XFS_AGF_FLLAST, "FLLAST" }, \
0567 { XFS_AGF_FLCOUNT, "FLCOUNT" }, \
0568 { XFS_AGF_FREEBLKS, "FREEBLKS" }, \
0569 { XFS_AGF_LONGEST, "LONGEST" }, \
0570 { XFS_AGF_BTREEBLKS, "BTREEBLKS" }, \
0571 { XFS_AGF_UUID, "UUID" }, \
0572 { XFS_AGF_RMAP_BLOCKS, "RMAP_BLOCKS" }, \
0573 { XFS_AGF_REFCOUNT_BLOCKS, "REFCOUNT_BLOCKS" }, \
0574 { XFS_AGF_REFCOUNT_ROOT, "REFCOUNT_ROOT" }, \
0575 { XFS_AGF_REFCOUNT_LEVEL, "REFCOUNT_LEVEL" }, \
0576 { XFS_AGF_SPARE64, "SPARE64" }
0577
0578
0579 #define XFS_AGF_DADDR(mp) ((xfs_daddr_t)(1 << (mp)->m_sectbb_log))
0580 #define XFS_AGF_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGF_DADDR(mp))
0581
0582
0583
0584
0585 #define XFS_AGI_UNLINKED_BUCKETS 64
0586
0587 typedef struct xfs_agi {
0588
0589
0590
0591 __be32 agi_magicnum;
0592 __be32 agi_versionnum;
0593 __be32 agi_seqno;
0594 __be32 agi_length;
0595
0596
0597
0598
0599
0600 __be32 agi_count;
0601 __be32 agi_root;
0602 __be32 agi_level;
0603 __be32 agi_freecount;
0604
0605 __be32 agi_newino;
0606 __be32 agi_dirino;
0607
0608
0609
0610
0611 __be32 agi_unlinked[XFS_AGI_UNLINKED_BUCKETS];
0612
0613
0614
0615 uuid_t agi_uuid;
0616 __be32 agi_crc;
0617 __be32 agi_pad32;
0618 __be64 agi_lsn;
0619
0620 __be32 agi_free_root;
0621 __be32 agi_free_level;
0622
0623 __be32 agi_iblocks;
0624 __be32 agi_fblocks;
0625
0626
0627 } xfs_agi_t;
0628
0629 #define XFS_AGI_CRC_OFF offsetof(struct xfs_agi, agi_crc)
0630
0631 #define XFS_AGI_MAGICNUM (1u << 0)
0632 #define XFS_AGI_VERSIONNUM (1u << 1)
0633 #define XFS_AGI_SEQNO (1u << 2)
0634 #define XFS_AGI_LENGTH (1u << 3)
0635 #define XFS_AGI_COUNT (1u << 4)
0636 #define XFS_AGI_ROOT (1u << 5)
0637 #define XFS_AGI_LEVEL (1u << 6)
0638 #define XFS_AGI_FREECOUNT (1u << 7)
0639 #define XFS_AGI_NEWINO (1u << 8)
0640 #define XFS_AGI_DIRINO (1u << 9)
0641 #define XFS_AGI_UNLINKED (1u << 10)
0642 #define XFS_AGI_NUM_BITS_R1 11
0643 #define XFS_AGI_ALL_BITS_R1 ((1u << XFS_AGI_NUM_BITS_R1) - 1)
0644 #define XFS_AGI_FREE_ROOT (1u << 11)
0645 #define XFS_AGI_FREE_LEVEL (1u << 12)
0646 #define XFS_AGI_IBLOCKS (1u << 13)
0647 #define XFS_AGI_NUM_BITS_R2 14
0648
0649
0650 #define XFS_AGI_DADDR(mp) ((xfs_daddr_t)(2 << (mp)->m_sectbb_log))
0651 #define XFS_AGI_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGI_DADDR(mp))
0652
0653
0654
0655
0656
0657 #define XFS_AGFL_DADDR(mp) ((xfs_daddr_t)(3 << (mp)->m_sectbb_log))
0658 #define XFS_AGFL_BLOCK(mp) XFS_HDR_BLOCK(mp, XFS_AGFL_DADDR(mp))
0659 #define XFS_BUF_TO_AGFL(bp) ((struct xfs_agfl *)((bp)->b_addr))
0660
0661 struct xfs_agfl {
0662 __be32 agfl_magicnum;
0663 __be32 agfl_seqno;
0664 uuid_t agfl_uuid;
0665 __be64 agfl_lsn;
0666 __be32 agfl_crc;
0667 } __attribute__((packed));
0668
0669 #define XFS_AGFL_CRC_OFF offsetof(struct xfs_agfl, agfl_crc)
0670
0671 #define XFS_AGB_TO_FSB(mp,agno,agbno) \
0672 (((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno))
0673 #define XFS_FSB_TO_AGNO(mp,fsbno) \
0674 ((xfs_agnumber_t)((fsbno) >> (mp)->m_sb.sb_agblklog))
0675 #define XFS_FSB_TO_AGBNO(mp,fsbno) \
0676 ((xfs_agblock_t)((fsbno) & xfs_mask32lo((mp)->m_sb.sb_agblklog)))
0677 #define XFS_AGB_TO_DADDR(mp,agno,agbno) \
0678 ((xfs_daddr_t)XFS_FSB_TO_BB(mp, \
0679 (xfs_fsblock_t)(agno) * (mp)->m_sb.sb_agblocks + (agbno)))
0680 #define XFS_AG_DADDR(mp,agno,d) (XFS_AGB_TO_DADDR(mp, agno, 0) + (d))
0681
0682
0683
0684
0685
0686 #define XFS_AG_CHECK_DADDR(mp,d,len) \
0687 ((len) == 1 ? \
0688 ASSERT((d) == XFS_SB_DADDR || \
0689 xfs_daddr_to_agbno(mp, d) != XFS_SB_DADDR) : \
0690 ASSERT(xfs_daddr_to_agno(mp, d) == \
0691 xfs_daddr_to_agno(mp, (d) + (len) - 1)))
0692
0693
0694
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711 typedef __be64 xfs_timestamp_t;
0712
0713
0714 struct xfs_legacy_timestamp {
0715 __be32 t_sec;
0716 __be32 t_nsec;
0717 };
0718
0719
0720
0721
0722
0723 #define XFS_LEGACY_TIME_MIN ((int64_t)S32_MIN)
0724
0725
0726
0727
0728
0729 #define XFS_LEGACY_TIME_MAX ((int64_t)S32_MAX)
0730
0731
0732
0733
0734
0735
0736 #define XFS_BIGTIME_TIME_MIN ((int64_t)0)
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746 #define XFS_BIGTIME_TIME_MAX ((int64_t)((-1ULL / NSEC_PER_SEC) & ~0x3ULL))
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761 #define XFS_BIGTIME_EPOCH_OFFSET (-(int64_t)S32_MIN)
0762
0763
0764 static inline uint64_t xfs_unix_to_bigtime(time64_t unix_seconds)
0765 {
0766 return (uint64_t)unix_seconds + XFS_BIGTIME_EPOCH_OFFSET;
0767 }
0768
0769
0770 static inline time64_t xfs_bigtime_to_unix(uint64_t ondisk_seconds)
0771 {
0772 return (time64_t)ondisk_seconds - XFS_BIGTIME_EPOCH_OFFSET;
0773 }
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791 #define XFS_DINODE_MAGIC 0x494e
0792 struct xfs_dinode {
0793 __be16 di_magic;
0794 __be16 di_mode;
0795 __u8 di_version;
0796 __u8 di_format;
0797 __be16 di_onlink;
0798 __be32 di_uid;
0799 __be32 di_gid;
0800 __be32 di_nlink;
0801 __be16 di_projid_lo;
0802 __be16 di_projid_hi;
0803 union {
0804
0805 __be64 di_big_nextents;
0806
0807
0808 __be64 di_v3_pad;
0809
0810
0811 struct {
0812 __u8 di_v2_pad[6];
0813 __be16 di_flushiter;
0814 };
0815 };
0816 xfs_timestamp_t di_atime;
0817 xfs_timestamp_t di_mtime;
0818 xfs_timestamp_t di_ctime;
0819 __be64 di_size;
0820 __be64 di_nblocks;
0821 __be32 di_extsize;
0822 union {
0823
0824
0825
0826
0827 struct {
0828 __be32 di_nextents;
0829 __be16 di_anextents;
0830 } __packed;
0831
0832
0833 struct {
0834 __be32 di_big_anextents;
0835 __be16 di_nrext64_pad;
0836 } __packed;
0837 } __packed;
0838 __u8 di_forkoff;
0839 __s8 di_aformat;
0840 __be32 di_dmevmask;
0841 __be16 di_dmstate;
0842 __be16 di_flags;
0843 __be32 di_gen;
0844
0845
0846 __be32 di_next_unlinked;
0847
0848
0849 __le32 di_crc;
0850 __be64 di_changecount;
0851 __be64 di_lsn;
0852 __be64 di_flags2;
0853 __be32 di_cowextsize;
0854 __u8 di_pad2[12];
0855
0856
0857 xfs_timestamp_t di_crtime;
0858 __be64 di_ino;
0859 uuid_t di_uuid;
0860
0861
0862 };
0863
0864 #define XFS_DINODE_CRC_OFF offsetof(struct xfs_dinode, di_crc)
0865
0866 #define DI_MAX_FLUSH 0xffff
0867
0868
0869
0870
0871
0872 static inline uint xfs_dinode_size(int version)
0873 {
0874 if (version == 3)
0875 return sizeof(struct xfs_dinode);
0876 return offsetof(struct xfs_dinode, di_crc);
0877 }
0878
0879
0880
0881
0882
0883 #define XFS_MAXLINK ((1U << 31) - 1U)
0884
0885
0886
0887
0888
0889
0890
0891 enum xfs_dinode_fmt {
0892 XFS_DINODE_FMT_DEV,
0893 XFS_DINODE_FMT_LOCAL,
0894 XFS_DINODE_FMT_EXTENTS,
0895 XFS_DINODE_FMT_BTREE,
0896 XFS_DINODE_FMT_UUID
0897 };
0898
0899 #define XFS_INODE_FORMAT_STR \
0900 { XFS_DINODE_FMT_DEV, "dev" }, \
0901 { XFS_DINODE_FMT_LOCAL, "local" }, \
0902 { XFS_DINODE_FMT_EXTENTS, "extent" }, \
0903 { XFS_DINODE_FMT_BTREE, "btree" }, \
0904 { XFS_DINODE_FMT_UUID, "uuid" }
0905
0906
0907
0908
0909
0910
0911
0912
0913
0914
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929
0930
0931
0932
0933
0934
0935
0936
0937
0938
0939
0940 #define XFS_MAX_EXTCNT_DATA_FORK_LARGE ((xfs_extnum_t)((1ULL << 48) - 1))
0941 #define XFS_MAX_EXTCNT_ATTR_FORK_LARGE ((xfs_extnum_t)((1ULL << 32) - 1))
0942 #define XFS_MAX_EXTCNT_DATA_FORK_SMALL ((xfs_extnum_t)((1ULL << 31) - 1))
0943 #define XFS_MAX_EXTCNT_ATTR_FORK_SMALL ((xfs_extnum_t)((1ULL << 15) - 1))
0944
0945
0946
0947
0948
0949
0950
0951
0952 #define XFS_MAX_EXTCNT_UPGRADE_NR \
0953 min(XFS_MAX_EXTCNT_ATTR_FORK_LARGE - XFS_MAX_EXTCNT_ATTR_FORK_SMALL, \
0954 XFS_MAX_EXTCNT_DATA_FORK_LARGE - XFS_MAX_EXTCNT_DATA_FORK_SMALL)
0955
0956
0957
0958
0959 #define XFS_DINODE_MIN_LOG 8
0960 #define XFS_DINODE_MAX_LOG 11
0961 #define XFS_DINODE_MIN_SIZE (1 << XFS_DINODE_MIN_LOG)
0962 #define XFS_DINODE_MAX_SIZE (1 << XFS_DINODE_MAX_LOG)
0963
0964
0965
0966
0967 #define XFS_DINODE_SIZE(mp) \
0968 (xfs_has_v3inodes(mp) ? \
0969 sizeof(struct xfs_dinode) : \
0970 offsetof(struct xfs_dinode, di_crc))
0971 #define XFS_LITINO(mp) \
0972 ((mp)->m_sb.sb_inodesize - XFS_DINODE_SIZE(mp))
0973
0974
0975
0976
0977 #define XFS_DFORK_BOFF(dip) ((int)((dip)->di_forkoff << 3))
0978
0979 #define XFS_DFORK_DSIZE(dip,mp) \
0980 ((dip)->di_forkoff ? XFS_DFORK_BOFF(dip) : XFS_LITINO(mp))
0981 #define XFS_DFORK_ASIZE(dip,mp) \
0982 ((dip)->di_forkoff ? XFS_LITINO(mp) - XFS_DFORK_BOFF(dip) : 0)
0983 #define XFS_DFORK_SIZE(dip,mp,w) \
0984 ((w) == XFS_DATA_FORK ? \
0985 XFS_DFORK_DSIZE(dip, mp) : \
0986 XFS_DFORK_ASIZE(dip, mp))
0987
0988 #define XFS_DFORK_MAXEXT(dip, mp, w) \
0989 (XFS_DFORK_SIZE(dip, mp, w) / sizeof(struct xfs_bmbt_rec))
0990
0991
0992
0993
0994 #define XFS_DFORK_DPTR(dip) \
0995 ((char *)dip + xfs_dinode_size(dip->di_version))
0996 #define XFS_DFORK_APTR(dip) \
0997 (XFS_DFORK_DPTR(dip) + XFS_DFORK_BOFF(dip))
0998 #define XFS_DFORK_PTR(dip,w) \
0999 ((w) == XFS_DATA_FORK ? XFS_DFORK_DPTR(dip) : XFS_DFORK_APTR(dip))
1000
1001 #define XFS_DFORK_FORMAT(dip,w) \
1002 ((w) == XFS_DATA_FORK ? \
1003 (dip)->di_format : \
1004 (dip)->di_aformat)
1005
1006
1007
1008
1009
1010 static inline xfs_dev_t xfs_dinode_get_rdev(struct xfs_dinode *dip)
1011 {
1012 return be32_to_cpu(*(__be32 *)XFS_DFORK_DPTR(dip));
1013 }
1014
1015 static inline void xfs_dinode_put_rdev(struct xfs_dinode *dip, xfs_dev_t rdev)
1016 {
1017 *(__be32 *)XFS_DFORK_DPTR(dip) = cpu_to_be32(rdev);
1018 }
1019
1020
1021
1022
1023 #define XFS_DIFLAG_REALTIME_BIT 0
1024 #define XFS_DIFLAG_PREALLOC_BIT 1
1025 #define XFS_DIFLAG_NEWRTBM_BIT 2
1026 #define XFS_DIFLAG_IMMUTABLE_BIT 3
1027 #define XFS_DIFLAG_APPEND_BIT 4
1028 #define XFS_DIFLAG_SYNC_BIT 5
1029 #define XFS_DIFLAG_NOATIME_BIT 6
1030 #define XFS_DIFLAG_NODUMP_BIT 7
1031 #define XFS_DIFLAG_RTINHERIT_BIT 8
1032 #define XFS_DIFLAG_PROJINHERIT_BIT 9
1033 #define XFS_DIFLAG_NOSYMLINKS_BIT 10
1034 #define XFS_DIFLAG_EXTSIZE_BIT 11
1035 #define XFS_DIFLAG_EXTSZINHERIT_BIT 12
1036 #define XFS_DIFLAG_NODEFRAG_BIT 13
1037 #define XFS_DIFLAG_FILESTREAM_BIT 14
1038
1039
1040 #define XFS_DIFLAG_REALTIME (1 << XFS_DIFLAG_REALTIME_BIT)
1041 #define XFS_DIFLAG_PREALLOC (1 << XFS_DIFLAG_PREALLOC_BIT)
1042 #define XFS_DIFLAG_NEWRTBM (1 << XFS_DIFLAG_NEWRTBM_BIT)
1043 #define XFS_DIFLAG_IMMUTABLE (1 << XFS_DIFLAG_IMMUTABLE_BIT)
1044 #define XFS_DIFLAG_APPEND (1 << XFS_DIFLAG_APPEND_BIT)
1045 #define XFS_DIFLAG_SYNC (1 << XFS_DIFLAG_SYNC_BIT)
1046 #define XFS_DIFLAG_NOATIME (1 << XFS_DIFLAG_NOATIME_BIT)
1047 #define XFS_DIFLAG_NODUMP (1 << XFS_DIFLAG_NODUMP_BIT)
1048 #define XFS_DIFLAG_RTINHERIT (1 << XFS_DIFLAG_RTINHERIT_BIT)
1049 #define XFS_DIFLAG_PROJINHERIT (1 << XFS_DIFLAG_PROJINHERIT_BIT)
1050 #define XFS_DIFLAG_NOSYMLINKS (1 << XFS_DIFLAG_NOSYMLINKS_BIT)
1051 #define XFS_DIFLAG_EXTSIZE (1 << XFS_DIFLAG_EXTSIZE_BIT)
1052 #define XFS_DIFLAG_EXTSZINHERIT (1 << XFS_DIFLAG_EXTSZINHERIT_BIT)
1053 #define XFS_DIFLAG_NODEFRAG (1 << XFS_DIFLAG_NODEFRAG_BIT)
1054 #define XFS_DIFLAG_FILESTREAM (1 << XFS_DIFLAG_FILESTREAM_BIT)
1055
1056 #define XFS_DIFLAG_ANY \
1057 (XFS_DIFLAG_REALTIME | XFS_DIFLAG_PREALLOC | XFS_DIFLAG_NEWRTBM | \
1058 XFS_DIFLAG_IMMUTABLE | XFS_DIFLAG_APPEND | XFS_DIFLAG_SYNC | \
1059 XFS_DIFLAG_NOATIME | XFS_DIFLAG_NODUMP | XFS_DIFLAG_RTINHERIT | \
1060 XFS_DIFLAG_PROJINHERIT | XFS_DIFLAG_NOSYMLINKS | XFS_DIFLAG_EXTSIZE | \
1061 XFS_DIFLAG_EXTSZINHERIT | XFS_DIFLAG_NODEFRAG | XFS_DIFLAG_FILESTREAM)
1062
1063
1064
1065
1066
1067 #define XFS_DIFLAG2_DAX_BIT 0
1068 #define XFS_DIFLAG2_REFLINK_BIT 1
1069 #define XFS_DIFLAG2_COWEXTSIZE_BIT 2
1070 #define XFS_DIFLAG2_BIGTIME_BIT 3
1071 #define XFS_DIFLAG2_NREXT64_BIT 4
1072
1073 #define XFS_DIFLAG2_DAX (1 << XFS_DIFLAG2_DAX_BIT)
1074 #define XFS_DIFLAG2_REFLINK (1 << XFS_DIFLAG2_REFLINK_BIT)
1075 #define XFS_DIFLAG2_COWEXTSIZE (1 << XFS_DIFLAG2_COWEXTSIZE_BIT)
1076 #define XFS_DIFLAG2_BIGTIME (1 << XFS_DIFLAG2_BIGTIME_BIT)
1077 #define XFS_DIFLAG2_NREXT64 (1 << XFS_DIFLAG2_NREXT64_BIT)
1078
1079 #define XFS_DIFLAG2_ANY \
1080 (XFS_DIFLAG2_DAX | XFS_DIFLAG2_REFLINK | XFS_DIFLAG2_COWEXTSIZE | \
1081 XFS_DIFLAG2_BIGTIME | XFS_DIFLAG2_NREXT64)
1082
1083 static inline bool xfs_dinode_has_bigtime(const struct xfs_dinode *dip)
1084 {
1085 return dip->di_version >= 3 &&
1086 (dip->di_flags2 & cpu_to_be64(XFS_DIFLAG2_BIGTIME));
1087 }
1088
1089 static inline bool xfs_dinode_has_large_extent_counts(
1090 const struct xfs_dinode *dip)
1091 {
1092 return dip->di_version >= 3 &&
1093 (dip->di_flags2 & cpu_to_be64(XFS_DIFLAG2_NREXT64));
1094 }
1095
1096
1097
1098
1099
1100
1101
1102
1103 #define XFS_INO_MASK(k) (uint32_t)((1ULL << (k)) - 1)
1104 #define XFS_INO_OFFSET_BITS(mp) (mp)->m_sb.sb_inopblog
1105 #define XFS_INO_AGBNO_BITS(mp) (mp)->m_sb.sb_agblklog
1106 #define XFS_INO_AGINO_BITS(mp) ((mp)->m_ino_geo.agino_log)
1107 #define XFS_INO_AGNO_BITS(mp) (mp)->m_agno_log
1108 #define XFS_INO_BITS(mp) \
1109 XFS_INO_AGNO_BITS(mp) + XFS_INO_AGINO_BITS(mp)
1110 #define XFS_INO_TO_AGNO(mp,i) \
1111 ((xfs_agnumber_t)((i) >> XFS_INO_AGINO_BITS(mp)))
1112 #define XFS_INO_TO_AGINO(mp,i) \
1113 ((xfs_agino_t)(i) & XFS_INO_MASK(XFS_INO_AGINO_BITS(mp)))
1114 #define XFS_INO_TO_AGBNO(mp,i) \
1115 (((xfs_agblock_t)(i) >> XFS_INO_OFFSET_BITS(mp)) & \
1116 XFS_INO_MASK(XFS_INO_AGBNO_BITS(mp)))
1117 #define XFS_INO_TO_OFFSET(mp,i) \
1118 ((int)(i) & XFS_INO_MASK(XFS_INO_OFFSET_BITS(mp)))
1119 #define XFS_INO_TO_FSB(mp,i) \
1120 XFS_AGB_TO_FSB(mp, XFS_INO_TO_AGNO(mp,i), XFS_INO_TO_AGBNO(mp,i))
1121 #define XFS_AGINO_TO_INO(mp,a,i) \
1122 (((xfs_ino_t)(a) << XFS_INO_AGINO_BITS(mp)) | (i))
1123 #define XFS_AGINO_TO_AGBNO(mp,i) ((i) >> XFS_INO_OFFSET_BITS(mp))
1124 #define XFS_AGINO_TO_OFFSET(mp,i) \
1125 ((i) & XFS_INO_MASK(XFS_INO_OFFSET_BITS(mp)))
1126 #define XFS_OFFBNO_TO_AGINO(mp,b,o) \
1127 ((xfs_agino_t)(((b) << XFS_INO_OFFSET_BITS(mp)) | (o)))
1128 #define XFS_FSB_TO_INO(mp, b) ((xfs_ino_t)((b) << XFS_INO_OFFSET_BITS(mp)))
1129 #define XFS_AGB_TO_AGINO(mp, b) ((xfs_agino_t)((b) << XFS_INO_OFFSET_BITS(mp)))
1130
1131 #define XFS_MAXINUMBER ((xfs_ino_t)((1ULL << 56) - 1ULL))
1132 #define XFS_MAXINUMBER_32 ((xfs_ino_t)((1ULL << 32) - 1ULL))
1133
1134
1135
1136
1137
1138
1139 #define XFS_MAX_RTEXTSIZE (1024 * 1024 * 1024)
1140 #define XFS_DFL_RTEXTSIZE (64 * 1024)
1141 #define XFS_MIN_RTEXTSIZE (4 * 1024)
1142
1143 #define XFS_BLOCKSIZE(mp) ((mp)->m_sb.sb_blocksize)
1144 #define XFS_BLOCKMASK(mp) ((mp)->m_blockmask)
1145 #define XFS_BLOCKWSIZE(mp) ((mp)->m_blockwsize)
1146 #define XFS_BLOCKWMASK(mp) ((mp)->m_blockwmask)
1147
1148
1149
1150
1151 #define XFS_SUMOFFS(mp,ls,bb) ((int)((ls) * (mp)->m_sb.sb_rbmblocks + (bb)))
1152 #define XFS_SUMOFFSTOBLOCK(mp,s) \
1153 (((s) * (uint)sizeof(xfs_suminfo_t)) >> (mp)->m_sb.sb_blocklog)
1154 #define XFS_SUMPTR(mp,bp,so) \
1155 ((xfs_suminfo_t *)((bp)->b_addr + \
1156 (((so) * (uint)sizeof(xfs_suminfo_t)) & XFS_BLOCKMASK(mp))))
1157
1158 #define XFS_BITTOBLOCK(mp,bi) ((bi) >> (mp)->m_blkbit_log)
1159 #define XFS_BLOCKTOBIT(mp,bb) ((bb) << (mp)->m_blkbit_log)
1160 #define XFS_BITTOWORD(mp,bi) \
1161 ((int)(((bi) >> XFS_NBWORDLOG) & XFS_BLOCKWMASK(mp)))
1162
1163 #define XFS_RTMIN(a,b) ((a) < (b) ? (a) : (b))
1164 #define XFS_RTMAX(a,b) ((a) > (b) ? (a) : (b))
1165
1166 #define XFS_RTLOBIT(w) xfs_lowbit32(w)
1167 #define XFS_RTHIBIT(w) xfs_highbit32(w)
1168
1169 #define XFS_RTBLOCKLOG(b) xfs_highbit64(b)
1170
1171
1172
1173
1174 #define XFS_DQUOT_MAGIC 0x4451
1175 #define XFS_DQUOT_VERSION (uint8_t)0x01
1176
1177 #define XFS_DQTYPE_USER (1u << 0)
1178 #define XFS_DQTYPE_PROJ (1u << 1)
1179 #define XFS_DQTYPE_GROUP (1u << 2)
1180 #define XFS_DQTYPE_BIGTIME (1u << 7)
1181
1182
1183 #define XFS_DQTYPE_REC_MASK (XFS_DQTYPE_USER | \
1184 XFS_DQTYPE_PROJ | \
1185 XFS_DQTYPE_GROUP)
1186
1187 #define XFS_DQTYPE_ANY (XFS_DQTYPE_REC_MASK | \
1188 XFS_DQTYPE_BIGTIME)
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215 #define XFS_DQ_LEGACY_EXPIRY_MIN ((int64_t)1)
1216
1217
1218
1219
1220
1221 #define XFS_DQ_LEGACY_EXPIRY_MAX ((int64_t)U32_MAX)
1222
1223
1224
1225
1226
1227
1228 #define XFS_DQ_BIGTIME_EXPIRY_MIN (XFS_DQ_LEGACY_EXPIRY_MIN)
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239 #define XFS_DQ_BIGTIME_EXPIRY_MAX ((int64_t)4074815106U)
1240
1241
1242
1243
1244
1245 #define XFS_DQ_BIGTIME_SHIFT (2)
1246 #define XFS_DQ_BIGTIME_SLACK ((int64_t)(1ULL << XFS_DQ_BIGTIME_SHIFT) - 1)
1247
1248
1249 static inline uint32_t xfs_dq_unix_to_bigtime(time64_t unix_seconds)
1250 {
1251
1252
1253
1254
1255 return ((uint64_t)unix_seconds + XFS_DQ_BIGTIME_SLACK) >>
1256 XFS_DQ_BIGTIME_SHIFT;
1257 }
1258
1259
1260 static inline time64_t xfs_dq_bigtime_to_unix(uint32_t ondisk_seconds)
1261 {
1262 return (time64_t)ondisk_seconds << XFS_DQ_BIGTIME_SHIFT;
1263 }
1264
1265
1266
1267
1268
1269
1270 #define XFS_DQ_GRACE_MIN ((int64_t)0)
1271 #define XFS_DQ_GRACE_MAX ((int64_t)U32_MAX)
1272
1273
1274
1275
1276
1277
1278 struct xfs_disk_dquot {
1279 __be16 d_magic;
1280 __u8 d_version;
1281 __u8 d_type;
1282 __be32 d_id;
1283 __be64 d_blk_hardlimit;
1284 __be64 d_blk_softlimit;
1285 __be64 d_ino_hardlimit;
1286 __be64 d_ino_softlimit;
1287 __be64 d_bcount;
1288 __be64 d_icount;
1289 __be32 d_itimer;
1290
1291 __be32 d_btimer;
1292 __be16 d_iwarns;
1293 __be16 d_bwarns;
1294 __be32 d_pad0;
1295 __be64 d_rtb_hardlimit;
1296 __be64 d_rtb_softlimit;
1297 __be64 d_rtbcount;
1298 __be32 d_rtbtimer;
1299 __be16 d_rtbwarns;
1300 __be16 d_pad;
1301 };
1302
1303
1304
1305
1306
1307 struct xfs_dqblk {
1308 struct xfs_disk_dquot dd_diskdq;
1309 char dd_fill[4];
1310
1311
1312
1313
1314 __be32 dd_crc;
1315 __be64 dd_lsn;
1316 uuid_t dd_uuid;
1317 };
1318
1319 #define XFS_DQUOT_CRC_OFF offsetof(struct xfs_dqblk, dd_crc)
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335 #define XFS_DQUOT_CLUSTER_SIZE_FSB (xfs_filblks_t)1
1336
1337
1338
1339
1340 #define XFS_SYMLINK_MAGIC 0x58534c4d
1341
1342 struct xfs_dsymlink_hdr {
1343 __be32 sl_magic;
1344 __be32 sl_offset;
1345 __be32 sl_bytes;
1346 __be32 sl_crc;
1347 uuid_t sl_uuid;
1348 __be64 sl_owner;
1349 __be64 sl_blkno;
1350 __be64 sl_lsn;
1351 };
1352
1353 #define XFS_SYMLINK_CRC_OFF offsetof(struct xfs_dsymlink_hdr, sl_crc)
1354
1355 #define XFS_SYMLINK_MAXLEN 1024
1356
1357
1358
1359
1360
1361 #define XFS_SYMLINK_MAPS 3
1362
1363 #define XFS_SYMLINK_BUF_SPACE(mp, bufsize) \
1364 ((bufsize) - (xfs_has_crc((mp)) ? \
1365 sizeof(struct xfs_dsymlink_hdr) : 0))
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375 #define XFS_ABTB_MAGIC 0x41425442
1376 #define XFS_ABTB_CRC_MAGIC 0x41423342
1377 #define XFS_ABTC_MAGIC 0x41425443
1378 #define XFS_ABTC_CRC_MAGIC 0x41423343
1379
1380
1381
1382
1383 typedef struct xfs_alloc_rec {
1384 __be32 ar_startblock;
1385 __be32 ar_blockcount;
1386 } xfs_alloc_rec_t, xfs_alloc_key_t;
1387
1388 typedef struct xfs_alloc_rec_incore {
1389 xfs_agblock_t ar_startblock;
1390 xfs_extlen_t ar_blockcount;
1391 } xfs_alloc_rec_incore_t;
1392
1393
1394 typedef __be32 xfs_alloc_ptr_t;
1395
1396
1397
1398
1399
1400 #define XFS_BNO_BLOCK(mp) ((xfs_agblock_t)(XFS_AGFL_BLOCK(mp) + 1))
1401 #define XFS_CNT_BLOCK(mp) ((xfs_agblock_t)(XFS_BNO_BLOCK(mp) + 1))
1402
1403
1404
1405
1406
1407
1408
1409 #define XFS_IBT_MAGIC 0x49414254
1410 #define XFS_IBT_CRC_MAGIC 0x49414233
1411 #define XFS_FIBT_MAGIC 0x46494254
1412 #define XFS_FIBT_CRC_MAGIC 0x46494233
1413
1414 typedef uint64_t xfs_inofree_t;
1415 #define XFS_INODES_PER_CHUNK (NBBY * sizeof(xfs_inofree_t))
1416 #define XFS_INODES_PER_CHUNK_LOG (XFS_NBBYLOG + 3)
1417 #define XFS_INOBT_ALL_FREE ((xfs_inofree_t)-1)
1418 #define XFS_INOBT_MASK(i) ((xfs_inofree_t)1 << (i))
1419
1420 #define XFS_INOBT_HOLEMASK_FULL 0
1421 #define XFS_INOBT_HOLEMASK_BITS (NBBY * sizeof(uint16_t))
1422 #define XFS_INODES_PER_HOLEMASK_BIT \
1423 (XFS_INODES_PER_CHUNK / (NBBY * sizeof(uint16_t)))
1424
1425 static inline xfs_inofree_t xfs_inobt_maskn(int i, int n)
1426 {
1427 return ((n >= XFS_INODES_PER_CHUNK ? 0 : XFS_INOBT_MASK(n)) - 1) << i;
1428 }
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440 typedef struct xfs_inobt_rec {
1441 __be32 ir_startino;
1442 union {
1443 struct {
1444 __be32 ir_freecount;
1445 } f;
1446 struct {
1447 __be16 ir_holemask;
1448 __u8 ir_count;
1449 __u8 ir_freecount;
1450 } sp;
1451 } ir_u;
1452 __be64 ir_free;
1453 } xfs_inobt_rec_t;
1454
1455 typedef struct xfs_inobt_rec_incore {
1456 xfs_agino_t ir_startino;
1457 uint16_t ir_holemask;
1458 uint8_t ir_count;
1459 uint8_t ir_freecount;
1460 xfs_inofree_t ir_free;
1461 } xfs_inobt_rec_incore_t;
1462
1463 static inline bool xfs_inobt_issparse(uint16_t holemask)
1464 {
1465
1466 return holemask;
1467 }
1468
1469
1470
1471
1472 typedef struct xfs_inobt_key {
1473 __be32 ir_startino;
1474 } xfs_inobt_key_t;
1475
1476
1477 typedef __be32 xfs_inobt_ptr_t;
1478
1479
1480
1481
1482 #define XFS_IBT_BLOCK(mp) ((xfs_agblock_t)(XFS_CNT_BLOCK(mp) + 1))
1483 #define XFS_FIBT_BLOCK(mp) ((xfs_agblock_t)(XFS_IBT_BLOCK(mp) + 1))
1484
1485
1486
1487
1488
1489
1490 #define XFS_RMAP_CRC_MAGIC 0x524d4233
1491
1492
1493
1494
1495
1496 #define XFS_OWNER_INFO_ATTR_FORK (1 << 0)
1497 #define XFS_OWNER_INFO_BMBT_BLOCK (1 << 1)
1498 struct xfs_owner_info {
1499 uint64_t oi_owner;
1500 xfs_fileoff_t oi_offset;
1501 unsigned int oi_flags;
1502 };
1503
1504
1505
1506
1507
1508
1509
1510
1511 #define XFS_RMAP_OWN_NULL (-1ULL)
1512 #define XFS_RMAP_OWN_UNKNOWN (-2ULL)
1513 #define XFS_RMAP_OWN_FS (-3ULL)
1514 #define XFS_RMAP_OWN_LOG (-4ULL)
1515 #define XFS_RMAP_OWN_AG (-5ULL)
1516 #define XFS_RMAP_OWN_INOBT (-6ULL)
1517 #define XFS_RMAP_OWN_INODES (-7ULL)
1518 #define XFS_RMAP_OWN_REFC (-8ULL)
1519 #define XFS_RMAP_OWN_COW (-9ULL)
1520 #define XFS_RMAP_OWN_MIN (-10ULL)
1521
1522 #define XFS_RMAP_NON_INODE_OWNER(owner) (!!((owner) & (1ULL << 63)))
1523
1524
1525
1526
1527 struct xfs_rmap_rec {
1528 __be32 rm_startblock;
1529 __be32 rm_blockcount;
1530 __be64 rm_owner;
1531 __be64 rm_offset;
1532 };
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542 #define XFS_RMAP_OFF_ATTR_FORK ((uint64_t)1ULL << 63)
1543 #define XFS_RMAP_OFF_BMBT_BLOCK ((uint64_t)1ULL << 62)
1544 #define XFS_RMAP_OFF_UNWRITTEN ((uint64_t)1ULL << 61)
1545
1546 #define XFS_RMAP_LEN_MAX ((uint32_t)~0U)
1547 #define XFS_RMAP_OFF_FLAGS (XFS_RMAP_OFF_ATTR_FORK | \
1548 XFS_RMAP_OFF_BMBT_BLOCK | \
1549 XFS_RMAP_OFF_UNWRITTEN)
1550 #define XFS_RMAP_OFF_MASK ((uint64_t)0x3FFFFFFFFFFFFFULL)
1551
1552 #define XFS_RMAP_OFF(off) ((off) & XFS_RMAP_OFF_MASK)
1553
1554 #define XFS_RMAP_IS_BMBT_BLOCK(off) (!!((off) & XFS_RMAP_OFF_BMBT_BLOCK))
1555 #define XFS_RMAP_IS_ATTR_FORK(off) (!!((off) & XFS_RMAP_OFF_ATTR_FORK))
1556 #define XFS_RMAP_IS_UNWRITTEN(len) (!!((off) & XFS_RMAP_OFF_UNWRITTEN))
1557
1558 #define RMAPBT_STARTBLOCK_BITLEN 32
1559 #define RMAPBT_BLOCKCOUNT_BITLEN 32
1560 #define RMAPBT_OWNER_BITLEN 64
1561 #define RMAPBT_ATTRFLAG_BITLEN 1
1562 #define RMAPBT_BMBTFLAG_BITLEN 1
1563 #define RMAPBT_EXNTFLAG_BITLEN 1
1564 #define RMAPBT_UNUSED_OFFSET_BITLEN 7
1565 #define RMAPBT_OFFSET_BITLEN 54
1566
1567 #define XFS_RMAP_ATTR_FORK (1 << 0)
1568 #define XFS_RMAP_BMBT_BLOCK (1 << 1)
1569 #define XFS_RMAP_UNWRITTEN (1 << 2)
1570 #define XFS_RMAP_KEY_FLAGS (XFS_RMAP_ATTR_FORK | \
1571 XFS_RMAP_BMBT_BLOCK)
1572 #define XFS_RMAP_REC_FLAGS (XFS_RMAP_UNWRITTEN)
1573 struct xfs_rmap_irec {
1574 xfs_agblock_t rm_startblock;
1575 xfs_extlen_t rm_blockcount;
1576 uint64_t rm_owner;
1577 uint64_t rm_offset;
1578 unsigned int rm_flags;
1579 };
1580
1581
1582
1583
1584
1585
1586 struct xfs_rmap_key {
1587 __be32 rm_startblock;
1588 __be64 rm_owner;
1589 __be64 rm_offset;
1590 } __attribute__((packed));
1591
1592
1593 typedef __be32 xfs_rmap_ptr_t;
1594
1595 #define XFS_RMAP_BLOCK(mp) \
1596 (xfs_has_finobt(((mp))) ? \
1597 XFS_FIBT_BLOCK(mp) + 1 : \
1598 XFS_IBT_BLOCK(mp) + 1)
1599
1600
1601
1602
1603
1604 #define XFS_REFC_CRC_MAGIC 0x52334643
1605
1606 unsigned int xfs_refc_block(struct xfs_mount *mp);
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629 #define XFS_REFC_COW_START ((xfs_agblock_t)(1U << 31))
1630 #define REFCNTBT_COWFLAG_BITLEN 1
1631 #define REFCNTBT_AGBLOCK_BITLEN 31
1632
1633 struct xfs_refcount_rec {
1634 __be32 rc_startblock;
1635 __be32 rc_blockcount;
1636 __be32 rc_refcount;
1637 };
1638
1639 struct xfs_refcount_key {
1640 __be32 rc_startblock;
1641 };
1642
1643 struct xfs_refcount_irec {
1644 xfs_agblock_t rc_startblock;
1645 xfs_extlen_t rc_blockcount;
1646 xfs_nlink_t rc_refcount;
1647 };
1648
1649 #define MAXREFCOUNT ((xfs_nlink_t)~0U)
1650 #define MAXREFCEXTLEN ((xfs_extlen_t)~0U)
1651
1652
1653 typedef __be32 xfs_refcount_ptr_t;
1654
1655
1656
1657
1658
1659
1660
1661
1662 #define XFS_BMAP_MAGIC 0x424d4150
1663 #define XFS_BMAP_CRC_MAGIC 0x424d4133
1664
1665
1666
1667
1668 typedef struct xfs_bmdr_block {
1669 __be16 bb_level;
1670 __be16 bb_numrecs;
1671 } xfs_bmdr_block_t;
1672
1673
1674
1675
1676
1677
1678
1679
1680 #define BMBT_EXNTFLAG_BITLEN 1
1681 #define BMBT_STARTOFF_BITLEN 54
1682 #define BMBT_STARTBLOCK_BITLEN 52
1683 #define BMBT_BLOCKCOUNT_BITLEN 21
1684
1685 #define BMBT_STARTOFF_MASK ((1ULL << BMBT_STARTOFF_BITLEN) - 1)
1686 #define BMBT_BLOCKCOUNT_MASK ((1ULL << BMBT_BLOCKCOUNT_BITLEN) - 1)
1687
1688 #define XFS_MAX_BMBT_EXTLEN ((xfs_extlen_t)(BMBT_BLOCKCOUNT_MASK))
1689
1690
1691
1692
1693
1694 #define XFS_MAX_FILEOFF (BMBT_STARTOFF_MASK + BMBT_BLOCKCOUNT_MASK)
1695
1696 typedef struct xfs_bmbt_rec {
1697 __be64 l0, l1;
1698 } xfs_bmbt_rec_t;
1699
1700 typedef uint64_t xfs_bmbt_rec_base_t;
1701 typedef xfs_bmbt_rec_t xfs_bmdr_rec_t;
1702
1703
1704
1705
1706 #define STARTBLOCKVALBITS 17
1707 #define STARTBLOCKMASKBITS (15 + 20)
1708 #define STARTBLOCKMASK \
1709 (((((xfs_fsblock_t)1) << STARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS)
1710
1711 static inline int isnullstartblock(xfs_fsblock_t x)
1712 {
1713 return ((x) & STARTBLOCKMASK) == STARTBLOCKMASK;
1714 }
1715
1716 static inline xfs_fsblock_t nullstartblock(int k)
1717 {
1718 ASSERT(k < (1 << STARTBLOCKVALBITS));
1719 return STARTBLOCKMASK | (k);
1720 }
1721
1722 static inline xfs_filblks_t startblockval(xfs_fsblock_t x)
1723 {
1724 return (xfs_filblks_t)((x) & ~STARTBLOCKMASK);
1725 }
1726
1727
1728
1729
1730 typedef struct xfs_bmbt_key {
1731 __be64 br_startoff;
1732 } xfs_bmbt_key_t, xfs_bmdr_key_t;
1733
1734
1735 typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t;
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753 struct xfs_btree_block_shdr {
1754 __be32 bb_leftsib;
1755 __be32 bb_rightsib;
1756
1757 __be64 bb_blkno;
1758 __be64 bb_lsn;
1759 uuid_t bb_uuid;
1760 __be32 bb_owner;
1761 __le32 bb_crc;
1762 };
1763
1764
1765 struct xfs_btree_block_lhdr {
1766 __be64 bb_leftsib;
1767 __be64 bb_rightsib;
1768
1769 __be64 bb_blkno;
1770 __be64 bb_lsn;
1771 uuid_t bb_uuid;
1772 __be64 bb_owner;
1773 __le32 bb_crc;
1774 __be32 bb_pad;
1775 };
1776
1777 struct xfs_btree_block {
1778 __be32 bb_magic;
1779 __be16 bb_level;
1780 __be16 bb_numrecs;
1781 union {
1782 struct xfs_btree_block_shdr s;
1783 struct xfs_btree_block_lhdr l;
1784 } bb_u;
1785 };
1786
1787
1788 #define XFS_BTREE_SBLOCK_LEN \
1789 (offsetof(struct xfs_btree_block, bb_u) + \
1790 offsetof(struct xfs_btree_block_shdr, bb_blkno))
1791
1792 #define XFS_BTREE_LBLOCK_LEN \
1793 (offsetof(struct xfs_btree_block, bb_u) + \
1794 offsetof(struct xfs_btree_block_lhdr, bb_blkno))
1795
1796
1797 #define XFS_BTREE_SBLOCK_CRC_LEN \
1798 (offsetof(struct xfs_btree_block, bb_u) + \
1799 sizeof(struct xfs_btree_block_shdr))
1800 #define XFS_BTREE_LBLOCK_CRC_LEN \
1801 (offsetof(struct xfs_btree_block, bb_u) + \
1802 sizeof(struct xfs_btree_block_lhdr))
1803
1804 #define XFS_BTREE_SBLOCK_CRC_OFF \
1805 offsetof(struct xfs_btree_block, bb_u.s.bb_crc)
1806 #define XFS_BTREE_LBLOCK_CRC_OFF \
1807 offsetof(struct xfs_btree_block, bb_u.l.bb_crc)
1808
1809
1810
1811
1812 struct xfs_acl_entry {
1813 __be32 ae_tag;
1814 __be32 ae_id;
1815 __be16 ae_perm;
1816 __be16 ae_pad;
1817 };
1818
1819 struct xfs_acl {
1820 __be32 acl_cnt;
1821 struct xfs_acl_entry acl_entry[];
1822 };
1823
1824
1825
1826
1827
1828
1829 #define XFS_ACL_MAX_ENTRIES(mp) \
1830 (xfs_has_crc(mp) \
1831 ? (XFS_XATTR_SIZE_MAX - sizeof(struct xfs_acl)) / \
1832 sizeof(struct xfs_acl_entry) \
1833 : 25)
1834
1835 #define XFS_ACL_SIZE(cnt) \
1836 (sizeof(struct xfs_acl) + \
1837 sizeof(struct xfs_acl_entry) * cnt)
1838
1839 #define XFS_ACL_MAX_SIZE(mp) \
1840 XFS_ACL_SIZE(XFS_ACL_MAX_ENTRIES((mp)))
1841
1842
1843
1844 #define SGI_ACL_FILE "SGI_ACL_FILE"
1845 #define SGI_ACL_DEFAULT "SGI_ACL_DEFAULT"
1846 #define SGI_ACL_FILE_SIZE (sizeof(SGI_ACL_FILE)-1)
1847 #define SGI_ACL_DEFAULT_SIZE (sizeof(SGI_ACL_DEFAULT)-1)
1848
1849 #endif