1*e63e88bcSRyusuke Konishi /* 2*e63e88bcSRyusuke Konishi * nilfs2_ondisk.h - NILFS2 on-disk structures 3*e63e88bcSRyusuke Konishi * 4*e63e88bcSRyusuke Konishi * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. 5*e63e88bcSRyusuke Konishi * 6*e63e88bcSRyusuke Konishi * This program is free software; you can redistribute it and/or modify 7*e63e88bcSRyusuke Konishi * it under the terms of the GNU Lesser General Public License as published 8*e63e88bcSRyusuke Konishi * by the Free Software Foundation; either version 2.1 of the License, or 9*e63e88bcSRyusuke Konishi * (at your option) any later version. 10*e63e88bcSRyusuke Konishi */ 11*e63e88bcSRyusuke Konishi /* 12*e63e88bcSRyusuke Konishi * linux/include/linux/ext2_fs.h 13*e63e88bcSRyusuke Konishi * 14*e63e88bcSRyusuke Konishi * Copyright (C) 1992, 1993, 1994, 1995 15*e63e88bcSRyusuke Konishi * Remy Card ([email protected]) 16*e63e88bcSRyusuke Konishi * Laboratoire MASI - Institut Blaise Pascal 17*e63e88bcSRyusuke Konishi * Universite Pierre et Marie Curie (Paris VI) 18*e63e88bcSRyusuke Konishi * 19*e63e88bcSRyusuke Konishi * from 20*e63e88bcSRyusuke Konishi * 21*e63e88bcSRyusuke Konishi * linux/include/linux/minix_fs.h 22*e63e88bcSRyusuke Konishi * 23*e63e88bcSRyusuke Konishi * Copyright (C) 1991, 1992 Linus Torvalds 24*e63e88bcSRyusuke Konishi */ 25*e63e88bcSRyusuke Konishi 26*e63e88bcSRyusuke Konishi #ifndef _LINUX_NILFS2_ONDISK_H 27*e63e88bcSRyusuke Konishi #define _LINUX_NILFS2_ONDISK_H 28*e63e88bcSRyusuke Konishi 29*e63e88bcSRyusuke Konishi #include <linux/types.h> 30*e63e88bcSRyusuke Konishi #include <linux/magic.h> 31*e63e88bcSRyusuke Konishi 32*e63e88bcSRyusuke Konishi 33*e63e88bcSRyusuke Konishi #define NILFS_INODE_BMAP_SIZE 7 34*e63e88bcSRyusuke Konishi 35*e63e88bcSRyusuke Konishi /** 36*e63e88bcSRyusuke Konishi * struct nilfs_inode - structure of an inode on disk 37*e63e88bcSRyusuke Konishi * @i_blocks: blocks count 38*e63e88bcSRyusuke Konishi * @i_size: size in bytes 39*e63e88bcSRyusuke Konishi * @i_ctime: creation time (seconds) 40*e63e88bcSRyusuke Konishi * @i_mtime: modification time (seconds) 41*e63e88bcSRyusuke Konishi * @i_ctime_nsec: creation time (nano seconds) 42*e63e88bcSRyusuke Konishi * @i_mtime_nsec: modification time (nano seconds) 43*e63e88bcSRyusuke Konishi * @i_uid: user id 44*e63e88bcSRyusuke Konishi * @i_gid: group id 45*e63e88bcSRyusuke Konishi * @i_mode: file mode 46*e63e88bcSRyusuke Konishi * @i_links_count: links count 47*e63e88bcSRyusuke Konishi * @i_flags: file flags 48*e63e88bcSRyusuke Konishi * @i_bmap: block mapping 49*e63e88bcSRyusuke Konishi * @i_xattr: extended attributes 50*e63e88bcSRyusuke Konishi * @i_generation: file generation (for NFS) 51*e63e88bcSRyusuke Konishi * @i_pad: padding 52*e63e88bcSRyusuke Konishi */ 53*e63e88bcSRyusuke Konishi struct nilfs_inode { 54*e63e88bcSRyusuke Konishi __le64 i_blocks; 55*e63e88bcSRyusuke Konishi __le64 i_size; 56*e63e88bcSRyusuke Konishi __le64 i_ctime; 57*e63e88bcSRyusuke Konishi __le64 i_mtime; 58*e63e88bcSRyusuke Konishi __le32 i_ctime_nsec; 59*e63e88bcSRyusuke Konishi __le32 i_mtime_nsec; 60*e63e88bcSRyusuke Konishi __le32 i_uid; 61*e63e88bcSRyusuke Konishi __le32 i_gid; 62*e63e88bcSRyusuke Konishi __le16 i_mode; 63*e63e88bcSRyusuke Konishi __le16 i_links_count; 64*e63e88bcSRyusuke Konishi __le32 i_flags; 65*e63e88bcSRyusuke Konishi __le64 i_bmap[NILFS_INODE_BMAP_SIZE]; 66*e63e88bcSRyusuke Konishi #define i_device_code i_bmap[0] 67*e63e88bcSRyusuke Konishi __le64 i_xattr; 68*e63e88bcSRyusuke Konishi __le32 i_generation; 69*e63e88bcSRyusuke Konishi __le32 i_pad; 70*e63e88bcSRyusuke Konishi }; 71*e63e88bcSRyusuke Konishi 72*e63e88bcSRyusuke Konishi #define NILFS_MIN_INODE_SIZE 128 73*e63e88bcSRyusuke Konishi 74*e63e88bcSRyusuke Konishi /** 75*e63e88bcSRyusuke Konishi * struct nilfs_super_root - structure of super root 76*e63e88bcSRyusuke Konishi * @sr_sum: check sum 77*e63e88bcSRyusuke Konishi * @sr_bytes: byte count of the structure 78*e63e88bcSRyusuke Konishi * @sr_flags: flags (reserved) 79*e63e88bcSRyusuke Konishi * @sr_nongc_ctime: write time of the last segment not for cleaner operation 80*e63e88bcSRyusuke Konishi * @sr_dat: DAT file inode 81*e63e88bcSRyusuke Konishi * @sr_cpfile: checkpoint file inode 82*e63e88bcSRyusuke Konishi * @sr_sufile: segment usage file inode 83*e63e88bcSRyusuke Konishi */ 84*e63e88bcSRyusuke Konishi struct nilfs_super_root { 85*e63e88bcSRyusuke Konishi __le32 sr_sum; 86*e63e88bcSRyusuke Konishi __le16 sr_bytes; 87*e63e88bcSRyusuke Konishi __le16 sr_flags; 88*e63e88bcSRyusuke Konishi __le64 sr_nongc_ctime; 89*e63e88bcSRyusuke Konishi struct nilfs_inode sr_dat; 90*e63e88bcSRyusuke Konishi struct nilfs_inode sr_cpfile; 91*e63e88bcSRyusuke Konishi struct nilfs_inode sr_sufile; 92*e63e88bcSRyusuke Konishi }; 93*e63e88bcSRyusuke Konishi 94*e63e88bcSRyusuke Konishi #define NILFS_SR_MDT_OFFSET(inode_size, i) \ 95*e63e88bcSRyusuke Konishi ((unsigned long)&((struct nilfs_super_root *)0)->sr_dat + \ 96*e63e88bcSRyusuke Konishi (inode_size) * (i)) 97*e63e88bcSRyusuke Konishi #define NILFS_SR_DAT_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 0) 98*e63e88bcSRyusuke Konishi #define NILFS_SR_CPFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 1) 99*e63e88bcSRyusuke Konishi #define NILFS_SR_SUFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 2) 100*e63e88bcSRyusuke Konishi #define NILFS_SR_BYTES(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 3) 101*e63e88bcSRyusuke Konishi 102*e63e88bcSRyusuke Konishi /* 103*e63e88bcSRyusuke Konishi * Maximal mount counts 104*e63e88bcSRyusuke Konishi */ 105*e63e88bcSRyusuke Konishi #define NILFS_DFL_MAX_MNT_COUNT 50 /* 50 mounts */ 106*e63e88bcSRyusuke Konishi 107*e63e88bcSRyusuke Konishi /* 108*e63e88bcSRyusuke Konishi * File system states (sbp->s_state, nilfs->ns_mount_state) 109*e63e88bcSRyusuke Konishi */ 110*e63e88bcSRyusuke Konishi #define NILFS_VALID_FS 0x0001 /* Unmounted cleanly */ 111*e63e88bcSRyusuke Konishi #define NILFS_ERROR_FS 0x0002 /* Errors detected */ 112*e63e88bcSRyusuke Konishi #define NILFS_RESIZE_FS 0x0004 /* Resize required */ 113*e63e88bcSRyusuke Konishi 114*e63e88bcSRyusuke Konishi /* 115*e63e88bcSRyusuke Konishi * Mount flags (sbi->s_mount_opt) 116*e63e88bcSRyusuke Konishi */ 117*e63e88bcSRyusuke Konishi #define NILFS_MOUNT_ERROR_MODE 0x0070 /* Error mode mask */ 118*e63e88bcSRyusuke Konishi #define NILFS_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */ 119*e63e88bcSRyusuke Konishi #define NILFS_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */ 120*e63e88bcSRyusuke Konishi #define NILFS_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ 121*e63e88bcSRyusuke Konishi #define NILFS_MOUNT_BARRIER 0x1000 /* Use block barriers */ 122*e63e88bcSRyusuke Konishi #define NILFS_MOUNT_STRICT_ORDER 0x2000 /* 123*e63e88bcSRyusuke Konishi * Apply strict in-order 124*e63e88bcSRyusuke Konishi * semantics also for data 125*e63e88bcSRyusuke Konishi */ 126*e63e88bcSRyusuke Konishi #define NILFS_MOUNT_NORECOVERY 0x4000 /* 127*e63e88bcSRyusuke Konishi * Disable write access during 128*e63e88bcSRyusuke Konishi * mount-time recovery 129*e63e88bcSRyusuke Konishi */ 130*e63e88bcSRyusuke Konishi #define NILFS_MOUNT_DISCARD 0x8000 /* Issue DISCARD requests */ 131*e63e88bcSRyusuke Konishi 132*e63e88bcSRyusuke Konishi 133*e63e88bcSRyusuke Konishi /** 134*e63e88bcSRyusuke Konishi * struct nilfs_super_block - structure of super block on disk 135*e63e88bcSRyusuke Konishi */ 136*e63e88bcSRyusuke Konishi struct nilfs_super_block { 137*e63e88bcSRyusuke Konishi /*00*/ __le32 s_rev_level; /* Revision level */ 138*e63e88bcSRyusuke Konishi __le16 s_minor_rev_level; /* minor revision level */ 139*e63e88bcSRyusuke Konishi __le16 s_magic; /* Magic signature */ 140*e63e88bcSRyusuke Konishi 141*e63e88bcSRyusuke Konishi __le16 s_bytes; /* 142*e63e88bcSRyusuke Konishi * Bytes count of CRC calculation 143*e63e88bcSRyusuke Konishi * for this structure. s_reserved 144*e63e88bcSRyusuke Konishi * is excluded. 145*e63e88bcSRyusuke Konishi */ 146*e63e88bcSRyusuke Konishi __le16 s_flags; /* flags */ 147*e63e88bcSRyusuke Konishi __le32 s_crc_seed; /* Seed value of CRC calculation */ 148*e63e88bcSRyusuke Konishi /*10*/ __le32 s_sum; /* Check sum of super block */ 149*e63e88bcSRyusuke Konishi 150*e63e88bcSRyusuke Konishi __le32 s_log_block_size; /* 151*e63e88bcSRyusuke Konishi * Block size represented as follows 152*e63e88bcSRyusuke Konishi * blocksize = 153*e63e88bcSRyusuke Konishi * 1 << (s_log_block_size + 10) 154*e63e88bcSRyusuke Konishi */ 155*e63e88bcSRyusuke Konishi __le64 s_nsegments; /* Number of segments in filesystem */ 156*e63e88bcSRyusuke Konishi /*20*/ __le64 s_dev_size; /* block device size in bytes */ 157*e63e88bcSRyusuke Konishi __le64 s_first_data_block; /* 1st seg disk block number */ 158*e63e88bcSRyusuke Konishi /*30*/ __le32 s_blocks_per_segment; /* number of blocks per full segment */ 159*e63e88bcSRyusuke Konishi __le32 s_r_segments_percentage; /* Reserved segments percentage */ 160*e63e88bcSRyusuke Konishi 161*e63e88bcSRyusuke Konishi __le64 s_last_cno; /* Last checkpoint number */ 162*e63e88bcSRyusuke Konishi /*40*/ __le64 s_last_pseg; /* disk block addr pseg written last */ 163*e63e88bcSRyusuke Konishi __le64 s_last_seq; /* seq. number of seg written last */ 164*e63e88bcSRyusuke Konishi /*50*/ __le64 s_free_blocks_count; /* Free blocks count */ 165*e63e88bcSRyusuke Konishi 166*e63e88bcSRyusuke Konishi __le64 s_ctime; /* 167*e63e88bcSRyusuke Konishi * Creation time (execution time of 168*e63e88bcSRyusuke Konishi * newfs) 169*e63e88bcSRyusuke Konishi */ 170*e63e88bcSRyusuke Konishi /*60*/ __le64 s_mtime; /* Mount time */ 171*e63e88bcSRyusuke Konishi __le64 s_wtime; /* Write time */ 172*e63e88bcSRyusuke Konishi /*70*/ __le16 s_mnt_count; /* Mount count */ 173*e63e88bcSRyusuke Konishi __le16 s_max_mnt_count; /* Maximal mount count */ 174*e63e88bcSRyusuke Konishi __le16 s_state; /* File system state */ 175*e63e88bcSRyusuke Konishi __le16 s_errors; /* Behaviour when detecting errors */ 176*e63e88bcSRyusuke Konishi __le64 s_lastcheck; /* time of last check */ 177*e63e88bcSRyusuke Konishi 178*e63e88bcSRyusuke Konishi /*80*/ __le32 s_checkinterval; /* max. time between checks */ 179*e63e88bcSRyusuke Konishi __le32 s_creator_os; /* OS */ 180*e63e88bcSRyusuke Konishi __le16 s_def_resuid; /* Default uid for reserved blocks */ 181*e63e88bcSRyusuke Konishi __le16 s_def_resgid; /* Default gid for reserved blocks */ 182*e63e88bcSRyusuke Konishi __le32 s_first_ino; /* First non-reserved inode */ 183*e63e88bcSRyusuke Konishi 184*e63e88bcSRyusuke Konishi /*90*/ __le16 s_inode_size; /* Size of an inode */ 185*e63e88bcSRyusuke Konishi __le16 s_dat_entry_size; /* Size of a dat entry */ 186*e63e88bcSRyusuke Konishi __le16 s_checkpoint_size; /* Size of a checkpoint */ 187*e63e88bcSRyusuke Konishi __le16 s_segment_usage_size; /* Size of a segment usage */ 188*e63e88bcSRyusuke Konishi 189*e63e88bcSRyusuke Konishi /*98*/ __u8 s_uuid[16]; /* 128-bit uuid for volume */ 190*e63e88bcSRyusuke Konishi /*A8*/ char s_volume_name[80]; /* volume name */ 191*e63e88bcSRyusuke Konishi 192*e63e88bcSRyusuke Konishi /*F8*/ __le32 s_c_interval; /* Commit interval of segment */ 193*e63e88bcSRyusuke Konishi __le32 s_c_block_max; /* 194*e63e88bcSRyusuke Konishi * Threshold of data amount for 195*e63e88bcSRyusuke Konishi * the segment construction 196*e63e88bcSRyusuke Konishi */ 197*e63e88bcSRyusuke Konishi /*100*/ __le64 s_feature_compat; /* Compatible feature set */ 198*e63e88bcSRyusuke Konishi __le64 s_feature_compat_ro; /* Read-only compatible feature set */ 199*e63e88bcSRyusuke Konishi __le64 s_feature_incompat; /* Incompatible feature set */ 200*e63e88bcSRyusuke Konishi __u32 s_reserved[186]; /* padding to the end of the block */ 201*e63e88bcSRyusuke Konishi }; 202*e63e88bcSRyusuke Konishi 203*e63e88bcSRyusuke Konishi /* 204*e63e88bcSRyusuke Konishi * Codes for operating systems 205*e63e88bcSRyusuke Konishi */ 206*e63e88bcSRyusuke Konishi #define NILFS_OS_LINUX 0 207*e63e88bcSRyusuke Konishi /* Codes from 1 to 4 are reserved to keep compatibility with ext2 creator-OS */ 208*e63e88bcSRyusuke Konishi 209*e63e88bcSRyusuke Konishi /* 210*e63e88bcSRyusuke Konishi * Revision levels 211*e63e88bcSRyusuke Konishi */ 212*e63e88bcSRyusuke Konishi #define NILFS_CURRENT_REV 2 /* current major revision */ 213*e63e88bcSRyusuke Konishi #define NILFS_MINOR_REV 0 /* minor revision */ 214*e63e88bcSRyusuke Konishi #define NILFS_MIN_SUPP_REV 2 /* minimum supported revision */ 215*e63e88bcSRyusuke Konishi 216*e63e88bcSRyusuke Konishi /* 217*e63e88bcSRyusuke Konishi * Feature set definitions 218*e63e88bcSRyusuke Konishi * 219*e63e88bcSRyusuke Konishi * If there is a bit set in the incompatible feature set that the kernel 220*e63e88bcSRyusuke Konishi * doesn't know about, it should refuse to mount the filesystem. 221*e63e88bcSRyusuke Konishi */ 222*e63e88bcSRyusuke Konishi #define NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT 0x00000001ULL 223*e63e88bcSRyusuke Konishi 224*e63e88bcSRyusuke Konishi #define NILFS_FEATURE_COMPAT_SUPP 0ULL 225*e63e88bcSRyusuke Konishi #define NILFS_FEATURE_COMPAT_RO_SUPP NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT 226*e63e88bcSRyusuke Konishi #define NILFS_FEATURE_INCOMPAT_SUPP 0ULL 227*e63e88bcSRyusuke Konishi 228*e63e88bcSRyusuke Konishi /* 229*e63e88bcSRyusuke Konishi * Bytes count of super_block for CRC-calculation 230*e63e88bcSRyusuke Konishi */ 231*e63e88bcSRyusuke Konishi #define NILFS_SB_BYTES \ 232*e63e88bcSRyusuke Konishi ((long)&((struct nilfs_super_block *)0)->s_reserved) 233*e63e88bcSRyusuke Konishi 234*e63e88bcSRyusuke Konishi /* 235*e63e88bcSRyusuke Konishi * Special inode number 236*e63e88bcSRyusuke Konishi */ 237*e63e88bcSRyusuke Konishi #define NILFS_ROOT_INO 2 /* Root file inode */ 238*e63e88bcSRyusuke Konishi #define NILFS_DAT_INO 3 /* DAT file */ 239*e63e88bcSRyusuke Konishi #define NILFS_CPFILE_INO 4 /* checkpoint file */ 240*e63e88bcSRyusuke Konishi #define NILFS_SUFILE_INO 5 /* segment usage file */ 241*e63e88bcSRyusuke Konishi #define NILFS_IFILE_INO 6 /* ifile */ 242*e63e88bcSRyusuke Konishi #define NILFS_ATIME_INO 7 /* Atime file (reserved) */ 243*e63e88bcSRyusuke Konishi #define NILFS_XATTR_INO 8 /* Xattribute file (reserved) */ 244*e63e88bcSRyusuke Konishi #define NILFS_SKETCH_INO 10 /* Sketch file */ 245*e63e88bcSRyusuke Konishi #define NILFS_USER_INO 11 /* Fisrt user's file inode number */ 246*e63e88bcSRyusuke Konishi 247*e63e88bcSRyusuke Konishi #define NILFS_SB_OFFSET_BYTES 1024 /* byte offset of nilfs superblock */ 248*e63e88bcSRyusuke Konishi 249*e63e88bcSRyusuke Konishi #define NILFS_SEG_MIN_BLOCKS 16 /* 250*e63e88bcSRyusuke Konishi * Minimum number of blocks in 251*e63e88bcSRyusuke Konishi * a full segment 252*e63e88bcSRyusuke Konishi */ 253*e63e88bcSRyusuke Konishi #define NILFS_PSEG_MIN_BLOCKS 2 /* 254*e63e88bcSRyusuke Konishi * Minimum number of blocks in 255*e63e88bcSRyusuke Konishi * a partial segment 256*e63e88bcSRyusuke Konishi */ 257*e63e88bcSRyusuke Konishi #define NILFS_MIN_NRSVSEGS 8 /* 258*e63e88bcSRyusuke Konishi * Minimum number of reserved 259*e63e88bcSRyusuke Konishi * segments 260*e63e88bcSRyusuke Konishi */ 261*e63e88bcSRyusuke Konishi 262*e63e88bcSRyusuke Konishi /* 263*e63e88bcSRyusuke Konishi * We call DAT, cpfile, and sufile root metadata files. Inodes of 264*e63e88bcSRyusuke Konishi * these files are written in super root block instead of ifile, and 265*e63e88bcSRyusuke Konishi * garbage collector doesn't keep any past versions of these files. 266*e63e88bcSRyusuke Konishi */ 267*e63e88bcSRyusuke Konishi #define NILFS_ROOT_METADATA_FILE(ino) \ 268*e63e88bcSRyusuke Konishi ((ino) >= NILFS_DAT_INO && (ino) <= NILFS_SUFILE_INO) 269*e63e88bcSRyusuke Konishi 270*e63e88bcSRyusuke Konishi /* 271*e63e88bcSRyusuke Konishi * bytes offset of secondary super block 272*e63e88bcSRyusuke Konishi */ 273*e63e88bcSRyusuke Konishi #define NILFS_SB2_OFFSET_BYTES(devsize) ((((devsize) >> 12) - 1) << 12) 274*e63e88bcSRyusuke Konishi 275*e63e88bcSRyusuke Konishi /* 276*e63e88bcSRyusuke Konishi * Maximal count of links to a file 277*e63e88bcSRyusuke Konishi */ 278*e63e88bcSRyusuke Konishi #define NILFS_LINK_MAX 32000 279*e63e88bcSRyusuke Konishi 280*e63e88bcSRyusuke Konishi /* 281*e63e88bcSRyusuke Konishi * Structure of a directory entry 282*e63e88bcSRyusuke Konishi * (Same as ext2) 283*e63e88bcSRyusuke Konishi */ 284*e63e88bcSRyusuke Konishi 285*e63e88bcSRyusuke Konishi #define NILFS_NAME_LEN 255 286*e63e88bcSRyusuke Konishi 287*e63e88bcSRyusuke Konishi /* 288*e63e88bcSRyusuke Konishi * Block size limitations 289*e63e88bcSRyusuke Konishi */ 290*e63e88bcSRyusuke Konishi #define NILFS_MIN_BLOCK_SIZE 1024 291*e63e88bcSRyusuke Konishi #define NILFS_MAX_BLOCK_SIZE 65536 292*e63e88bcSRyusuke Konishi 293*e63e88bcSRyusuke Konishi /* 294*e63e88bcSRyusuke Konishi * The new version of the directory entry. Since V0 structures are 295*e63e88bcSRyusuke Konishi * stored in intel byte order, and the name_len field could never be 296*e63e88bcSRyusuke Konishi * bigger than 255 chars, it's safe to reclaim the extra byte for the 297*e63e88bcSRyusuke Konishi * file_type field. 298*e63e88bcSRyusuke Konishi */ 299*e63e88bcSRyusuke Konishi struct nilfs_dir_entry { 300*e63e88bcSRyusuke Konishi __le64 inode; /* Inode number */ 301*e63e88bcSRyusuke Konishi __le16 rec_len; /* Directory entry length */ 302*e63e88bcSRyusuke Konishi __u8 name_len; /* Name length */ 303*e63e88bcSRyusuke Konishi __u8 file_type; /* Dir entry type (file, dir, etc) */ 304*e63e88bcSRyusuke Konishi char name[NILFS_NAME_LEN]; /* File name */ 305*e63e88bcSRyusuke Konishi char pad; 306*e63e88bcSRyusuke Konishi }; 307*e63e88bcSRyusuke Konishi 308*e63e88bcSRyusuke Konishi /* 309*e63e88bcSRyusuke Konishi * NILFS directory file types. Only the low 3 bits are used. The 310*e63e88bcSRyusuke Konishi * other bits are reserved for now. 311*e63e88bcSRyusuke Konishi */ 312*e63e88bcSRyusuke Konishi enum { 313*e63e88bcSRyusuke Konishi NILFS_FT_UNKNOWN, 314*e63e88bcSRyusuke Konishi NILFS_FT_REG_FILE, 315*e63e88bcSRyusuke Konishi NILFS_FT_DIR, 316*e63e88bcSRyusuke Konishi NILFS_FT_CHRDEV, 317*e63e88bcSRyusuke Konishi NILFS_FT_BLKDEV, 318*e63e88bcSRyusuke Konishi NILFS_FT_FIFO, 319*e63e88bcSRyusuke Konishi NILFS_FT_SOCK, 320*e63e88bcSRyusuke Konishi NILFS_FT_SYMLINK, 321*e63e88bcSRyusuke Konishi NILFS_FT_MAX 322*e63e88bcSRyusuke Konishi }; 323*e63e88bcSRyusuke Konishi 324*e63e88bcSRyusuke Konishi /* 325*e63e88bcSRyusuke Konishi * NILFS_DIR_PAD defines the directory entries boundaries 326*e63e88bcSRyusuke Konishi * 327*e63e88bcSRyusuke Konishi * NOTE: It must be a multiple of 8 328*e63e88bcSRyusuke Konishi */ 329*e63e88bcSRyusuke Konishi #define NILFS_DIR_PAD 8 330*e63e88bcSRyusuke Konishi #define NILFS_DIR_ROUND (NILFS_DIR_PAD - 1) 331*e63e88bcSRyusuke Konishi #define NILFS_DIR_REC_LEN(name_len) (((name_len) + 12 + NILFS_DIR_ROUND) & \ 332*e63e88bcSRyusuke Konishi ~NILFS_DIR_ROUND) 333*e63e88bcSRyusuke Konishi #define NILFS_MAX_REC_LEN ((1 << 16) - 1) 334*e63e88bcSRyusuke Konishi 335*e63e88bcSRyusuke Konishi /** 336*e63e88bcSRyusuke Konishi * struct nilfs_finfo - file information 337*e63e88bcSRyusuke Konishi * @fi_ino: inode number 338*e63e88bcSRyusuke Konishi * @fi_cno: checkpoint number 339*e63e88bcSRyusuke Konishi * @fi_nblocks: number of blocks (including intermediate blocks) 340*e63e88bcSRyusuke Konishi * @fi_ndatablk: number of file data blocks 341*e63e88bcSRyusuke Konishi */ 342*e63e88bcSRyusuke Konishi struct nilfs_finfo { 343*e63e88bcSRyusuke Konishi __le64 fi_ino; 344*e63e88bcSRyusuke Konishi __le64 fi_cno; 345*e63e88bcSRyusuke Konishi __le32 fi_nblocks; 346*e63e88bcSRyusuke Konishi __le32 fi_ndatablk; 347*e63e88bcSRyusuke Konishi }; 348*e63e88bcSRyusuke Konishi 349*e63e88bcSRyusuke Konishi /** 350*e63e88bcSRyusuke Konishi * struct nilfs_binfo_v - information on a data block (except DAT) 351*e63e88bcSRyusuke Konishi * @bi_vblocknr: virtual block number 352*e63e88bcSRyusuke Konishi * @bi_blkoff: block offset 353*e63e88bcSRyusuke Konishi */ 354*e63e88bcSRyusuke Konishi struct nilfs_binfo_v { 355*e63e88bcSRyusuke Konishi __le64 bi_vblocknr; 356*e63e88bcSRyusuke Konishi __le64 bi_blkoff; 357*e63e88bcSRyusuke Konishi }; 358*e63e88bcSRyusuke Konishi 359*e63e88bcSRyusuke Konishi /** 360*e63e88bcSRyusuke Konishi * struct nilfs_binfo_dat - information on a DAT node block 361*e63e88bcSRyusuke Konishi * @bi_blkoff: block offset 362*e63e88bcSRyusuke Konishi * @bi_level: level 363*e63e88bcSRyusuke Konishi * @bi_pad: padding 364*e63e88bcSRyusuke Konishi */ 365*e63e88bcSRyusuke Konishi struct nilfs_binfo_dat { 366*e63e88bcSRyusuke Konishi __le64 bi_blkoff; 367*e63e88bcSRyusuke Konishi __u8 bi_level; 368*e63e88bcSRyusuke Konishi __u8 bi_pad[7]; 369*e63e88bcSRyusuke Konishi }; 370*e63e88bcSRyusuke Konishi 371*e63e88bcSRyusuke Konishi /** 372*e63e88bcSRyusuke Konishi * union nilfs_binfo: block information 373*e63e88bcSRyusuke Konishi * @bi_v: nilfs_binfo_v structure 374*e63e88bcSRyusuke Konishi * @bi_dat: nilfs_binfo_dat structure 375*e63e88bcSRyusuke Konishi */ 376*e63e88bcSRyusuke Konishi union nilfs_binfo { 377*e63e88bcSRyusuke Konishi struct nilfs_binfo_v bi_v; 378*e63e88bcSRyusuke Konishi struct nilfs_binfo_dat bi_dat; 379*e63e88bcSRyusuke Konishi }; 380*e63e88bcSRyusuke Konishi 381*e63e88bcSRyusuke Konishi /** 382*e63e88bcSRyusuke Konishi * struct nilfs_segment_summary - segment summary header 383*e63e88bcSRyusuke Konishi * @ss_datasum: checksum of data 384*e63e88bcSRyusuke Konishi * @ss_sumsum: checksum of segment summary 385*e63e88bcSRyusuke Konishi * @ss_magic: magic number 386*e63e88bcSRyusuke Konishi * @ss_bytes: size of this structure in bytes 387*e63e88bcSRyusuke Konishi * @ss_flags: flags 388*e63e88bcSRyusuke Konishi * @ss_seq: sequence number 389*e63e88bcSRyusuke Konishi * @ss_create: creation timestamp 390*e63e88bcSRyusuke Konishi * @ss_next: next segment 391*e63e88bcSRyusuke Konishi * @ss_nblocks: number of blocks 392*e63e88bcSRyusuke Konishi * @ss_nfinfo: number of finfo structures 393*e63e88bcSRyusuke Konishi * @ss_sumbytes: total size of segment summary in bytes 394*e63e88bcSRyusuke Konishi * @ss_pad: padding 395*e63e88bcSRyusuke Konishi * @ss_cno: checkpoint number 396*e63e88bcSRyusuke Konishi */ 397*e63e88bcSRyusuke Konishi struct nilfs_segment_summary { 398*e63e88bcSRyusuke Konishi __le32 ss_datasum; 399*e63e88bcSRyusuke Konishi __le32 ss_sumsum; 400*e63e88bcSRyusuke Konishi __le32 ss_magic; 401*e63e88bcSRyusuke Konishi __le16 ss_bytes; 402*e63e88bcSRyusuke Konishi __le16 ss_flags; 403*e63e88bcSRyusuke Konishi __le64 ss_seq; 404*e63e88bcSRyusuke Konishi __le64 ss_create; 405*e63e88bcSRyusuke Konishi __le64 ss_next; 406*e63e88bcSRyusuke Konishi __le32 ss_nblocks; 407*e63e88bcSRyusuke Konishi __le32 ss_nfinfo; 408*e63e88bcSRyusuke Konishi __le32 ss_sumbytes; 409*e63e88bcSRyusuke Konishi __le32 ss_pad; 410*e63e88bcSRyusuke Konishi __le64 ss_cno; 411*e63e88bcSRyusuke Konishi /* array of finfo structures */ 412*e63e88bcSRyusuke Konishi }; 413*e63e88bcSRyusuke Konishi 414*e63e88bcSRyusuke Konishi #define NILFS_SEGSUM_MAGIC 0x1eaffa11 /* segment summary magic number */ 415*e63e88bcSRyusuke Konishi 416*e63e88bcSRyusuke Konishi /* 417*e63e88bcSRyusuke Konishi * Segment summary flags 418*e63e88bcSRyusuke Konishi */ 419*e63e88bcSRyusuke Konishi #define NILFS_SS_LOGBGN 0x0001 /* begins a logical segment */ 420*e63e88bcSRyusuke Konishi #define NILFS_SS_LOGEND 0x0002 /* ends a logical segment */ 421*e63e88bcSRyusuke Konishi #define NILFS_SS_SR 0x0004 /* has super root */ 422*e63e88bcSRyusuke Konishi #define NILFS_SS_SYNDT 0x0008 /* includes data only updates */ 423*e63e88bcSRyusuke Konishi #define NILFS_SS_GC 0x0010 /* segment written for cleaner operation */ 424*e63e88bcSRyusuke Konishi 425*e63e88bcSRyusuke Konishi /** 426*e63e88bcSRyusuke Konishi * struct nilfs_btree_node - header of B-tree node block 427*e63e88bcSRyusuke Konishi * @bn_flags: flags 428*e63e88bcSRyusuke Konishi * @bn_level: level 429*e63e88bcSRyusuke Konishi * @bn_nchildren: number of children 430*e63e88bcSRyusuke Konishi * @bn_pad: padding 431*e63e88bcSRyusuke Konishi */ 432*e63e88bcSRyusuke Konishi struct nilfs_btree_node { 433*e63e88bcSRyusuke Konishi __u8 bn_flags; 434*e63e88bcSRyusuke Konishi __u8 bn_level; 435*e63e88bcSRyusuke Konishi __le16 bn_nchildren; 436*e63e88bcSRyusuke Konishi __le32 bn_pad; 437*e63e88bcSRyusuke Konishi }; 438*e63e88bcSRyusuke Konishi 439*e63e88bcSRyusuke Konishi /* flags */ 440*e63e88bcSRyusuke Konishi #define NILFS_BTREE_NODE_ROOT 0x01 441*e63e88bcSRyusuke Konishi 442*e63e88bcSRyusuke Konishi /* level */ 443*e63e88bcSRyusuke Konishi #define NILFS_BTREE_LEVEL_DATA 0 444*e63e88bcSRyusuke Konishi #define NILFS_BTREE_LEVEL_NODE_MIN (NILFS_BTREE_LEVEL_DATA + 1) 445*e63e88bcSRyusuke Konishi #define NILFS_BTREE_LEVEL_MAX 14 /* Max level (exclusive) */ 446*e63e88bcSRyusuke Konishi 447*e63e88bcSRyusuke Konishi /** 448*e63e88bcSRyusuke Konishi * struct nilfs_direct_node - header of built-in bmap array 449*e63e88bcSRyusuke Konishi * @dn_flags: flags 450*e63e88bcSRyusuke Konishi * @dn_pad: padding 451*e63e88bcSRyusuke Konishi */ 452*e63e88bcSRyusuke Konishi struct nilfs_direct_node { 453*e63e88bcSRyusuke Konishi __u8 dn_flags; 454*e63e88bcSRyusuke Konishi __u8 pad[7]; 455*e63e88bcSRyusuke Konishi }; 456*e63e88bcSRyusuke Konishi 457*e63e88bcSRyusuke Konishi /** 458*e63e88bcSRyusuke Konishi * struct nilfs_palloc_group_desc - block group descriptor 459*e63e88bcSRyusuke Konishi * @pg_nfrees: number of free entries in block group 460*e63e88bcSRyusuke Konishi */ 461*e63e88bcSRyusuke Konishi struct nilfs_palloc_group_desc { 462*e63e88bcSRyusuke Konishi __le32 pg_nfrees; 463*e63e88bcSRyusuke Konishi }; 464*e63e88bcSRyusuke Konishi 465*e63e88bcSRyusuke Konishi /** 466*e63e88bcSRyusuke Konishi * struct nilfs_dat_entry - disk address translation entry 467*e63e88bcSRyusuke Konishi * @de_blocknr: block number 468*e63e88bcSRyusuke Konishi * @de_start: start checkpoint number 469*e63e88bcSRyusuke Konishi * @de_end: end checkpoint number 470*e63e88bcSRyusuke Konishi * @de_rsv: reserved for future use 471*e63e88bcSRyusuke Konishi */ 472*e63e88bcSRyusuke Konishi struct nilfs_dat_entry { 473*e63e88bcSRyusuke Konishi __le64 de_blocknr; 474*e63e88bcSRyusuke Konishi __le64 de_start; 475*e63e88bcSRyusuke Konishi __le64 de_end; 476*e63e88bcSRyusuke Konishi __le64 de_rsv; 477*e63e88bcSRyusuke Konishi }; 478*e63e88bcSRyusuke Konishi 479*e63e88bcSRyusuke Konishi #define NILFS_MIN_DAT_ENTRY_SIZE 32 480*e63e88bcSRyusuke Konishi 481*e63e88bcSRyusuke Konishi /** 482*e63e88bcSRyusuke Konishi * struct nilfs_snapshot_list - snapshot list 483*e63e88bcSRyusuke Konishi * @ssl_next: next checkpoint number on snapshot list 484*e63e88bcSRyusuke Konishi * @ssl_prev: previous checkpoint number on snapshot list 485*e63e88bcSRyusuke Konishi */ 486*e63e88bcSRyusuke Konishi struct nilfs_snapshot_list { 487*e63e88bcSRyusuke Konishi __le64 ssl_next; 488*e63e88bcSRyusuke Konishi __le64 ssl_prev; 489*e63e88bcSRyusuke Konishi }; 490*e63e88bcSRyusuke Konishi 491*e63e88bcSRyusuke Konishi /** 492*e63e88bcSRyusuke Konishi * struct nilfs_checkpoint - checkpoint structure 493*e63e88bcSRyusuke Konishi * @cp_flags: flags 494*e63e88bcSRyusuke Konishi * @cp_checkpoints_count: checkpoints count in a block 495*e63e88bcSRyusuke Konishi * @cp_snapshot_list: snapshot list 496*e63e88bcSRyusuke Konishi * @cp_cno: checkpoint number 497*e63e88bcSRyusuke Konishi * @cp_create: creation timestamp 498*e63e88bcSRyusuke Konishi * @cp_nblk_inc: number of blocks incremented by this checkpoint 499*e63e88bcSRyusuke Konishi * @cp_inodes_count: inodes count 500*e63e88bcSRyusuke Konishi * @cp_blocks_count: blocks count 501*e63e88bcSRyusuke Konishi * @cp_ifile_inode: inode of ifile 502*e63e88bcSRyusuke Konishi */ 503*e63e88bcSRyusuke Konishi struct nilfs_checkpoint { 504*e63e88bcSRyusuke Konishi __le32 cp_flags; 505*e63e88bcSRyusuke Konishi __le32 cp_checkpoints_count; 506*e63e88bcSRyusuke Konishi struct nilfs_snapshot_list cp_snapshot_list; 507*e63e88bcSRyusuke Konishi __le64 cp_cno; 508*e63e88bcSRyusuke Konishi __le64 cp_create; 509*e63e88bcSRyusuke Konishi __le64 cp_nblk_inc; 510*e63e88bcSRyusuke Konishi __le64 cp_inodes_count; 511*e63e88bcSRyusuke Konishi __le64 cp_blocks_count; 512*e63e88bcSRyusuke Konishi 513*e63e88bcSRyusuke Konishi /* 514*e63e88bcSRyusuke Konishi * Do not change the byte offset of ifile inode. 515*e63e88bcSRyusuke Konishi * To keep the compatibility of the disk format, 516*e63e88bcSRyusuke Konishi * additional fields should be added behind cp_ifile_inode. 517*e63e88bcSRyusuke Konishi */ 518*e63e88bcSRyusuke Konishi struct nilfs_inode cp_ifile_inode; 519*e63e88bcSRyusuke Konishi }; 520*e63e88bcSRyusuke Konishi 521*e63e88bcSRyusuke Konishi #define NILFS_MIN_CHECKPOINT_SIZE (64 + NILFS_MIN_INODE_SIZE) 522*e63e88bcSRyusuke Konishi 523*e63e88bcSRyusuke Konishi /* checkpoint flags */ 524*e63e88bcSRyusuke Konishi enum { 525*e63e88bcSRyusuke Konishi NILFS_CHECKPOINT_SNAPSHOT, 526*e63e88bcSRyusuke Konishi NILFS_CHECKPOINT_INVALID, 527*e63e88bcSRyusuke Konishi NILFS_CHECKPOINT_SKETCH, 528*e63e88bcSRyusuke Konishi NILFS_CHECKPOINT_MINOR, 529*e63e88bcSRyusuke Konishi }; 530*e63e88bcSRyusuke Konishi 531*e63e88bcSRyusuke Konishi #define NILFS_CHECKPOINT_FNS(flag, name) \ 532*e63e88bcSRyusuke Konishi static inline void \ 533*e63e88bcSRyusuke Konishi nilfs_checkpoint_set_##name(struct nilfs_checkpoint *cp) \ 534*e63e88bcSRyusuke Konishi { \ 535*e63e88bcSRyusuke Konishi cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) | \ 536*e63e88bcSRyusuke Konishi (1UL << NILFS_CHECKPOINT_##flag)); \ 537*e63e88bcSRyusuke Konishi } \ 538*e63e88bcSRyusuke Konishi static inline void \ 539*e63e88bcSRyusuke Konishi nilfs_checkpoint_clear_##name(struct nilfs_checkpoint *cp) \ 540*e63e88bcSRyusuke Konishi { \ 541*e63e88bcSRyusuke Konishi cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) & \ 542*e63e88bcSRyusuke Konishi ~(1UL << NILFS_CHECKPOINT_##flag)); \ 543*e63e88bcSRyusuke Konishi } \ 544*e63e88bcSRyusuke Konishi static inline int \ 545*e63e88bcSRyusuke Konishi nilfs_checkpoint_##name(const struct nilfs_checkpoint *cp) \ 546*e63e88bcSRyusuke Konishi { \ 547*e63e88bcSRyusuke Konishi return !!(le32_to_cpu(cp->cp_flags) & \ 548*e63e88bcSRyusuke Konishi (1UL << NILFS_CHECKPOINT_##flag)); \ 549*e63e88bcSRyusuke Konishi } 550*e63e88bcSRyusuke Konishi 551*e63e88bcSRyusuke Konishi NILFS_CHECKPOINT_FNS(SNAPSHOT, snapshot) 552*e63e88bcSRyusuke Konishi NILFS_CHECKPOINT_FNS(INVALID, invalid) 553*e63e88bcSRyusuke Konishi NILFS_CHECKPOINT_FNS(MINOR, minor) 554*e63e88bcSRyusuke Konishi 555*e63e88bcSRyusuke Konishi /** 556*e63e88bcSRyusuke Konishi * struct nilfs_cpfile_header - checkpoint file header 557*e63e88bcSRyusuke Konishi * @ch_ncheckpoints: number of checkpoints 558*e63e88bcSRyusuke Konishi * @ch_nsnapshots: number of snapshots 559*e63e88bcSRyusuke Konishi * @ch_snapshot_list: snapshot list 560*e63e88bcSRyusuke Konishi */ 561*e63e88bcSRyusuke Konishi struct nilfs_cpfile_header { 562*e63e88bcSRyusuke Konishi __le64 ch_ncheckpoints; 563*e63e88bcSRyusuke Konishi __le64 ch_nsnapshots; 564*e63e88bcSRyusuke Konishi struct nilfs_snapshot_list ch_snapshot_list; 565*e63e88bcSRyusuke Konishi }; 566*e63e88bcSRyusuke Konishi 567*e63e88bcSRyusuke Konishi #define NILFS_CPFILE_FIRST_CHECKPOINT_OFFSET \ 568*e63e88bcSRyusuke Konishi ((sizeof(struct nilfs_cpfile_header) + \ 569*e63e88bcSRyusuke Konishi sizeof(struct nilfs_checkpoint) - 1) / \ 570*e63e88bcSRyusuke Konishi sizeof(struct nilfs_checkpoint)) 571*e63e88bcSRyusuke Konishi 572*e63e88bcSRyusuke Konishi /** 573*e63e88bcSRyusuke Konishi * struct nilfs_segment_usage - segment usage 574*e63e88bcSRyusuke Konishi * @su_lastmod: last modified timestamp 575*e63e88bcSRyusuke Konishi * @su_nblocks: number of blocks in segment 576*e63e88bcSRyusuke Konishi * @su_flags: flags 577*e63e88bcSRyusuke Konishi */ 578*e63e88bcSRyusuke Konishi struct nilfs_segment_usage { 579*e63e88bcSRyusuke Konishi __le64 su_lastmod; 580*e63e88bcSRyusuke Konishi __le32 su_nblocks; 581*e63e88bcSRyusuke Konishi __le32 su_flags; 582*e63e88bcSRyusuke Konishi }; 583*e63e88bcSRyusuke Konishi 584*e63e88bcSRyusuke Konishi #define NILFS_MIN_SEGMENT_USAGE_SIZE 16 585*e63e88bcSRyusuke Konishi 586*e63e88bcSRyusuke Konishi /* segment usage flag */ 587*e63e88bcSRyusuke Konishi enum { 588*e63e88bcSRyusuke Konishi NILFS_SEGMENT_USAGE_ACTIVE, 589*e63e88bcSRyusuke Konishi NILFS_SEGMENT_USAGE_DIRTY, 590*e63e88bcSRyusuke Konishi NILFS_SEGMENT_USAGE_ERROR, 591*e63e88bcSRyusuke Konishi }; 592*e63e88bcSRyusuke Konishi 593*e63e88bcSRyusuke Konishi #define NILFS_SEGMENT_USAGE_FNS(flag, name) \ 594*e63e88bcSRyusuke Konishi static inline void \ 595*e63e88bcSRyusuke Konishi nilfs_segment_usage_set_##name(struct nilfs_segment_usage *su) \ 596*e63e88bcSRyusuke Konishi { \ 597*e63e88bcSRyusuke Konishi su->su_flags = cpu_to_le32(le32_to_cpu(su->su_flags) | \ 598*e63e88bcSRyusuke Konishi (1UL << NILFS_SEGMENT_USAGE_##flag));\ 599*e63e88bcSRyusuke Konishi } \ 600*e63e88bcSRyusuke Konishi static inline void \ 601*e63e88bcSRyusuke Konishi nilfs_segment_usage_clear_##name(struct nilfs_segment_usage *su) \ 602*e63e88bcSRyusuke Konishi { \ 603*e63e88bcSRyusuke Konishi su->su_flags = \ 604*e63e88bcSRyusuke Konishi cpu_to_le32(le32_to_cpu(su->su_flags) & \ 605*e63e88bcSRyusuke Konishi ~(1UL << NILFS_SEGMENT_USAGE_##flag)); \ 606*e63e88bcSRyusuke Konishi } \ 607*e63e88bcSRyusuke Konishi static inline int \ 608*e63e88bcSRyusuke Konishi nilfs_segment_usage_##name(const struct nilfs_segment_usage *su) \ 609*e63e88bcSRyusuke Konishi { \ 610*e63e88bcSRyusuke Konishi return !!(le32_to_cpu(su->su_flags) & \ 611*e63e88bcSRyusuke Konishi (1UL << NILFS_SEGMENT_USAGE_##flag)); \ 612*e63e88bcSRyusuke Konishi } 613*e63e88bcSRyusuke Konishi 614*e63e88bcSRyusuke Konishi NILFS_SEGMENT_USAGE_FNS(ACTIVE, active) 615*e63e88bcSRyusuke Konishi NILFS_SEGMENT_USAGE_FNS(DIRTY, dirty) 616*e63e88bcSRyusuke Konishi NILFS_SEGMENT_USAGE_FNS(ERROR, error) 617*e63e88bcSRyusuke Konishi 618*e63e88bcSRyusuke Konishi static inline void 619*e63e88bcSRyusuke Konishi nilfs_segment_usage_set_clean(struct nilfs_segment_usage *su) 620*e63e88bcSRyusuke Konishi { 621*e63e88bcSRyusuke Konishi su->su_lastmod = cpu_to_le64(0); 622*e63e88bcSRyusuke Konishi su->su_nblocks = cpu_to_le32(0); 623*e63e88bcSRyusuke Konishi su->su_flags = cpu_to_le32(0); 624*e63e88bcSRyusuke Konishi } 625*e63e88bcSRyusuke Konishi 626*e63e88bcSRyusuke Konishi static inline int 627*e63e88bcSRyusuke Konishi nilfs_segment_usage_clean(const struct nilfs_segment_usage *su) 628*e63e88bcSRyusuke Konishi { 629*e63e88bcSRyusuke Konishi return !le32_to_cpu(su->su_flags); 630*e63e88bcSRyusuke Konishi } 631*e63e88bcSRyusuke Konishi 632*e63e88bcSRyusuke Konishi /** 633*e63e88bcSRyusuke Konishi * struct nilfs_sufile_header - segment usage file header 634*e63e88bcSRyusuke Konishi * @sh_ncleansegs: number of clean segments 635*e63e88bcSRyusuke Konishi * @sh_ndirtysegs: number of dirty segments 636*e63e88bcSRyusuke Konishi * @sh_last_alloc: last allocated segment number 637*e63e88bcSRyusuke Konishi */ 638*e63e88bcSRyusuke Konishi struct nilfs_sufile_header { 639*e63e88bcSRyusuke Konishi __le64 sh_ncleansegs; 640*e63e88bcSRyusuke Konishi __le64 sh_ndirtysegs; 641*e63e88bcSRyusuke Konishi __le64 sh_last_alloc; 642*e63e88bcSRyusuke Konishi /* ... */ 643*e63e88bcSRyusuke Konishi }; 644*e63e88bcSRyusuke Konishi 645*e63e88bcSRyusuke Konishi #define NILFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET \ 646*e63e88bcSRyusuke Konishi ((sizeof(struct nilfs_sufile_header) + \ 647*e63e88bcSRyusuke Konishi sizeof(struct nilfs_segment_usage) - 1) / \ 648*e63e88bcSRyusuke Konishi sizeof(struct nilfs_segment_usage)) 649*e63e88bcSRyusuke Konishi 650*e63e88bcSRyusuke Konishi #endif /* _LINUX_NILFS2_ONDISK_H */ 651