652 lines · c
1/* SPDX-License-Identifier: LGPL-2.1+ WITH Linux-syscall-note */2/*3 * nilfs2_ondisk.h - NILFS2 on-disk structures4 *5 * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.6 *7 * This program is free software; you can redistribute it and/or modify8 * it under the terms of the GNU Lesser General Public License as published9 * by the Free Software Foundation; either version 2.1 of the License, or10 * (at your option) any later version.11 */12/*13 * linux/include/linux/ext2_fs.h14 *15 * Copyright (C) 1992, 1993, 1994, 199516 * Remy Card (card@masi.ibp.fr)17 * Laboratoire MASI - Institut Blaise Pascal18 * Universite Pierre et Marie Curie (Paris VI)19 *20 * from21 *22 * linux/include/linux/minix_fs.h23 *24 * Copyright (C) 1991, 1992 Linus Torvalds25 */26 27#ifndef _LINUX_NILFS2_ONDISK_H28#define _LINUX_NILFS2_ONDISK_H29 30#include <linux/types.h>31#include <linux/magic.h>32#include <asm/byteorder.h>33 34#define NILFS_INODE_BMAP_SIZE 735 36/**37 * struct nilfs_inode - structure of an inode on disk38 * @i_blocks: blocks count39 * @i_size: size in bytes40 * @i_ctime: creation time (seconds)41 * @i_mtime: modification time (seconds)42 * @i_ctime_nsec: creation time (nano seconds)43 * @i_mtime_nsec: modification time (nano seconds)44 * @i_uid: user id45 * @i_gid: group id46 * @i_mode: file mode47 * @i_links_count: links count48 * @i_flags: file flags49 * @i_bmap: block mapping50 * @i_xattr: extended attributes51 * @i_generation: file generation (for NFS)52 * @i_pad: padding53 */54struct nilfs_inode {55 __le64 i_blocks;56 __le64 i_size;57 __le64 i_ctime;58 __le64 i_mtime;59 __le32 i_ctime_nsec;60 __le32 i_mtime_nsec;61 __le32 i_uid;62 __le32 i_gid;63 __le16 i_mode;64 __le16 i_links_count;65 __le32 i_flags;66 __le64 i_bmap[NILFS_INODE_BMAP_SIZE];67#define i_device_code i_bmap[0]68 __le64 i_xattr;69 __le32 i_generation;70 __le32 i_pad;71};72 73#define NILFS_MIN_INODE_SIZE 12874 75/**76 * struct nilfs_super_root - structure of super root77 * @sr_sum: check sum78 * @sr_bytes: byte count of the structure79 * @sr_flags: flags (reserved)80 * @sr_nongc_ctime: write time of the last segment not for cleaner operation81 * @sr_dat: DAT file inode82 * @sr_cpfile: checkpoint file inode83 * @sr_sufile: segment usage file inode84 */85struct nilfs_super_root {86 __le32 sr_sum;87 __le16 sr_bytes;88 __le16 sr_flags;89 __le64 sr_nongc_ctime;90 struct nilfs_inode sr_dat;91 struct nilfs_inode sr_cpfile;92 struct nilfs_inode sr_sufile;93};94 95#define NILFS_SR_MDT_OFFSET(inode_size, i) \96 ((unsigned long)&((struct nilfs_super_root *)0)->sr_dat + \97 (inode_size) * (i))98#define NILFS_SR_DAT_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 0)99#define NILFS_SR_CPFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 1)100#define NILFS_SR_SUFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 2)101#define NILFS_SR_BYTES(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 3)102 103/*104 * Maximal mount counts105 */106#define NILFS_DFL_MAX_MNT_COUNT 50 /* 50 mounts */107 108/*109 * File system states (sbp->s_state, nilfs->ns_mount_state)110 */111#define NILFS_VALID_FS 0x0001 /* Unmounted cleanly */112#define NILFS_ERROR_FS 0x0002 /* Errors detected */113#define NILFS_RESIZE_FS 0x0004 /* Resize required */114 115/*116 * Mount flags (sbi->s_mount_opt)117 */118#define NILFS_MOUNT_ERROR_MODE 0x0070 /* Error mode mask */119#define NILFS_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */120#define NILFS_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */121#define NILFS_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */122#define NILFS_MOUNT_BARRIER 0x1000 /* Use block barriers */123#define NILFS_MOUNT_STRICT_ORDER 0x2000 /*124 * Apply strict in-order125 * semantics also for data126 */127#define NILFS_MOUNT_NORECOVERY 0x4000 /*128 * Disable write access during129 * mount-time recovery130 */131#define NILFS_MOUNT_DISCARD 0x8000 /* Issue DISCARD requests */132 133 134/**135 * struct nilfs_super_block - structure of super block on disk136 */137struct nilfs_super_block {138/*00*/ __le32 s_rev_level; /* Revision level */139 __le16 s_minor_rev_level; /* minor revision level */140 __le16 s_magic; /* Magic signature */141 142 __le16 s_bytes; /*143 * Bytes count of CRC calculation144 * for this structure. s_reserved145 * is excluded.146 */147 __le16 s_flags; /* flags */148 __le32 s_crc_seed; /* Seed value of CRC calculation */149/*10*/ __le32 s_sum; /* Check sum of super block */150 151 __le32 s_log_block_size; /*152 * Block size represented as follows153 * blocksize =154 * 1 << (s_log_block_size + 10)155 */156 __le64 s_nsegments; /* Number of segments in filesystem */157/*20*/ __le64 s_dev_size; /* block device size in bytes */158 __le64 s_first_data_block; /* 1st seg disk block number */159/*30*/ __le32 s_blocks_per_segment; /* number of blocks per full segment */160 __le32 s_r_segments_percentage; /* Reserved segments percentage */161 162 __le64 s_last_cno; /* Last checkpoint number */163/*40*/ __le64 s_last_pseg; /* disk block addr pseg written last */164 __le64 s_last_seq; /* seq. number of seg written last */165/*50*/ __le64 s_free_blocks_count; /* Free blocks count */166 167 __le64 s_ctime; /*168 * Creation time (execution time of169 * newfs)170 */171/*60*/ __le64 s_mtime; /* Mount time */172 __le64 s_wtime; /* Write time */173/*70*/ __le16 s_mnt_count; /* Mount count */174 __le16 s_max_mnt_count; /* Maximal mount count */175 __le16 s_state; /* File system state */176 __le16 s_errors; /* Behaviour when detecting errors */177 __le64 s_lastcheck; /* time of last check */178 179/*80*/ __le32 s_checkinterval; /* max. time between checks */180 __le32 s_creator_os; /* OS */181 __le16 s_def_resuid; /* Default uid for reserved blocks */182 __le16 s_def_resgid; /* Default gid for reserved blocks */183 __le32 s_first_ino; /* First non-reserved inode */184 185/*90*/ __le16 s_inode_size; /* Size of an inode */186 __le16 s_dat_entry_size; /* Size of a dat entry */187 __le16 s_checkpoint_size; /* Size of a checkpoint */188 __le16 s_segment_usage_size; /* Size of a segment usage */189 190/*98*/ __u8 s_uuid[16]; /* 128-bit uuid for volume */191/*A8*/ char s_volume_name[80]; /* volume name */192 193/*F8*/ __le32 s_c_interval; /* Commit interval of segment */194 __le32 s_c_block_max; /*195 * Threshold of data amount for196 * the segment construction197 */198/*100*/ __le64 s_feature_compat; /* Compatible feature set */199 __le64 s_feature_compat_ro; /* Read-only compatible feature set */200 __le64 s_feature_incompat; /* Incompatible feature set */201 __u32 s_reserved[186]; /* padding to the end of the block */202};203 204/*205 * Codes for operating systems206 */207#define NILFS_OS_LINUX 0208/* Codes from 1 to 4 are reserved to keep compatibility with ext2 creator-OS */209 210/*211 * Revision levels212 */213#define NILFS_CURRENT_REV 2 /* current major revision */214#define NILFS_MINOR_REV 0 /* minor revision */215#define NILFS_MIN_SUPP_REV 2 /* minimum supported revision */216 217/*218 * Feature set definitions219 *220 * If there is a bit set in the incompatible feature set that the kernel221 * doesn't know about, it should refuse to mount the filesystem.222 */223#define NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT 0x00000001ULL224 225#define NILFS_FEATURE_COMPAT_SUPP 0ULL226#define NILFS_FEATURE_COMPAT_RO_SUPP NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT227#define NILFS_FEATURE_INCOMPAT_SUPP 0ULL228 229/*230 * Bytes count of super_block for CRC-calculation231 */232#define NILFS_SB_BYTES \233 ((long)&((struct nilfs_super_block *)0)->s_reserved)234 235/*236 * Special inode number237 */238#define NILFS_ROOT_INO 2 /* Root file inode */239#define NILFS_DAT_INO 3 /* DAT file */240#define NILFS_CPFILE_INO 4 /* checkpoint file */241#define NILFS_SUFILE_INO 5 /* segment usage file */242#define NILFS_IFILE_INO 6 /* ifile */243#define NILFS_ATIME_INO 7 /* Atime file (reserved) */244#define NILFS_XATTR_INO 8 /* Xattribute file (reserved) */245#define NILFS_SKETCH_INO 10 /* Sketch file */246#define NILFS_USER_INO 11 /* Fisrt user's file inode number */247 248#define NILFS_SB_OFFSET_BYTES 1024 /* byte offset of nilfs superblock */249 250#define NILFS_SEG_MIN_BLOCKS 16 /*251 * Minimum number of blocks in252 * a full segment253 */254#define NILFS_PSEG_MIN_BLOCKS 2 /*255 * Minimum number of blocks in256 * a partial segment257 */258#define NILFS_MIN_NRSVSEGS 8 /*259 * Minimum number of reserved260 * segments261 */262 263/*264 * We call DAT, cpfile, and sufile root metadata files. Inodes of265 * these files are written in super root block instead of ifile, and266 * garbage collector doesn't keep any past versions of these files.267 */268#define NILFS_ROOT_METADATA_FILE(ino) \269 ((ino) >= NILFS_DAT_INO && (ino) <= NILFS_SUFILE_INO)270 271/*272 * bytes offset of secondary super block273 */274#define NILFS_SB2_OFFSET_BYTES(devsize) ((((devsize) >> 12) - 1) << 12)275 276/*277 * Maximal count of links to a file278 */279#define NILFS_LINK_MAX 32000280 281/*282 * Structure of a directory entry283 * (Same as ext2)284 */285 286#define NILFS_NAME_LEN 255287 288/*289 * Block size limitations290 */291#define NILFS_MIN_BLOCK_SIZE 1024292#define NILFS_MAX_BLOCK_SIZE 65536293 294/*295 * The new version of the directory entry. Since V0 structures are296 * stored in intel byte order, and the name_len field could never be297 * bigger than 255 chars, it's safe to reclaim the extra byte for the298 * file_type field.299 */300struct nilfs_dir_entry {301 __le64 inode; /* Inode number */302 __le16 rec_len; /* Directory entry length */303 __u8 name_len; /* Name length */304 __u8 file_type; /* Dir entry type (file, dir, etc) */305 char name[NILFS_NAME_LEN]; /* File name */306 char pad;307};308 309/*310 * NILFS directory file types. Only the low 3 bits are used. The311 * other bits are reserved for now.312 */313enum {314 NILFS_FT_UNKNOWN,315 NILFS_FT_REG_FILE,316 NILFS_FT_DIR,317 NILFS_FT_CHRDEV,318 NILFS_FT_BLKDEV,319 NILFS_FT_FIFO,320 NILFS_FT_SOCK,321 NILFS_FT_SYMLINK,322 NILFS_FT_MAX323};324 325/*326 * NILFS_DIR_PAD defines the directory entries boundaries327 *328 * NOTE: It must be a multiple of 8329 */330#define NILFS_DIR_PAD 8331#define NILFS_DIR_ROUND (NILFS_DIR_PAD - 1)332#define NILFS_DIR_REC_LEN(name_len) (((name_len) + 12 + NILFS_DIR_ROUND) & \333 ~NILFS_DIR_ROUND)334#define NILFS_MAX_REC_LEN ((1 << 16) - 1)335 336/**337 * struct nilfs_finfo - file information338 * @fi_ino: inode number339 * @fi_cno: checkpoint number340 * @fi_nblocks: number of blocks (including intermediate blocks)341 * @fi_ndatablk: number of file data blocks342 */343struct nilfs_finfo {344 __le64 fi_ino;345 __le64 fi_cno;346 __le32 fi_nblocks;347 __le32 fi_ndatablk;348};349 350/**351 * struct nilfs_binfo_v - information on a data block (except DAT)352 * @bi_vblocknr: virtual block number353 * @bi_blkoff: block offset354 */355struct nilfs_binfo_v {356 __le64 bi_vblocknr;357 __le64 bi_blkoff;358};359 360/**361 * struct nilfs_binfo_dat - information on a DAT node block362 * @bi_blkoff: block offset363 * @bi_level: level364 * @bi_pad: padding365 */366struct nilfs_binfo_dat {367 __le64 bi_blkoff;368 __u8 bi_level;369 __u8 bi_pad[7];370};371 372/**373 * union nilfs_binfo: block information374 * @bi_v: nilfs_binfo_v structure375 * @bi_dat: nilfs_binfo_dat structure376 */377union nilfs_binfo {378 struct nilfs_binfo_v bi_v;379 struct nilfs_binfo_dat bi_dat;380};381 382/**383 * struct nilfs_segment_summary - segment summary header384 * @ss_datasum: checksum of data385 * @ss_sumsum: checksum of segment summary386 * @ss_magic: magic number387 * @ss_bytes: size of this structure in bytes388 * @ss_flags: flags389 * @ss_seq: sequence number390 * @ss_create: creation timestamp391 * @ss_next: next segment392 * @ss_nblocks: number of blocks393 * @ss_nfinfo: number of finfo structures394 * @ss_sumbytes: total size of segment summary in bytes395 * @ss_pad: padding396 * @ss_cno: checkpoint number397 */398struct nilfs_segment_summary {399 __le32 ss_datasum;400 __le32 ss_sumsum;401 __le32 ss_magic;402 __le16 ss_bytes;403 __le16 ss_flags;404 __le64 ss_seq;405 __le64 ss_create;406 __le64 ss_next;407 __le32 ss_nblocks;408 __le32 ss_nfinfo;409 __le32 ss_sumbytes;410 __le32 ss_pad;411 __le64 ss_cno;412 /* array of finfo structures */413};414 415#define NILFS_SEGSUM_MAGIC 0x1eaffa11 /* segment summary magic number */416 417/*418 * Segment summary flags419 */420#define NILFS_SS_LOGBGN 0x0001 /* begins a logical segment */421#define NILFS_SS_LOGEND 0x0002 /* ends a logical segment */422#define NILFS_SS_SR 0x0004 /* has super root */423#define NILFS_SS_SYNDT 0x0008 /* includes data only updates */424#define NILFS_SS_GC 0x0010 /* segment written for cleaner operation */425 426/**427 * struct nilfs_btree_node - header of B-tree node block428 * @bn_flags: flags429 * @bn_level: level430 * @bn_nchildren: number of children431 * @bn_pad: padding432 */433struct nilfs_btree_node {434 __u8 bn_flags;435 __u8 bn_level;436 __le16 bn_nchildren;437 __le32 bn_pad;438};439 440/* flags */441#define NILFS_BTREE_NODE_ROOT 0x01442 443/* level */444#define NILFS_BTREE_LEVEL_DATA 0445#define NILFS_BTREE_LEVEL_NODE_MIN (NILFS_BTREE_LEVEL_DATA + 1)446#define NILFS_BTREE_LEVEL_MAX 14 /* Max level (exclusive) */447 448/**449 * struct nilfs_direct_node - header of built-in bmap array450 * @dn_flags: flags451 * @dn_pad: padding452 */453struct nilfs_direct_node {454 __u8 dn_flags;455 __u8 pad[7];456};457 458/**459 * struct nilfs_palloc_group_desc - block group descriptor460 * @pg_nfrees: number of free entries in block group461 */462struct nilfs_palloc_group_desc {463 __le32 pg_nfrees;464};465 466/**467 * struct nilfs_dat_entry - disk address translation entry468 * @de_blocknr: block number469 * @de_start: start checkpoint number470 * @de_end: end checkpoint number471 * @de_rsv: reserved for future use472 */473struct nilfs_dat_entry {474 __le64 de_blocknr;475 __le64 de_start;476 __le64 de_end;477 __le64 de_rsv;478};479 480#define NILFS_MIN_DAT_ENTRY_SIZE 32481 482/**483 * struct nilfs_snapshot_list - snapshot list484 * @ssl_next: next checkpoint number on snapshot list485 * @ssl_prev: previous checkpoint number on snapshot list486 */487struct nilfs_snapshot_list {488 __le64 ssl_next;489 __le64 ssl_prev;490};491 492/**493 * struct nilfs_checkpoint - checkpoint structure494 * @cp_flags: flags495 * @cp_checkpoints_count: checkpoints count in a block496 * @cp_snapshot_list: snapshot list497 * @cp_cno: checkpoint number498 * @cp_create: creation timestamp499 * @cp_nblk_inc: number of blocks incremented by this checkpoint500 * @cp_inodes_count: inodes count501 * @cp_blocks_count: blocks count502 * @cp_ifile_inode: inode of ifile503 */504struct nilfs_checkpoint {505 __le32 cp_flags;506 __le32 cp_checkpoints_count;507 struct nilfs_snapshot_list cp_snapshot_list;508 __le64 cp_cno;509 __le64 cp_create;510 __le64 cp_nblk_inc;511 __le64 cp_inodes_count;512 __le64 cp_blocks_count;513 514 /*515 * Do not change the byte offset of ifile inode.516 * To keep the compatibility of the disk format,517 * additional fields should be added behind cp_ifile_inode.518 */519 struct nilfs_inode cp_ifile_inode;520};521 522#define NILFS_MIN_CHECKPOINT_SIZE (64 + NILFS_MIN_INODE_SIZE)523 524/* checkpoint flags */525enum {526 NILFS_CHECKPOINT_SNAPSHOT,527 NILFS_CHECKPOINT_INVALID,528 NILFS_CHECKPOINT_SKETCH,529 NILFS_CHECKPOINT_MINOR,530};531 532#define NILFS_CHECKPOINT_FNS(flag, name) \533static inline void \534nilfs_checkpoint_set_##name(struct nilfs_checkpoint *cp) \535{ \536 cp->cp_flags = __cpu_to_le32(__le32_to_cpu(cp->cp_flags) | \537 (1UL << NILFS_CHECKPOINT_##flag)); \538} \539static inline void \540nilfs_checkpoint_clear_##name(struct nilfs_checkpoint *cp) \541{ \542 cp->cp_flags = __cpu_to_le32(__le32_to_cpu(cp->cp_flags) & \543 ~(1UL << NILFS_CHECKPOINT_##flag)); \544} \545static inline int \546nilfs_checkpoint_##name(const struct nilfs_checkpoint *cp) \547{ \548 return !!(__le32_to_cpu(cp->cp_flags) & \549 (1UL << NILFS_CHECKPOINT_##flag)); \550}551 552NILFS_CHECKPOINT_FNS(SNAPSHOT, snapshot)553NILFS_CHECKPOINT_FNS(INVALID, invalid)554NILFS_CHECKPOINT_FNS(MINOR, minor)555 556/**557 * struct nilfs_cpfile_header - checkpoint file header558 * @ch_ncheckpoints: number of checkpoints559 * @ch_nsnapshots: number of snapshots560 * @ch_snapshot_list: snapshot list561 */562struct nilfs_cpfile_header {563 __le64 ch_ncheckpoints;564 __le64 ch_nsnapshots;565 struct nilfs_snapshot_list ch_snapshot_list;566};567 568#define NILFS_CPFILE_FIRST_CHECKPOINT_OFFSET \569 ((sizeof(struct nilfs_cpfile_header) + \570 sizeof(struct nilfs_checkpoint) - 1) / \571 sizeof(struct nilfs_checkpoint))572 573/**574 * struct nilfs_segment_usage - segment usage575 * @su_lastmod: last modified timestamp576 * @su_nblocks: number of blocks in segment577 * @su_flags: flags578 */579struct nilfs_segment_usage {580 __le64 su_lastmod;581 __le32 su_nblocks;582 __le32 su_flags;583};584 585#define NILFS_MIN_SEGMENT_USAGE_SIZE 16586 587/* segment usage flag */588enum {589 NILFS_SEGMENT_USAGE_ACTIVE,590 NILFS_SEGMENT_USAGE_DIRTY,591 NILFS_SEGMENT_USAGE_ERROR,592};593 594#define NILFS_SEGMENT_USAGE_FNS(flag, name) \595static inline void \596nilfs_segment_usage_set_##name(struct nilfs_segment_usage *su) \597{ \598 su->su_flags = __cpu_to_le32(__le32_to_cpu(su->su_flags) | \599 (1UL << NILFS_SEGMENT_USAGE_##flag));\600} \601static inline void \602nilfs_segment_usage_clear_##name(struct nilfs_segment_usage *su) \603{ \604 su->su_flags = \605 __cpu_to_le32(__le32_to_cpu(su->su_flags) & \606 ~(1UL << NILFS_SEGMENT_USAGE_##flag)); \607} \608static inline int \609nilfs_segment_usage_##name(const struct nilfs_segment_usage *su) \610{ \611 return !!(__le32_to_cpu(su->su_flags) & \612 (1UL << NILFS_SEGMENT_USAGE_##flag)); \613}614 615NILFS_SEGMENT_USAGE_FNS(ACTIVE, active)616NILFS_SEGMENT_USAGE_FNS(DIRTY, dirty)617NILFS_SEGMENT_USAGE_FNS(ERROR, error)618 619static inline void620nilfs_segment_usage_set_clean(struct nilfs_segment_usage *su)621{622 su->su_lastmod = __cpu_to_le64(0);623 su->su_nblocks = __cpu_to_le32(0);624 su->su_flags = __cpu_to_le32(0);625}626 627static inline int628nilfs_segment_usage_clean(const struct nilfs_segment_usage *su)629{630 return !__le32_to_cpu(su->su_flags);631}632 633/**634 * struct nilfs_sufile_header - segment usage file header635 * @sh_ncleansegs: number of clean segments636 * @sh_ndirtysegs: number of dirty segments637 * @sh_last_alloc: last allocated segment number638 */639struct nilfs_sufile_header {640 __le64 sh_ncleansegs;641 __le64 sh_ndirtysegs;642 __le64 sh_last_alloc;643 /* ... */644};645 646#define NILFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET \647 ((sizeof(struct nilfs_sufile_header) + \648 sizeof(struct nilfs_segment_usage) - 1) / \649 sizeof(struct nilfs_segment_usage))650 651#endif /* _LINUX_NILFS2_ONDISK_H */652