0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef _OCFS2_FS_H
0011 #define _OCFS2_FS_H
0012
0013 #include <linux/magic.h>
0014
0015
0016 #define OCFS2_MAJOR_REV_LEVEL 0
0017 #define OCFS2_MINOR_REV_LEVEL 90
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 #define OCFS2_SUPER_BLOCK_BLKNO 2
0031
0032
0033
0034
0035
0036 #define OCFS2_MIN_CLUSTERSIZE 4096
0037 #define OCFS2_MAX_CLUSTERSIZE 1048576
0038
0039
0040
0041
0042
0043 #define OCFS2_MIN_BLOCKSIZE 512
0044 #define OCFS2_MAX_BLOCKSIZE OCFS2_MIN_CLUSTERSIZE
0045
0046
0047 #define OCFS2_SUPER_BLOCK_SIGNATURE "OCFSV2"
0048 #define OCFS2_INODE_SIGNATURE "INODE01"
0049 #define OCFS2_EXTENT_BLOCK_SIGNATURE "EXBLK01"
0050 #define OCFS2_GROUP_DESC_SIGNATURE "GROUP01"
0051 #define OCFS2_XATTR_BLOCK_SIGNATURE "XATTR01"
0052 #define OCFS2_DIR_TRAILER_SIGNATURE "DIRTRL1"
0053 #define OCFS2_DX_ROOT_SIGNATURE "DXDIR01"
0054 #define OCFS2_DX_LEAF_SIGNATURE "DXLEAF1"
0055 #define OCFS2_REFCOUNT_BLOCK_SIGNATURE "REFCNT1"
0056
0057
0058 #define OCFS2_HAS_COMPAT_FEATURE(sb,mask) \
0059 ( OCFS2_SB(sb)->s_feature_compat & (mask) )
0060 #define OCFS2_HAS_RO_COMPAT_FEATURE(sb,mask) \
0061 ( OCFS2_SB(sb)->s_feature_ro_compat & (mask) )
0062 #define OCFS2_HAS_INCOMPAT_FEATURE(sb,mask) \
0063 ( OCFS2_SB(sb)->s_feature_incompat & (mask) )
0064 #define OCFS2_SET_COMPAT_FEATURE(sb,mask) \
0065 OCFS2_SB(sb)->s_feature_compat |= (mask)
0066 #define OCFS2_SET_RO_COMPAT_FEATURE(sb,mask) \
0067 OCFS2_SB(sb)->s_feature_ro_compat |= (mask)
0068 #define OCFS2_SET_INCOMPAT_FEATURE(sb,mask) \
0069 OCFS2_SB(sb)->s_feature_incompat |= (mask)
0070 #define OCFS2_CLEAR_COMPAT_FEATURE(sb,mask) \
0071 OCFS2_SB(sb)->s_feature_compat &= ~(mask)
0072 #define OCFS2_CLEAR_RO_COMPAT_FEATURE(sb,mask) \
0073 OCFS2_SB(sb)->s_feature_ro_compat &= ~(mask)
0074 #define OCFS2_CLEAR_INCOMPAT_FEATURE(sb,mask) \
0075 OCFS2_SB(sb)->s_feature_incompat &= ~(mask)
0076
0077 #define OCFS2_FEATURE_COMPAT_SUPP (OCFS2_FEATURE_COMPAT_BACKUP_SB \
0078 | OCFS2_FEATURE_COMPAT_JBD2_SB)
0079 #define OCFS2_FEATURE_INCOMPAT_SUPP (OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT \
0080 | OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC \
0081 | OCFS2_FEATURE_INCOMPAT_INLINE_DATA \
0082 | OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP \
0083 | OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK \
0084 | OCFS2_FEATURE_INCOMPAT_XATTR \
0085 | OCFS2_FEATURE_INCOMPAT_META_ECC \
0086 | OCFS2_FEATURE_INCOMPAT_INDEXED_DIRS \
0087 | OCFS2_FEATURE_INCOMPAT_REFCOUNT_TREE \
0088 | OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG \
0089 | OCFS2_FEATURE_INCOMPAT_CLUSTERINFO \
0090 | OCFS2_FEATURE_INCOMPAT_APPEND_DIO)
0091 #define OCFS2_FEATURE_RO_COMPAT_SUPP (OCFS2_FEATURE_RO_COMPAT_UNWRITTEN \
0092 | OCFS2_FEATURE_RO_COMPAT_USRQUOTA \
0093 | OCFS2_FEATURE_RO_COMPAT_GRPQUOTA)
0094
0095
0096
0097
0098
0099
0100 #define OCFS2_FEATURE_INCOMPAT_HEARTBEAT_DEV 0x0002
0101
0102
0103
0104
0105
0106
0107 #define OCFS2_FEATURE_INCOMPAT_RESIZE_INPROG 0x0004
0108
0109
0110 #define OCFS2_FEATURE_INCOMPAT_LOCAL_MOUNT 0x0008
0111
0112
0113 #define OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC 0x0010
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124 #define OCFS2_FEATURE_INCOMPAT_TUNEFS_INPROG 0x0020
0125
0126
0127 #define OCFS2_FEATURE_INCOMPAT_INLINE_DATA 0x0040
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138 #define OCFS2_FEATURE_INCOMPAT_USERSPACE_STACK 0x0080
0139
0140
0141 #define OCFS2_FEATURE_INCOMPAT_EXTENDED_SLOT_MAP 0x100
0142
0143
0144 #define OCFS2_FEATURE_INCOMPAT_XATTR 0x0200
0145
0146
0147 #define OCFS2_FEATURE_INCOMPAT_INDEXED_DIRS 0x0400
0148
0149
0150 #define OCFS2_FEATURE_INCOMPAT_META_ECC 0x0800
0151
0152
0153 #define OCFS2_FEATURE_INCOMPAT_REFCOUNT_TREE 0x1000
0154
0155
0156 #define OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG 0x2000
0157
0158
0159
0160
0161
0162
0163 #define OCFS2_FEATURE_INCOMPAT_CLUSTERINFO 0x4000
0164
0165
0166
0167
0168 #define OCFS2_FEATURE_INCOMPAT_APPEND_DIO 0x8000
0169
0170
0171
0172
0173
0174 #define OCFS2_FEATURE_COMPAT_BACKUP_SB 0x0001
0175
0176
0177
0178
0179 #define OCFS2_FEATURE_COMPAT_JBD2_SB 0x0002
0180
0181
0182
0183
0184 #define OCFS2_FEATURE_RO_COMPAT_UNWRITTEN 0x0001
0185
0186
0187
0188
0189 #define OCFS2_FEATURE_RO_COMPAT_USRQUOTA 0x0002
0190 #define OCFS2_FEATURE_RO_COMPAT_GRPQUOTA 0x0004
0191
0192
0193
0194
0195
0196 #define OCFS2_BACKUP_SB_START 1 << 30
0197
0198
0199 #define OCFS2_MAX_BACKUP_SUPERBLOCKS 6
0200
0201
0202
0203
0204 #define OCFS2_TUNEFS_INPROG_REMOVE_SLOT 0x0001
0205
0206
0207
0208
0209 #define OCFS2_VALID_FL (0x00000001)
0210 #define OCFS2_UNUSED2_FL (0x00000002)
0211 #define OCFS2_ORPHANED_FL (0x00000004)
0212 #define OCFS2_UNUSED3_FL (0x00000008)
0213
0214 #define OCFS2_SYSTEM_FL (0x00000010)
0215 #define OCFS2_SUPER_BLOCK_FL (0x00000020)
0216 #define OCFS2_LOCAL_ALLOC_FL (0x00000040)
0217 #define OCFS2_BITMAP_FL (0x00000080)
0218 #define OCFS2_JOURNAL_FL (0x00000100)
0219 #define OCFS2_HEARTBEAT_FL (0x00000200)
0220 #define OCFS2_CHAIN_FL (0x00000400)
0221 #define OCFS2_DEALLOC_FL (0x00000800)
0222 #define OCFS2_QUOTA_FL (0x00001000)
0223 #define OCFS2_DIO_ORPHANED_FL (0X00002000)
0224
0225
0226
0227
0228
0229
0230
0231
0232 #define OCFS2_INLINE_DATA_FL (0x0001)
0233 #define OCFS2_HAS_XATTR_FL (0x0002)
0234 #define OCFS2_INLINE_XATTR_FL (0x0004)
0235 #define OCFS2_INDEXED_DIR_FL (0x0008)
0236 #define OCFS2_HAS_REFCOUNT_FL (0x0010)
0237
0238
0239 #define OCFS2_SECRM_FL FS_SECRM_FL
0240 #define OCFS2_UNRM_FL FS_UNRM_FL
0241 #define OCFS2_COMPR_FL FS_COMPR_FL
0242 #define OCFS2_SYNC_FL FS_SYNC_FL
0243 #define OCFS2_IMMUTABLE_FL FS_IMMUTABLE_FL
0244 #define OCFS2_APPEND_FL FS_APPEND_FL
0245 #define OCFS2_NODUMP_FL FS_NODUMP_FL
0246 #define OCFS2_NOATIME_FL FS_NOATIME_FL
0247
0248 #define OCFS2_DIRTY_FL FS_DIRTY_FL
0249 #define OCFS2_COMPRBLK_FL FS_COMPRBLK_FL
0250 #define OCFS2_NOCOMP_FL FS_NOCOMP_FL
0251 #define OCFS2_ECOMPR_FL FS_ECOMPR_FL
0252
0253 #define OCFS2_BTREE_FL FS_BTREE_FL
0254 #define OCFS2_INDEX_FL FS_INDEX_FL
0255 #define OCFS2_IMAGIC_FL FS_IMAGIC_FL
0256 #define OCFS2_JOURNAL_DATA_FL FS_JOURNAL_DATA_FL
0257 #define OCFS2_NOTAIL_FL FS_NOTAIL_FL
0258 #define OCFS2_DIRSYNC_FL FS_DIRSYNC_FL
0259 #define OCFS2_TOPDIR_FL FS_TOPDIR_FL
0260 #define OCFS2_RESERVED_FL FS_RESERVED_FL
0261
0262 #define OCFS2_FL_VISIBLE FS_FL_USER_VISIBLE
0263 #define OCFS2_FL_MODIFIABLE FS_FL_USER_MODIFIABLE
0264
0265
0266
0267
0268 #define OCFS2_EXT_UNWRITTEN (0x01)
0269
0270 #define OCFS2_EXT_REFCOUNTED (0x02)
0271
0272
0273
0274
0275
0276
0277 #define OCFS2_JOURNAL_DIRTY_FL (0x00000001)
0278
0279
0280
0281
0282 #define OCFS2_ERROR_FS (0x00000001)
0283
0284
0285 #define OCFS2_MAX_FILENAME_LEN 255
0286
0287
0288 #define OCFS2_MAX_SLOTS 255
0289
0290
0291 #define OCFS2_INVALID_SLOT ((u16)-1)
0292
0293 #define OCFS2_VOL_UUID_LEN 16
0294 #define OCFS2_MAX_VOL_LABEL_LEN 64
0295
0296
0297 #define OCFS2_STACK_LABEL_LEN 4
0298 #define OCFS2_CLUSTER_NAME_LEN 16
0299
0300
0301 #define OCFS2_CLASSIC_CLUSTER_STACK "o2cb"
0302
0303
0304 #define OCFS2_MIN_JOURNAL_SIZE (4 * 1024 * 1024)
0305
0306
0307
0308
0309
0310 #define OCFS2_MIN_XATTR_INLINE_SIZE 256
0311
0312
0313
0314
0315 #define OCFS2_CLUSTER_O2CB_GLOBAL_HEARTBEAT (0x01)
0316
0317 struct ocfs2_system_inode_info {
0318 char *si_name;
0319 int si_iflags;
0320 int si_mode;
0321 };
0322
0323
0324 enum {
0325 BAD_BLOCK_SYSTEM_INODE = 0,
0326 GLOBAL_INODE_ALLOC_SYSTEM_INODE,
0327 #define OCFS2_FIRST_ONLINE_SYSTEM_INODE GLOBAL_INODE_ALLOC_SYSTEM_INODE
0328 SLOT_MAP_SYSTEM_INODE,
0329 HEARTBEAT_SYSTEM_INODE,
0330 GLOBAL_BITMAP_SYSTEM_INODE,
0331 USER_QUOTA_SYSTEM_INODE,
0332 GROUP_QUOTA_SYSTEM_INODE,
0333 #define OCFS2_LAST_GLOBAL_SYSTEM_INODE GROUP_QUOTA_SYSTEM_INODE
0334 #define OCFS2_FIRST_LOCAL_SYSTEM_INODE ORPHAN_DIR_SYSTEM_INODE
0335 ORPHAN_DIR_SYSTEM_INODE,
0336 EXTENT_ALLOC_SYSTEM_INODE,
0337 INODE_ALLOC_SYSTEM_INODE,
0338 JOURNAL_SYSTEM_INODE,
0339 LOCAL_ALLOC_SYSTEM_INODE,
0340 TRUNCATE_LOG_SYSTEM_INODE,
0341 LOCAL_USER_QUOTA_SYSTEM_INODE,
0342 LOCAL_GROUP_QUOTA_SYSTEM_INODE,
0343 #define OCFS2_LAST_LOCAL_SYSTEM_INODE LOCAL_GROUP_QUOTA_SYSTEM_INODE
0344 NUM_SYSTEM_INODES
0345 };
0346 #define NUM_GLOBAL_SYSTEM_INODES OCFS2_FIRST_LOCAL_SYSTEM_INODE
0347 #define NUM_LOCAL_SYSTEM_INODES \
0348 (NUM_SYSTEM_INODES - OCFS2_FIRST_LOCAL_SYSTEM_INODE)
0349
0350 static struct ocfs2_system_inode_info ocfs2_system_inodes[NUM_SYSTEM_INODES] = {
0351
0352
0353 [BAD_BLOCK_SYSTEM_INODE] = { "bad_blocks", 0, S_IFREG | 0644 },
0354 [GLOBAL_INODE_ALLOC_SYSTEM_INODE] = { "global_inode_alloc", OCFS2_BITMAP_FL | OCFS2_CHAIN_FL, S_IFREG | 0644 },
0355
0356
0357 [SLOT_MAP_SYSTEM_INODE] = { "slot_map", 0, S_IFREG | 0644 },
0358 [HEARTBEAT_SYSTEM_INODE] = { "heartbeat", OCFS2_HEARTBEAT_FL, S_IFREG | 0644 },
0359 [GLOBAL_BITMAP_SYSTEM_INODE] = { "global_bitmap", 0, S_IFREG | 0644 },
0360 [USER_QUOTA_SYSTEM_INODE] = { "aquota.user", OCFS2_QUOTA_FL, S_IFREG | 0644 },
0361 [GROUP_QUOTA_SYSTEM_INODE] = { "aquota.group", OCFS2_QUOTA_FL, S_IFREG | 0644 },
0362
0363
0364 [ORPHAN_DIR_SYSTEM_INODE] = { "orphan_dir:%04d", 0, S_IFDIR | 0755 },
0365 [EXTENT_ALLOC_SYSTEM_INODE] = { "extent_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_CHAIN_FL, S_IFREG | 0644 },
0366 [INODE_ALLOC_SYSTEM_INODE] = { "inode_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_CHAIN_FL, S_IFREG | 0644 },
0367 [JOURNAL_SYSTEM_INODE] = { "journal:%04d", OCFS2_JOURNAL_FL, S_IFREG | 0644 },
0368 [LOCAL_ALLOC_SYSTEM_INODE] = { "local_alloc:%04d", OCFS2_BITMAP_FL | OCFS2_LOCAL_ALLOC_FL, S_IFREG | 0644 },
0369 [TRUNCATE_LOG_SYSTEM_INODE] = { "truncate_log:%04d", OCFS2_DEALLOC_FL, S_IFREG | 0644 },
0370 [LOCAL_USER_QUOTA_SYSTEM_INODE] = { "aquota.user:%04d", OCFS2_QUOTA_FL, S_IFREG | 0644 },
0371 [LOCAL_GROUP_QUOTA_SYSTEM_INODE] = { "aquota.group:%04d", OCFS2_QUOTA_FL, S_IFREG | 0644 },
0372 };
0373
0374
0375 #define OCFS2_HB_NONE "heartbeat=none"
0376 #define OCFS2_HB_LOCAL "heartbeat=local"
0377 #define OCFS2_HB_GLOBAL "heartbeat=global"
0378
0379
0380
0381
0382
0383
0384 #define OCFS2_DIR_PAD 4
0385 #define OCFS2_DIR_ROUND (OCFS2_DIR_PAD - 1)
0386 #define OCFS2_DIR_MEMBER_LEN offsetof(struct ocfs2_dir_entry, name)
0387 #define OCFS2_DIR_REC_LEN(name_len) (((name_len) + OCFS2_DIR_MEMBER_LEN + \
0388 OCFS2_DIR_ROUND) & \
0389 ~OCFS2_DIR_ROUND)
0390 #define OCFS2_DIR_MIN_REC_LEN OCFS2_DIR_REC_LEN(1)
0391
0392 #define OCFS2_LINK_MAX 32000
0393 #define OCFS2_DX_LINK_MAX ((1U << 31) - 1U)
0394 #define OCFS2_LINKS_HI_SHIFT 16
0395 #define OCFS2_DX_ENTRIES_MAX (0xffffffffU)
0396
0397
0398
0399
0400
0401 #define OCFS2_RAW_SB(dinode) (&((dinode)->id2.i_super))
0402
0403
0404
0405
0406
0407
0408 struct ocfs2_block_check {
0409 __le32 bc_crc32e;
0410 __le16 bc_ecc;
0411
0412
0413
0414
0415 __le16 bc_reserved1;
0416
0417 };
0418
0419
0420
0421
0422
0423
0424
0425
0426 struct ocfs2_extent_rec {
0427 __le32 e_cpos;
0428 union {
0429 __le32 e_int_clusters;
0430 struct {
0431 __le16 e_leaf_clusters;
0432
0433 __u8 e_reserved1;
0434 __u8 e_flags;
0435 };
0436 };
0437 __le64 e_blkno;
0438
0439 };
0440
0441 struct ocfs2_chain_rec {
0442 __le32 c_free;
0443 __le32 c_total;
0444 __le64 c_blkno;
0445 };
0446
0447 struct ocfs2_truncate_rec {
0448 __le32 t_start;
0449 __le32 t_clusters;
0450 };
0451
0452
0453
0454
0455
0456
0457
0458 struct ocfs2_extent_list {
0459 __le16 l_tree_depth;
0460
0461
0462
0463
0464
0465
0466 __le16 l_count;
0467 __le16 l_next_free_rec;
0468 __le16 l_reserved1;
0469 __le64 l_reserved2;
0470
0471 struct ocfs2_extent_rec l_recs[];
0472 };
0473
0474
0475
0476
0477
0478
0479 struct ocfs2_chain_list {
0480 __le16 cl_cpg;
0481 __le16 cl_bpc;
0482 __le16 cl_count;
0483 __le16 cl_next_free_rec;
0484 __le64 cl_reserved1;
0485 struct ocfs2_chain_rec cl_recs[];
0486 };
0487
0488
0489
0490
0491
0492
0493 struct ocfs2_truncate_log {
0494 __le16 tl_count;
0495 __le16 tl_used;
0496 __le32 tl_reserved1;
0497 struct ocfs2_truncate_rec tl_recs[];
0498 };
0499
0500
0501
0502
0503 struct ocfs2_extent_block
0504 {
0505 __u8 h_signature[8];
0506 struct ocfs2_block_check h_check;
0507 __le16 h_suballoc_slot;
0508
0509 __le16 h_suballoc_bit;
0510
0511 __le32 h_fs_generation;
0512 __le64 h_blkno;
0513 __le64 h_suballoc_loc;
0514
0515
0516
0517 __le64 h_next_leaf_blk;
0518
0519
0520 struct ocfs2_extent_list h_list;
0521
0522 };
0523
0524
0525
0526
0527
0528
0529 struct ocfs2_slot_map {
0530 __le16 sm_slots[0];
0531
0532
0533
0534
0535 };
0536
0537 struct ocfs2_extended_slot {
0538 __u8 es_valid;
0539 __u8 es_reserved1[3];
0540 __le32 es_node_num;
0541
0542 };
0543
0544
0545
0546
0547
0548
0549
0550 struct ocfs2_slot_map_extended {
0551 struct ocfs2_extended_slot se_slots[0];
0552
0553
0554
0555
0556 };
0557
0558
0559
0560
0561
0562 struct ocfs2_cluster_info {
0563 __u8 ci_stack[OCFS2_STACK_LABEL_LEN];
0564 union {
0565 __le32 ci_reserved;
0566 struct {
0567 __u8 ci_stackflags;
0568 __u8 ci_reserved1;
0569 __u8 ci_reserved2;
0570 __u8 ci_reserved3;
0571 };
0572 };
0573 __u8 ci_cluster[OCFS2_CLUSTER_NAME_LEN];
0574
0575 };
0576
0577
0578
0579
0580
0581
0582 struct ocfs2_super_block {
0583 __le16 s_major_rev_level;
0584 __le16 s_minor_rev_level;
0585 __le16 s_mnt_count;
0586 __le16 s_max_mnt_count;
0587 __le16 s_state;
0588 __le16 s_errors;
0589 __le32 s_checkinterval;
0590 __le64 s_lastcheck;
0591 __le32 s_creator_os;
0592 __le32 s_feature_compat;
0593 __le32 s_feature_incompat;
0594 __le32 s_feature_ro_compat;
0595 __le64 s_root_blkno;
0596
0597 __le64 s_system_dir_blkno;
0598
0599 __le32 s_blocksize_bits;
0600 __le32 s_clustersize_bits;
0601 __le16 s_max_slots;
0602
0603 __le16 s_tunefs_flag;
0604 __le32 s_uuid_hash;
0605 __le64 s_first_cluster_group;
0606
0607 __u8 s_label[OCFS2_MAX_VOL_LABEL_LEN];
0608 __u8 s_uuid[OCFS2_VOL_UUID_LEN];
0609 struct ocfs2_cluster_info s_cluster_info;
0610
0611
0612 __le16 s_xattr_inline_size;
0613
0614 __le16 s_reserved0;
0615 __le32 s_dx_seed[3];
0616
0617 __le64 s_reserved2[15];
0618
0619
0620
0621
0622
0623
0624
0625
0626
0627
0628 };
0629
0630
0631
0632
0633
0634
0635 struct ocfs2_local_alloc
0636 {
0637 __le32 la_bm_off;
0638 __le16 la_size;
0639 __le16 la_reserved1;
0640 __le64 la_reserved2;
0641 __u8 la_bitmap[];
0642 };
0643
0644
0645
0646
0647
0648 struct ocfs2_inline_data
0649 {
0650 __le16 id_count;
0651
0652 __le16 id_reserved0;
0653 __le32 id_reserved1;
0654 __u8 id_data[];
0655 };
0656
0657
0658
0659
0660 struct ocfs2_dinode {
0661 __u8 i_signature[8];
0662 __le32 i_generation;
0663 __le16 i_suballoc_slot;
0664
0665 __le16 i_suballoc_bit;
0666
0667 __le16 i_links_count_hi;
0668 __le16 i_xattr_inline_size;
0669 __le32 i_clusters;
0670 __le32 i_uid;
0671 __le32 i_gid;
0672 __le64 i_size;
0673 __le16 i_mode;
0674 __le16 i_links_count;
0675 __le32 i_flags;
0676 __le64 i_atime;
0677 __le64 i_ctime;
0678 __le64 i_mtime;
0679 __le64 i_dtime;
0680 __le64 i_blkno;
0681 __le64 i_last_eb_blk;
0682
0683 __le32 i_fs_generation;
0684 __le32 i_atime_nsec;
0685 __le32 i_ctime_nsec;
0686 __le32 i_mtime_nsec;
0687 __le32 i_attr;
0688 __le16 i_orphaned_slot;
0689
0690 __le16 i_dyn_features;
0691 __le64 i_xattr_loc;
0692 struct ocfs2_block_check i_check;
0693 __le64 i_dx_root;
0694 __le64 i_refcount_loc;
0695 __le64 i_suballoc_loc;
0696
0697
0698
0699 __le16 i_dio_orphaned_slot;
0700 __le16 i_reserved1[3];
0701 __le64 i_reserved2[2];
0702 union {
0703 __le64 i_pad1;
0704
0705 struct {
0706 __le64 i_rdev;
0707 } dev1;
0708 struct {
0709
0710 __le32 i_used;
0711 __le32 i_total;
0712
0713 } bitmap1;
0714 struct {
0715
0716 __le32 ij_flags;
0717 __le32 ij_recovery_generation;
0718
0719
0720
0721 } journal1;
0722 } id1;
0723 union {
0724 struct ocfs2_super_block i_super;
0725 struct ocfs2_local_alloc i_lab;
0726 struct ocfs2_chain_list i_chain;
0727 struct ocfs2_extent_list i_list;
0728 struct ocfs2_truncate_log i_dealloc;
0729 struct ocfs2_inline_data i_data;
0730 __u8 i_symlink[0];
0731 } id2;
0732
0733 };
0734
0735
0736
0737
0738
0739
0740 struct ocfs2_dir_entry {
0741 __le64 inode;
0742 __le16 rec_len;
0743 __u8 name_len;
0744 __u8 file_type;
0745 char name[OCFS2_MAX_FILENAME_LEN];
0746
0747 } __attribute__ ((packed));
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757 struct ocfs2_dir_block_trailer {
0758 __le64 db_compat_inode;
0759
0760 __le16 db_compat_rec_len;
0761
0762 __u8 db_compat_name_len;
0763 __u8 db_reserved0;
0764 __le16 db_reserved1;
0765 __le16 db_free_rec_len;
0766
0767 __u8 db_signature[8];
0768 __le64 db_reserved2;
0769 __le64 db_free_next;
0770 __le64 db_blkno;
0771 __le64 db_parent_dinode;
0772
0773 struct ocfs2_block_check db_check;
0774
0775 };
0776
0777
0778
0779
0780
0781
0782
0783
0784 struct ocfs2_dx_entry {
0785 __le32 dx_major_hash;
0786
0787 __le32 dx_minor_hash;
0788
0789 __le64 dx_dirent_blk;
0790
0791 };
0792
0793 struct ocfs2_dx_entry_list {
0794 __le32 de_reserved;
0795 __le16 de_count;
0796
0797 __le16 de_num_used;
0798
0799 struct ocfs2_dx_entry de_entries[];
0800
0801
0802 };
0803
0804 #define OCFS2_DX_FLAG_INLINE 0x01
0805
0806
0807
0808
0809
0810
0811
0812
0813 struct ocfs2_dx_root_block {
0814 __u8 dr_signature[8];
0815 struct ocfs2_block_check dr_check;
0816 __le16 dr_suballoc_slot;
0817
0818 __le16 dr_suballoc_bit;
0819
0820 __le32 dr_fs_generation;
0821 __le64 dr_blkno;
0822 __le64 dr_last_eb_blk;
0823
0824 __le32 dr_clusters;
0825
0826 __u8 dr_flags;
0827 __u8 dr_reserved0;
0828 __le16 dr_reserved1;
0829 __le64 dr_dir_blkno;
0830 __le32 dr_num_entries;
0831
0832
0833 __le32 dr_reserved2;
0834 __le64 dr_free_blk;
0835
0836 __le64 dr_suballoc_loc;
0837
0838
0839
0840
0841 __le64 dr_reserved3[14];
0842 union {
0843 struct ocfs2_extent_list dr_list;
0844
0845
0846 struct ocfs2_dx_entry_list dr_entries;
0847
0848
0849
0850 };
0851 };
0852
0853
0854
0855
0856 struct ocfs2_dx_leaf {
0857 __u8 dl_signature[8];
0858 struct ocfs2_block_check dl_check;
0859 __le64 dl_blkno;
0860 __le32 dl_fs_generation;
0861 __le32 dl_reserved0;
0862 __le64 dl_reserved1;
0863 struct ocfs2_dx_entry_list dl_list;
0864 };
0865
0866
0867
0868
0869
0870
0871 #define OCFS2_MAX_BG_BITMAP_SIZE 256
0872
0873
0874
0875
0876 struct ocfs2_group_desc
0877 {
0878 __u8 bg_signature[8];
0879 __le16 bg_size;
0880
0881 __le16 bg_bits;
0882
0883 __le16 bg_free_bits_count;
0884 __le16 bg_chain;
0885 __le32 bg_generation;
0886 __le32 bg_reserved1;
0887 __le64 bg_next_group;
0888
0889 __le64 bg_parent_dinode;
0890
0891 __le64 bg_blkno;
0892 struct ocfs2_block_check bg_check;
0893 __le64 bg_reserved2;
0894 union {
0895 __u8 bg_bitmap[0];
0896 struct {
0897
0898
0899
0900
0901
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911
0912 __u8 bg_bitmap_filler[OCFS2_MAX_BG_BITMAP_SIZE];
0913 struct ocfs2_extent_list bg_list;
0914 };
0915 };
0916
0917 };
0918
0919 struct ocfs2_refcount_rec {
0920 __le64 r_cpos;
0921 __le32 r_clusters;
0922 __le32 r_refcount;
0923
0924 };
0925 #define OCFS2_32BIT_POS_MASK (0xffffffffULL)
0926
0927 #define OCFS2_REFCOUNT_LEAF_FL (0x00000001)
0928 #define OCFS2_REFCOUNT_TREE_FL (0x00000002)
0929
0930 struct ocfs2_refcount_list {
0931 __le16 rl_count;
0932
0933 __le16 rl_used;
0934 __le32 rl_reserved2;
0935 __le64 rl_reserved1;
0936 struct ocfs2_refcount_rec rl_recs[];
0937 };
0938
0939
0940 struct ocfs2_refcount_block {
0941 __u8 rf_signature[8];
0942 __le16 rf_suballoc_slot;
0943
0944 __le16 rf_suballoc_bit;
0945
0946 __le32 rf_fs_generation;
0947 __le64 rf_blkno;
0948 __le64 rf_parent;
0949
0950
0951 struct ocfs2_block_check rf_check;
0952 __le64 rf_last_eb_blk;
0953 __le32 rf_count;
0954
0955 __le32 rf_flags;
0956 __le32 rf_clusters;
0957 __le32 rf_cpos;
0958 __le32 rf_generation;
0959
0960 __le32 rf_reserved0;
0961 __le64 rf_suballoc_loc;
0962
0963
0964
0965 __le64 rf_reserved1[6];
0966 union {
0967 struct ocfs2_refcount_list rf_records;
0968
0969 struct ocfs2_extent_list rf_list;
0970
0971
0972
0973 };
0974
0975 };
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985
0986 struct ocfs2_xattr_entry {
0987 __le32 xe_name_hash;
0988 __le16 xe_name_offset;
0989
0990
0991 __u8 xe_name_len;
0992 __u8 xe_type;
0993
0994
0995 __le64 xe_value_size;
0996 };
0997
0998
0999
1000
1001
1002
1003
1004 struct ocfs2_xattr_header {
1005 __le16 xh_count;
1006
1007
1008 __le16 xh_free_start;
1009
1010 __le16 xh_name_value_len;
1011
1012 __le16 xh_num_buckets;
1013
1014
1015
1016 struct ocfs2_block_check xh_check;
1017
1018
1019
1020
1021
1022 struct ocfs2_xattr_entry xh_entries[];
1023 };
1024
1025
1026
1027
1028
1029
1030
1031 struct ocfs2_xattr_value_root {
1032 __le32 xr_clusters;
1033 __le32 xr_reserved0;
1034 __le64 xr_last_eb_blk;
1035 struct ocfs2_extent_list xr_list;
1036 };
1037
1038
1039
1040
1041
1042
1043
1044 struct ocfs2_xattr_tree_root {
1045 __le32 xt_clusters;
1046 __le32 xt_reserved0;
1047 __le64 xt_last_eb_blk;
1048 struct ocfs2_extent_list xt_list;
1049 };
1050
1051 #define OCFS2_XATTR_INDEXED 0x1
1052 #define OCFS2_HASH_SHIFT 5
1053 #define OCFS2_XATTR_ROUND 3
1054 #define OCFS2_XATTR_SIZE(size) (((size) + OCFS2_XATTR_ROUND) & \
1055 ~(OCFS2_XATTR_ROUND))
1056
1057 #define OCFS2_XATTR_BUCKET_SIZE 4096
1058 #define OCFS2_XATTR_MAX_BLOCKS_PER_BUCKET (OCFS2_XATTR_BUCKET_SIZE \
1059 / OCFS2_MIN_BLOCKSIZE)
1060
1061
1062
1063
1064 struct ocfs2_xattr_block {
1065 __u8 xb_signature[8];
1066 __le16 xb_suballoc_slot;
1067
1068 __le16 xb_suballoc_bit;
1069
1070 __le32 xb_fs_generation;
1071 __le64 xb_blkno;
1072 struct ocfs2_block_check xb_check;
1073 __le16 xb_flags;
1074
1075 __le16 xb_reserved0;
1076 __le32 xb_reserved1;
1077 __le64 xb_suballoc_loc;
1078
1079
1080
1081 union {
1082 struct ocfs2_xattr_header xb_header;
1083
1084 struct ocfs2_xattr_tree_root xb_root;
1085
1086
1087 } xb_attrs;
1088 };
1089
1090 #define OCFS2_XATTR_ENTRY_LOCAL 0x80
1091 #define OCFS2_XATTR_TYPE_MASK 0x7F
1092 static inline void ocfs2_xattr_set_local(struct ocfs2_xattr_entry *xe,
1093 int local)
1094 {
1095 if (local)
1096 xe->xe_type |= OCFS2_XATTR_ENTRY_LOCAL;
1097 else
1098 xe->xe_type &= ~OCFS2_XATTR_ENTRY_LOCAL;
1099 }
1100
1101 static inline int ocfs2_xattr_is_local(struct ocfs2_xattr_entry *xe)
1102 {
1103 return xe->xe_type & OCFS2_XATTR_ENTRY_LOCAL;
1104 }
1105
1106 static inline void ocfs2_xattr_set_type(struct ocfs2_xattr_entry *xe, int type)
1107 {
1108 xe->xe_type |= type & OCFS2_XATTR_TYPE_MASK;
1109 }
1110
1111 static inline int ocfs2_xattr_get_type(struct ocfs2_xattr_entry *xe)
1112 {
1113 return xe->xe_type & OCFS2_XATTR_TYPE_MASK;
1114 }
1115
1116
1117
1118
1119
1120
1121 #define OCFS2_GLOBAL_QMAGICS {\
1122 0x0cf52470, \
1123 0x0cf52471 \
1124 }
1125
1126 #define OCFS2_GLOBAL_QVERSIONS {\
1127 0, \
1128 0, \
1129 }
1130
1131
1132
1133
1134
1135 #define OCFS2_QBLK_RESERVED_SPACE 8
1136
1137
1138 struct ocfs2_disk_dqheader {
1139 __le32 dqh_magic;
1140 __le32 dqh_version;
1141 };
1142
1143 #define OCFS2_GLOBAL_INFO_OFF (sizeof(struct ocfs2_disk_dqheader))
1144
1145
1146
1147 struct ocfs2_global_disk_dqinfo {
1148 __le32 dqi_bgrace;
1149 __le32 dqi_igrace;
1150 __le32 dqi_syncms;
1151
1152 __le32 dqi_blocks;
1153 __le32 dqi_free_blk;
1154 __le32 dqi_free_entry;
1155
1156 };
1157
1158
1159
1160 struct ocfs2_global_disk_dqblk {
1161 __le32 dqb_id;
1162 __le32 dqb_use_count;
1163 __le64 dqb_ihardlimit;
1164 __le64 dqb_isoftlimit;
1165 __le64 dqb_curinodes;
1166 __le64 dqb_bhardlimit;
1167 __le64 dqb_bsoftlimit;
1168 __le64 dqb_curspace;
1169 __le64 dqb_btime;
1170 __le64 dqb_itime;
1171 __le64 dqb_pad1;
1172 __le64 dqb_pad2;
1173 };
1174
1175
1176
1177
1178
1179
1180 #define OCFS2_LOCAL_QMAGICS {\
1181 0x0cf524c0, \
1182 0x0cf524c1 \
1183 }
1184
1185 #define OCFS2_LOCAL_QVERSIONS {\
1186 0, \
1187 0, \
1188 }
1189
1190
1191 #define OLQF_CLEAN 0x0001
1192
1193
1194 #define OCFS2_LOCAL_INFO_OFF (sizeof(struct ocfs2_disk_dqheader))
1195
1196
1197
1198 struct ocfs2_local_disk_dqinfo {
1199 __le32 dqi_flags;
1200 __le32 dqi_chunks;
1201
1202 __le32 dqi_blocks;
1203 };
1204
1205
1206 struct ocfs2_local_disk_chunk {
1207 __le32 dqc_free;
1208 __u8 dqc_bitmap[];
1209
1210 };
1211
1212
1213 struct ocfs2_local_disk_dqblk {
1214 __le64 dqb_id;
1215 __le64 dqb_spacemod;
1216 __le64 dqb_inodemod;
1217 };
1218
1219
1220
1221
1222
1223
1224 struct ocfs2_disk_dqtrailer {
1225 struct ocfs2_block_check dq_check;
1226
1227 };
1228
1229 static inline struct ocfs2_disk_dqtrailer *ocfs2_block_dqtrailer(int blocksize,
1230 void *buf)
1231 {
1232 char *ptr = buf;
1233 ptr += blocksize - OCFS2_QBLK_RESERVED_SPACE;
1234
1235 return (struct ocfs2_disk_dqtrailer *)ptr;
1236 }
1237
1238 #ifdef __KERNEL__
1239 static inline int ocfs2_fast_symlink_chars(struct super_block *sb)
1240 {
1241 return sb->s_blocksize -
1242 offsetof(struct ocfs2_dinode, id2.i_symlink);
1243 }
1244
1245 static inline int ocfs2_max_inline_data_with_xattr(struct super_block *sb,
1246 struct ocfs2_dinode *di)
1247 {
1248 unsigned int xattrsize = le16_to_cpu(di->i_xattr_inline_size);
1249
1250 if (le16_to_cpu(di->i_dyn_features) & OCFS2_INLINE_XATTR_FL)
1251 return sb->s_blocksize -
1252 offsetof(struct ocfs2_dinode, id2.i_data.id_data) -
1253 xattrsize;
1254 else
1255 return sb->s_blocksize -
1256 offsetof(struct ocfs2_dinode, id2.i_data.id_data);
1257 }
1258
1259 static inline int ocfs2_extent_recs_per_inode(struct super_block *sb)
1260 {
1261 int size;
1262
1263 size = sb->s_blocksize -
1264 offsetof(struct ocfs2_dinode, id2.i_list.l_recs);
1265
1266 return size / sizeof(struct ocfs2_extent_rec);
1267 }
1268
1269 static inline int ocfs2_extent_recs_per_inode_with_xattr(
1270 struct super_block *sb,
1271 struct ocfs2_dinode *di)
1272 {
1273 int size;
1274 unsigned int xattrsize = le16_to_cpu(di->i_xattr_inline_size);
1275
1276 if (le16_to_cpu(di->i_dyn_features) & OCFS2_INLINE_XATTR_FL)
1277 size = sb->s_blocksize -
1278 offsetof(struct ocfs2_dinode, id2.i_list.l_recs) -
1279 xattrsize;
1280 else
1281 size = sb->s_blocksize -
1282 offsetof(struct ocfs2_dinode, id2.i_list.l_recs);
1283
1284 return size / sizeof(struct ocfs2_extent_rec);
1285 }
1286
1287 static inline int ocfs2_extent_recs_per_dx_root(struct super_block *sb)
1288 {
1289 int size;
1290
1291 size = sb->s_blocksize -
1292 offsetof(struct ocfs2_dx_root_block, dr_list.l_recs);
1293
1294 return size / sizeof(struct ocfs2_extent_rec);
1295 }
1296
1297 static inline int ocfs2_chain_recs_per_inode(struct super_block *sb)
1298 {
1299 int size;
1300
1301 size = sb->s_blocksize -
1302 offsetof(struct ocfs2_dinode, id2.i_chain.cl_recs);
1303
1304 return size / sizeof(struct ocfs2_chain_rec);
1305 }
1306
1307 static inline u16 ocfs2_extent_recs_per_eb(struct super_block *sb)
1308 {
1309 int size;
1310
1311 size = sb->s_blocksize -
1312 offsetof(struct ocfs2_extent_block, h_list.l_recs);
1313
1314 return size / sizeof(struct ocfs2_extent_rec);
1315 }
1316
1317 static inline u16 ocfs2_extent_recs_per_gd(struct super_block *sb)
1318 {
1319 int size;
1320
1321 size = sb->s_blocksize -
1322 offsetof(struct ocfs2_group_desc, bg_list.l_recs);
1323
1324 return size / sizeof(struct ocfs2_extent_rec);
1325 }
1326
1327 static inline int ocfs2_dx_entries_per_leaf(struct super_block *sb)
1328 {
1329 int size;
1330
1331 size = sb->s_blocksize -
1332 offsetof(struct ocfs2_dx_leaf, dl_list.de_entries);
1333
1334 return size / sizeof(struct ocfs2_dx_entry);
1335 }
1336
1337 static inline int ocfs2_dx_entries_per_root(struct super_block *sb)
1338 {
1339 int size;
1340
1341 size = sb->s_blocksize -
1342 offsetof(struct ocfs2_dx_root_block, dr_entries.de_entries);
1343
1344 return size / sizeof(struct ocfs2_dx_entry);
1345 }
1346
1347 static inline u16 ocfs2_local_alloc_size(struct super_block *sb)
1348 {
1349 u16 size;
1350
1351 size = sb->s_blocksize -
1352 offsetof(struct ocfs2_dinode, id2.i_lab.la_bitmap);
1353
1354 return size;
1355 }
1356
1357 static inline int ocfs2_group_bitmap_size(struct super_block *sb,
1358 int suballocator,
1359 u32 feature_incompat)
1360 {
1361 int size = sb->s_blocksize -
1362 offsetof(struct ocfs2_group_desc, bg_bitmap);
1363
1364
1365
1366
1367
1368
1369
1370 if (suballocator &&
1371 (feature_incompat & OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG))
1372 size = OCFS2_MAX_BG_BITMAP_SIZE;
1373
1374 return size;
1375 }
1376
1377 static inline int ocfs2_truncate_recs_per_inode(struct super_block *sb)
1378 {
1379 int size;
1380
1381 size = sb->s_blocksize -
1382 offsetof(struct ocfs2_dinode, id2.i_dealloc.tl_recs);
1383
1384 return size / sizeof(struct ocfs2_truncate_rec);
1385 }
1386
1387 static inline u64 ocfs2_backup_super_blkno(struct super_block *sb, int index)
1388 {
1389 u64 offset = OCFS2_BACKUP_SB_START;
1390
1391 if (index >= 0 && index < OCFS2_MAX_BACKUP_SUPERBLOCKS) {
1392 offset <<= (2 * index);
1393 offset >>= sb->s_blocksize_bits;
1394 return offset;
1395 }
1396
1397 return 0;
1398
1399 }
1400
1401 static inline u16 ocfs2_xattr_recs_per_xb(struct super_block *sb)
1402 {
1403 int size;
1404
1405 size = sb->s_blocksize -
1406 offsetof(struct ocfs2_xattr_block,
1407 xb_attrs.xb_root.xt_list.l_recs);
1408
1409 return size / sizeof(struct ocfs2_extent_rec);
1410 }
1411
1412 static inline u16 ocfs2_extent_recs_per_rb(struct super_block *sb)
1413 {
1414 int size;
1415
1416 size = sb->s_blocksize -
1417 offsetof(struct ocfs2_refcount_block, rf_list.l_recs);
1418
1419 return size / sizeof(struct ocfs2_extent_rec);
1420 }
1421
1422 static inline u16 ocfs2_refcount_recs_per_rb(struct super_block *sb)
1423 {
1424 int size;
1425
1426 size = sb->s_blocksize -
1427 offsetof(struct ocfs2_refcount_block, rf_records.rl_recs);
1428
1429 return size / sizeof(struct ocfs2_refcount_rec);
1430 }
1431
1432 static inline u32
1433 ocfs2_get_ref_rec_low_cpos(const struct ocfs2_refcount_rec *rec)
1434 {
1435 return le64_to_cpu(rec->r_cpos) & OCFS2_32BIT_POS_MASK;
1436 }
1437 #else
1438 static inline int ocfs2_fast_symlink_chars(int blocksize)
1439 {
1440 return blocksize - offsetof(struct ocfs2_dinode, id2.i_symlink);
1441 }
1442
1443 static inline int ocfs2_max_inline_data_with_xattr(int blocksize,
1444 struct ocfs2_dinode *di)
1445 {
1446 if (di && (di->i_dyn_features & OCFS2_INLINE_XATTR_FL))
1447 return blocksize -
1448 offsetof(struct ocfs2_dinode, id2.i_data.id_data) -
1449 di->i_xattr_inline_size;
1450 else
1451 return blocksize -
1452 offsetof(struct ocfs2_dinode, id2.i_data.id_data);
1453 }
1454
1455 static inline int ocfs2_extent_recs_per_inode(int blocksize)
1456 {
1457 int size;
1458
1459 size = blocksize -
1460 offsetof(struct ocfs2_dinode, id2.i_list.l_recs);
1461
1462 return size / sizeof(struct ocfs2_extent_rec);
1463 }
1464
1465 static inline int ocfs2_chain_recs_per_inode(int blocksize)
1466 {
1467 int size;
1468
1469 size = blocksize -
1470 offsetof(struct ocfs2_dinode, id2.i_chain.cl_recs);
1471
1472 return size / sizeof(struct ocfs2_chain_rec);
1473 }
1474
1475 static inline int ocfs2_extent_recs_per_eb(int blocksize)
1476 {
1477 int size;
1478
1479 size = blocksize -
1480 offsetof(struct ocfs2_extent_block, h_list.l_recs);
1481
1482 return size / sizeof(struct ocfs2_extent_rec);
1483 }
1484
1485 static inline int ocfs2_extent_recs_per_gd(int blocksize)
1486 {
1487 int size;
1488
1489 size = blocksize -
1490 offsetof(struct ocfs2_group_desc, bg_list.l_recs);
1491
1492 return size / sizeof(struct ocfs2_extent_rec);
1493 }
1494
1495 static inline int ocfs2_local_alloc_size(int blocksize)
1496 {
1497 int size;
1498
1499 size = blocksize -
1500 offsetof(struct ocfs2_dinode, id2.i_lab.la_bitmap);
1501
1502 return size;
1503 }
1504
1505 static inline int ocfs2_group_bitmap_size(int blocksize,
1506 int suballocator,
1507 uint32_t feature_incompat)
1508 {
1509 int size = sb->s_blocksize -
1510 offsetof(struct ocfs2_group_desc, bg_bitmap);
1511
1512
1513
1514
1515
1516
1517
1518 if (suballocator &&
1519 (feature_incompat & OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG))
1520 size = OCFS2_MAX_BG_BITMAP_SIZE;
1521
1522 return size;
1523 }
1524
1525 static inline int ocfs2_truncate_recs_per_inode(int blocksize)
1526 {
1527 int size;
1528
1529 size = blocksize -
1530 offsetof(struct ocfs2_dinode, id2.i_dealloc.tl_recs);
1531
1532 return size / sizeof(struct ocfs2_truncate_rec);
1533 }
1534
1535 static inline uint64_t ocfs2_backup_super_blkno(int blocksize, int index)
1536 {
1537 uint64_t offset = OCFS2_BACKUP_SB_START;
1538
1539 if (index >= 0 && index < OCFS2_MAX_BACKUP_SUPERBLOCKS) {
1540 offset <<= (2 * index);
1541 offset /= blocksize;
1542 return offset;
1543 }
1544
1545 return 0;
1546 }
1547
1548 static inline int ocfs2_xattr_recs_per_xb(int blocksize)
1549 {
1550 int size;
1551
1552 size = blocksize -
1553 offsetof(struct ocfs2_xattr_block,
1554 xb_attrs.xb_root.xt_list.l_recs);
1555
1556 return size / sizeof(struct ocfs2_extent_rec);
1557 }
1558 #endif
1559
1560
1561 static inline int ocfs2_system_inode_is_global(int type)
1562 {
1563 return ((type >= 0) &&
1564 (type <= OCFS2_LAST_GLOBAL_SYSTEM_INODE));
1565 }
1566
1567 static inline int ocfs2_sprintf_system_inode_name(char *buf, int len,
1568 int type, int slot)
1569 {
1570 int chars;
1571
1572
1573
1574
1575
1576
1577 if (type <= OCFS2_LAST_GLOBAL_SYSTEM_INODE)
1578 chars = snprintf(buf, len, "%s",
1579 ocfs2_system_inodes[type].si_name);
1580 else
1581 chars = snprintf(buf, len,
1582 ocfs2_system_inodes[type].si_name,
1583 slot);
1584
1585 return chars;
1586 }
1587
1588 static inline void ocfs2_set_de_type(struct ocfs2_dir_entry *de,
1589 umode_t mode)
1590 {
1591 de->file_type = fs_umode_to_ftype(mode);
1592 }
1593
1594 static inline int ocfs2_gd_is_discontig(struct ocfs2_group_desc *gd)
1595 {
1596 if ((offsetof(struct ocfs2_group_desc, bg_bitmap) +
1597 le16_to_cpu(gd->bg_size)) !=
1598 offsetof(struct ocfs2_group_desc, bg_list))
1599 return 0;
1600
1601
1602
1603
1604 if (!gd->bg_list.l_next_free_rec)
1605 return 0;
1606 return 1;
1607 }
1608 #endif
1609