1/* 2 * nilfs2_fs.h - NILFS2 on-disk structures and common declarations. 3 * 4 * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 19 * 20 * Written by Koji Sato <koji@osrg.net> 21 * Ryusuke Konishi <ryusuke@osrg.net> 22 */ 23/* 24 * linux/include/linux/ext2_fs.h 25 * 26 * Copyright (C) 1992, 1993, 1994, 1995 27 * Remy Card (card@masi.ibp.fr) 28 * Laboratoire MASI - Institut Blaise Pascal 29 * Universite Pierre et Marie Curie (Paris VI) 30 * 31 * from 32 * 33 * linux/include/linux/minix_fs.h 34 * 35 * Copyright (C) 1991, 1992 Linus Torvalds 36 */ 37 38#ifndef _LINUX_NILFS_FS_H 39#define _LINUX_NILFS_FS_H 40 41#include <linux/types.h> 42#include <linux/ioctl.h> 43 44/* 45 * Inode flags stored in nilfs_inode and on-memory nilfs inode 46 * 47 * We define these flags based on ext2-fs because of the 48 * compatibility reason; to avoid problems in chattr(1) 49 */ 50#define NILFS_SECRM_FL 0x00000001 /* Secure deletion */ 51#define NILFS_UNRM_FL 0x00000002 /* Undelete */ 52#define NILFS_SYNC_FL 0x00000008 /* Synchronous updates */ 53#define NILFS_IMMUTABLE_FL 0x00000010 /* Immutable file */ 54#define NILFS_APPEND_FL 0x00000020 /* writes to file may only append */ 55#define NILFS_NODUMP_FL 0x00000040 /* do not dump file */ 56#define NILFS_NOATIME_FL 0x00000080 /* do not update atime */ 57/* Reserved for compression usage... */ 58#define NILFS_NOTAIL_FL 0x00008000 /* file tail should not be merged */ 59#define NILFS_DIRSYNC_FL 0x00010000 /* dirsync behaviour */ 60 61#define NILFS_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */ 62#define NILFS_FL_USER_MODIFIABLE 0x000380FF /* User modifiable flags */ 63 64 65#define NILFS_INODE_BMAP_SIZE 7 66/** 67 * struct nilfs_inode - structure of an inode on disk 68 * @i_blocks: blocks count 69 * @i_size: size in bytes 70 * @i_ctime: creation time (seconds) 71 * @i_mtime: modification time (seconds) 72 * @i_ctime_nsec: creation time (nano seconds) 73 * @i_mtime_nsec: modification time (nano seconds) 74 * @i_uid: user id 75 * @i_gid: group id 76 * @i_mode: file mode 77 * @i_links_count: links count 78 * @i_flags: file flags 79 * @i_bmap: block mapping 80 * @i_xattr: extended attributes 81 * @i_generation: file generation (for NFS) 82 * @i_pad: padding 83 */ 84struct nilfs_inode { 85 __le64 i_blocks; 86 __le64 i_size; 87 __le64 i_ctime; 88 __le64 i_mtime; 89 __le32 i_ctime_nsec; 90 __le32 i_mtime_nsec; 91 __le32 i_uid; 92 __le32 i_gid; 93 __le16 i_mode; 94 __le16 i_links_count; 95 __le32 i_flags; 96 __le64 i_bmap[NILFS_INODE_BMAP_SIZE]; 97#define i_device_code i_bmap[0] 98 __le64 i_xattr; 99 __le32 i_generation; 100 __le32 i_pad; 101}; 102 103/** 104 * struct nilfs_super_root - structure of super root 105 * @sr_sum: check sum 106 * @sr_bytes: byte count of the structure 107 * @sr_flags: flags (reserved) 108 * @sr_nongc_ctime: write time of the last segment not for cleaner operation 109 * @sr_dat: DAT file inode 110 * @sr_cpfile: checkpoint file inode 111 * @sr_sufile: segment usage file inode 112 */ 113struct nilfs_super_root { 114 __le32 sr_sum; 115 __le16 sr_bytes; 116 __le16 sr_flags; 117 __le64 sr_nongc_ctime; 118 struct nilfs_inode sr_dat; 119 struct nilfs_inode sr_cpfile; 120 struct nilfs_inode sr_sufile; 121}; 122 123#define NILFS_SR_MDT_OFFSET(inode_size, i) \ 124 ((unsigned long)&((struct nilfs_super_root *)0)->sr_dat + \ 125 (inode_size) * (i)) 126#define NILFS_SR_DAT_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 0) 127#define NILFS_SR_CPFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 1) 128#define NILFS_SR_SUFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 2) 129#define NILFS_SR_BYTES (sizeof(struct nilfs_super_root)) 130 131/* 132 * Maximal mount counts 133 */ 134#define NILFS_DFL_MAX_MNT_COUNT 50 /* 50 mounts */ 135 136/* 137 * File system states (sbp->s_state, nilfs->ns_mount_state) 138 */ 139#define NILFS_VALID_FS 0x0001 /* Unmounted cleanly */ 140#define NILFS_ERROR_FS 0x0002 /* Errors detected */ 141#define NILFS_RESIZE_FS 0x0004 /* Resize required */ 142 143/* 144 * Mount flags (sbi->s_mount_opt) 145 */ 146#define NILFS_MOUNT_ERROR_MODE 0x0070 /* Error mode mask */ 147#define NILFS_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */ 148#define NILFS_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */ 149#define NILFS_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ 150#define NILFS_MOUNT_SNAPSHOT 0x0080 /* Snapshot flag */ 151#define NILFS_MOUNT_BARRIER 0x1000 /* Use block barriers */ 152#define NILFS_MOUNT_STRICT_ORDER 0x2000 /* Apply strict in-order 153 semantics also for data */ 154 155 156/** 157 * struct nilfs_super_block - structure of super block on disk 158 */ 159struct nilfs_super_block { 160 __le32 s_rev_level; /* Revision level */ 161 __le16 s_minor_rev_level; /* minor revision level */ 162 __le16 s_magic; /* Magic signature */ 163 164 __le16 s_bytes; /* Bytes count of CRC calculation 165 for this structure. s_reserved 166 is excluded. */ 167 __le16 s_flags; /* flags */ 168 __le32 s_crc_seed; /* Seed value of CRC calculation */ 169 __le32 s_sum; /* Check sum of super block */ 170 171 __le32 s_log_block_size; /* Block size represented as follows 172 blocksize = 173 1 << (s_log_block_size + 10) */ 174 __le64 s_nsegments; /* Number of segments in filesystem */ 175 __le64 s_dev_size; /* block device size in bytes */ 176 __le64 s_first_data_block; /* 1st seg disk block number */ 177 __le32 s_blocks_per_segment; /* number of blocks per full segment */ 178 __le32 s_r_segments_percentage; /* Reserved segments percentage */ 179 180 __le64 s_last_cno; /* Last checkpoint number */ 181 __le64 s_last_pseg; /* disk block addr pseg written last */ 182 __le64 s_last_seq; /* seq. number of seg written last */ 183 __le64 s_free_blocks_count; /* Free blocks count */ 184 185 __le64 s_ctime; /* Creation time (execution time of 186 newfs) */ 187 __le64 s_mtime; /* Mount time */ 188 __le64 s_wtime; /* Write time */ 189 __le16 s_mnt_count; /* Mount count */ 190 __le16 s_max_mnt_count; /* Maximal mount count */ 191 __le16 s_state; /* File system state */ 192 __le16 s_errors; /* Behaviour when detecting errors */ 193 __le64 s_lastcheck; /* time of last check */ 194 195 __le32 s_checkinterval; /* max. time between checks */ 196 __le32 s_creator_os; /* OS */ 197 __le16 s_def_resuid; /* Default uid for reserved blocks */ 198 __le16 s_def_resgid; /* Default gid for reserved blocks */ 199 __le32 s_first_ino; /* First non-reserved inode */ 200 201 __le16 s_inode_size; /* Size of an inode */ 202 __le16 s_dat_entry_size; /* Size of a dat entry */ 203 __le16 s_checkpoint_size; /* Size of a checkpoint */ 204 __le16 s_segment_usage_size; /* Size of a segment usage */ 205 206 __u8 s_uuid[16]; /* 128-bit uuid for volume */ 207 char s_volume_name[16]; /* volume name */ 208 char s_last_mounted[64]; /* directory where last mounted */ 209 210 __le32 s_c_interval; /* Commit interval of segment */ 211 __le32 s_c_block_max; /* Threshold of data amount for 212 the segment construction */ 213 __u32 s_reserved[192]; /* padding to the end of the block */ 214}; 215 216/* 217 * Codes for operating systems 218 */ 219#define NILFS_OS_LINUX 0 220/* Codes from 1 to 4 are reserved to keep compatibility with ext2 creator-OS */ 221 222/* 223 * Revision levels 224 */ 225#define NILFS_CURRENT_REV 2 /* current major revision */ 226#define NILFS_MINOR_REV 0 /* minor revision */ 227 228/* 229 * Bytes count of super_block for CRC-calculation 230 */ 231#define NILFS_SB_BYTES \ 232 ((long)&((struct nilfs_super_block *)0)->s_reserved) 233 234/* 235 * Special inode number 236 */ 237#define NILFS_ROOT_INO 2 /* Root file inode */ 238#define NILFS_DAT_INO 3 /* DAT file */ 239#define NILFS_CPFILE_INO 4 /* checkpoint file */ 240#define NILFS_SUFILE_INO 5 /* segment usage file */ 241#define NILFS_IFILE_INO 6 /* ifile */ 242#define NILFS_ATIME_INO 7 /* Atime file (reserved) */ 243#define NILFS_XATTR_INO 8 /* Xattribute file (reserved) */ 244#define NILFS_SKETCH_INO 10 /* Sketch file */ 245#define NILFS_USER_INO 11 /* Fisrt user's file inode number */ 246 247#define NILFS_SB_OFFSET_BYTES 1024 /* byte offset of nilfs superblock */ 248#define NILFS_SUPER_MAGIC 0x3434 /* NILFS filesystem magic number */ 249 250#define NILFS_SEG_MIN_BLOCKS 16 /* Minimum number of blocks in 251 a full segment */ 252#define NILFS_PSEG_MIN_BLOCKS 2 /* Minimum number of blocks in 253 a partial segment */ 254#define NILFS_MIN_NRSVSEGS 8 /* Minimum number of reserved 255 segments */ 256 257/* 258 * bytes offset of secondary super block 259 */ 260#define NILFS_SB2_OFFSET_BYTES(devsize) ((((devsize) >> 12) - 1) << 12) 261 262/* 263 * Maximal count of links to a file 264 */ 265#define NILFS_LINK_MAX 32000 266 267/* 268 * Structure of a directory entry 269 * (Same as ext2) 270 */ 271 272#define NILFS_NAME_LEN 255 273 274/* 275 * The new version of the directory entry. Since V0 structures are 276 * stored in intel byte order, and the name_len field could never be 277 * bigger than 255 chars, it's safe to reclaim the extra byte for the 278 * file_type field. 279 */ 280struct nilfs_dir_entry { 281 __le64 inode; /* Inode number */ 282 __le16 rec_len; /* Directory entry length */ 283 __u8 name_len; /* Name length */ 284 __u8 file_type; 285 char name[NILFS_NAME_LEN]; /* File name */ 286 char pad; 287}; 288 289/* 290 * NILFS directory file types. Only the low 3 bits are used. The 291 * other bits are reserved for now. 292 */ 293enum { 294 NILFS_FT_UNKNOWN, 295 NILFS_FT_REG_FILE, 296 NILFS_FT_DIR, 297 NILFS_FT_CHRDEV, 298 NILFS_FT_BLKDEV, 299 NILFS_FT_FIFO, 300 NILFS_FT_SOCK, 301 NILFS_FT_SYMLINK, 302 NILFS_FT_MAX 303}; 304 305/* 306 * NILFS_DIR_PAD defines the directory entries boundaries 307 * 308 * NOTE: It must be a multiple of 8 309 */ 310#define NILFS_DIR_PAD 8 311#define NILFS_DIR_ROUND (NILFS_DIR_PAD - 1) 312#define NILFS_DIR_REC_LEN(name_len) (((name_len) + 12 + NILFS_DIR_ROUND) & \ 313 ~NILFS_DIR_ROUND) 314 315 316/** 317 * struct nilfs_finfo - file information 318 * @fi_ino: inode number 319 * @fi_cno: checkpoint number 320 * @fi_nblocks: number of blocks (including intermediate blocks) 321 * @fi_ndatablk: number of file data blocks 322 */ 323struct nilfs_finfo { 324 __le64 fi_ino; 325 __le64 fi_cno; 326 __le32 fi_nblocks; 327 __le32 fi_ndatablk; 328 /* array of virtual block numbers */ 329}; 330 331/** 332 * struct nilfs_binfo_v - information for the block to which a virtual block number is assigned 333 * @bi_vblocknr: virtual block number 334 * @bi_blkoff: block offset 335 */ 336struct nilfs_binfo_v { 337 __le64 bi_vblocknr; 338 __le64 bi_blkoff; 339}; 340 341/** 342 * struct nilfs_binfo_dat - information for the block which belongs to the DAT file 343 * @bi_blkoff: block offset 344 * @bi_level: level 345 * @bi_pad: padding 346 */ 347struct nilfs_binfo_dat { 348 __le64 bi_blkoff; 349 __u8 bi_level; 350 __u8 bi_pad[7]; 351}; 352 353/** 354 * union nilfs_binfo: block information 355 * @bi_v: nilfs_binfo_v structure 356 * @bi_dat: nilfs_binfo_dat structure 357 */ 358union nilfs_binfo { 359 struct nilfs_binfo_v bi_v; 360 struct nilfs_binfo_dat bi_dat; 361}; 362 363/** 364 * struct nilfs_segment_summary - segment summary 365 * @ss_datasum: checksum of data 366 * @ss_sumsum: checksum of segment summary 367 * @ss_magic: magic number 368 * @ss_bytes: size of this structure in bytes 369 * @ss_flags: flags 370 * @ss_seq: sequence number 371 * @ss_create: creation timestamp 372 * @ss_next: next segment 373 * @ss_nblocks: number of blocks 374 * @ss_nfinfo: number of finfo structures 375 * @ss_sumbytes: total size of segment summary in bytes 376 * @ss_pad: padding 377 */ 378struct nilfs_segment_summary { 379 __le32 ss_datasum; 380 __le32 ss_sumsum; 381 __le32 ss_magic; 382 __le16 ss_bytes; 383 __le16 ss_flags; 384 __le64 ss_seq; 385 __le64 ss_create; 386 __le64 ss_next; 387 __le32 ss_nblocks; 388 __le32 ss_nfinfo; 389 __le32 ss_sumbytes; 390 __le32 ss_pad; 391 /* array of finfo structures */ 392}; 393 394#define NILFS_SEGSUM_MAGIC 0x1eaffa11 /* segment summary magic number */ 395 396/* 397 * Segment summary flags 398 */ 399#define NILFS_SS_LOGBGN 0x0001 /* begins a logical segment */ 400#define NILFS_SS_LOGEND 0x0002 /* ends a logical segment */ 401#define NILFS_SS_SR 0x0004 /* has super root */ 402#define NILFS_SS_SYNDT 0x0008 /* includes data only updates */ 403#define NILFS_SS_GC 0x0010 /* segment written for cleaner operation */ 404 405/** 406 * struct nilfs_palloc_group_desc - block group descriptor 407 * @pg_nfrees: number of free entries in block group 408 */ 409struct nilfs_palloc_group_desc { 410 __le32 pg_nfrees; 411}; 412 413/** 414 * struct nilfs_dat_entry - disk address translation entry 415 * @dt_blocknr: block number 416 * @dt_start: start checkpoint number 417 * @dt_end: end checkpoint number 418 * @dt_rsv: reserved for future use 419 */ 420struct nilfs_dat_entry { 421 __le64 de_blocknr; 422 __le64 de_start; 423 __le64 de_end; 424 __le64 de_rsv; 425}; 426 427/** 428 * struct nilfs_dat_group_desc - block group descriptor 429 * @dg_nfrees: number of free virtual block numbers in block group 430 */ 431struct nilfs_dat_group_desc { 432 __le32 dg_nfrees; 433}; 434 435 436/** 437 * struct nilfs_snapshot_list - snapshot list 438 * @ssl_next: next checkpoint number on snapshot list 439 * @ssl_prev: previous checkpoint number on snapshot list 440 */ 441struct nilfs_snapshot_list { 442 __le64 ssl_next; 443 __le64 ssl_prev; 444}; 445 446/** 447 * struct nilfs_checkpoint - checkpoint structure 448 * @cp_flags: flags 449 * @cp_checkpoints_count: checkpoints count in a block 450 * @cp_snapshot_list: snapshot list 451 * @cp_cno: checkpoint number 452 * @cp_create: creation timestamp 453 * @cp_nblk_inc: number of blocks incremented by this checkpoint 454 * @cp_inodes_count: inodes count 455 * @cp_blocks_count: blocks count 456 * @cp_ifile_inode: inode of ifile 457 */ 458struct nilfs_checkpoint { 459 __le32 cp_flags; 460 __le32 cp_checkpoints_count; 461 struct nilfs_snapshot_list cp_snapshot_list; 462 __le64 cp_cno; 463 __le64 cp_create; 464 __le64 cp_nblk_inc; 465 __le64 cp_inodes_count; 466 __le64 cp_blocks_count; /* Reserved (might be deleted) */ 467 468 /* Do not change the byte offset of ifile inode. 469 To keep the compatibility of the disk format, 470 additional fields should be added behind cp_ifile_inode. */ 471 struct nilfs_inode cp_ifile_inode; 472}; 473 474/* checkpoint flags */ 475enum { 476 NILFS_CHECKPOINT_SNAPSHOT, 477 NILFS_CHECKPOINT_INVALID, 478 NILFS_CHECKPOINT_SKETCH, 479 NILFS_CHECKPOINT_MINOR, 480}; 481 482#define NILFS_CHECKPOINT_FNS(flag, name) \ 483static inline void \ 484nilfs_checkpoint_set_##name(struct nilfs_checkpoint *cp) \ 485{ \ 486 cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) | \ 487 (1UL << NILFS_CHECKPOINT_##flag)); \ 488} \ 489static inline void \ 490nilfs_checkpoint_clear_##name(struct nilfs_checkpoint *cp) \ 491{ \ 492 cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) & \ 493 ~(1UL << NILFS_CHECKPOINT_##flag)); \ 494} \ 495static inline int \ 496nilfs_checkpoint_##name(const struct nilfs_checkpoint *cp) \ 497{ \ 498 return !!(le32_to_cpu(cp->cp_flags) & \ 499 (1UL << NILFS_CHECKPOINT_##flag)); \ 500} 501 502NILFS_CHECKPOINT_FNS(SNAPSHOT, snapshot) 503NILFS_CHECKPOINT_FNS(INVALID, invalid) 504NILFS_CHECKPOINT_FNS(MINOR, minor) 505 506/** 507 * struct nilfs_cpinfo - checkpoint information 508 * @ci_flags: flags 509 * @ci_pad: padding 510 * @ci_cno: checkpoint number 511 * @ci_create: creation timestamp 512 * @ci_nblk_inc: number of blocks incremented by this checkpoint 513 * @ci_inodes_count: inodes count 514 * @ci_blocks_count: blocks count 515 * @ci_next: next checkpoint number in snapshot list 516 */ 517struct nilfs_cpinfo { 518 __u32 ci_flags; 519 __u32 ci_pad; 520 __u64 ci_cno; 521 __u64 ci_create; 522 __u64 ci_nblk_inc; 523 __u64 ci_inodes_count; 524 __u64 ci_blocks_count; 525 __u64 ci_next; 526}; 527 528#define NILFS_CPINFO_FNS(flag, name) \ 529static inline int \ 530nilfs_cpinfo_##name(const struct nilfs_cpinfo *cpinfo) \ 531{ \ 532 return !!(cpinfo->ci_flags & (1UL << NILFS_CHECKPOINT_##flag)); \ 533} 534 535NILFS_CPINFO_FNS(SNAPSHOT, snapshot) 536NILFS_CPINFO_FNS(INVALID, invalid) 537NILFS_CPINFO_FNS(MINOR, minor) 538 539 540/** 541 * struct nilfs_cpfile_header - checkpoint file header 542 * @ch_ncheckpoints: number of checkpoints 543 * @ch_nsnapshots: number of snapshots 544 * @ch_snapshot_list: snapshot list 545 */ 546struct nilfs_cpfile_header { 547 __le64 ch_ncheckpoints; 548 __le64 ch_nsnapshots; 549 struct nilfs_snapshot_list ch_snapshot_list; 550}; 551 552#define NILFS_CPFILE_FIRST_CHECKPOINT_OFFSET \ 553 ((sizeof(struct nilfs_cpfile_header) + \ 554 sizeof(struct nilfs_checkpoint) - 1) / \ 555 sizeof(struct nilfs_checkpoint)) 556 557/** 558 * struct nilfs_segment_usage - segment usage 559 * @su_lastmod: last modified timestamp 560 * @su_nblocks: number of blocks in segment 561 * @su_flags: flags 562 */ 563struct nilfs_segment_usage { 564 __le64 su_lastmod; 565 __le32 su_nblocks; 566 __le32 su_flags; 567}; 568 569/* segment usage flag */ 570enum { 571 NILFS_SEGMENT_USAGE_ACTIVE, 572 NILFS_SEGMENT_USAGE_DIRTY, 573 NILFS_SEGMENT_USAGE_ERROR, 574 575 /* ... */ 576}; 577 578#define NILFS_SEGMENT_USAGE_FNS(flag, name) \ 579static inline void \ 580nilfs_segment_usage_set_##name(struct nilfs_segment_usage *su) \ 581{ \ 582 su->su_flags = cpu_to_le32(le32_to_cpu(su->su_flags) | \ 583 (1UL << NILFS_SEGMENT_USAGE_##flag));\ 584} \ 585static inline void \ 586nilfs_segment_usage_clear_##name(struct nilfs_segment_usage *su) \ 587{ \ 588 su->su_flags = \ 589 cpu_to_le32(le32_to_cpu(su->su_flags) & \ 590 ~(1UL << NILFS_SEGMENT_USAGE_##flag)); \ 591} \ 592static inline int \ 593nilfs_segment_usage_##name(const struct nilfs_segment_usage *su) \ 594{ \ 595 return !!(le32_to_cpu(su->su_flags) & \ 596 (1UL << NILFS_SEGMENT_USAGE_##flag)); \ 597} 598 599NILFS_SEGMENT_USAGE_FNS(ACTIVE, active) 600NILFS_SEGMENT_USAGE_FNS(DIRTY, dirty) 601NILFS_SEGMENT_USAGE_FNS(ERROR, error) 602 603static inline void 604nilfs_segment_usage_set_clean(struct nilfs_segment_usage *su) 605{ 606 su->su_lastmod = cpu_to_le64(0); 607 su->su_nblocks = cpu_to_le32(0); 608 su->su_flags = cpu_to_le32(0); 609} 610 611static inline int 612nilfs_segment_usage_clean(const struct nilfs_segment_usage *su) 613{ 614 return !le32_to_cpu(su->su_flags); 615} 616 617/** 618 * struct nilfs_sufile_header - segment usage file header 619 * @sh_ncleansegs: number of clean segments 620 * @sh_ndirtysegs: number of dirty segments 621 * @sh_last_alloc: last allocated segment number 622 */ 623struct nilfs_sufile_header { 624 __le64 sh_ncleansegs; 625 __le64 sh_ndirtysegs; 626 __le64 sh_last_alloc; 627 /* ... */ 628}; 629 630#define NILFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET \ 631 ((sizeof(struct nilfs_sufile_header) + \ 632 sizeof(struct nilfs_segment_usage) - 1) / \ 633 sizeof(struct nilfs_segment_usage)) 634 635/** 636 * nilfs_suinfo - segment usage information 637 * @sui_lastmod: 638 * @sui_nblocks: 639 * @sui_flags: 640 */ 641struct nilfs_suinfo { 642 __u64 sui_lastmod; 643 __u32 sui_nblocks; 644 __u32 sui_flags; 645}; 646 647#define NILFS_SUINFO_FNS(flag, name) \ 648static inline int \ 649nilfs_suinfo_##name(const struct nilfs_suinfo *si) \ 650{ \ 651 return si->sui_flags & (1UL << NILFS_SEGMENT_USAGE_##flag); \ 652} 653 654NILFS_SUINFO_FNS(ACTIVE, active) 655NILFS_SUINFO_FNS(DIRTY, dirty) 656NILFS_SUINFO_FNS(ERROR, error) 657 658static inline int nilfs_suinfo_clean(const struct nilfs_suinfo *si) 659{ 660 return !si->sui_flags; 661} 662 663/* ioctl */ 664enum { 665 NILFS_CHECKPOINT, 666 NILFS_SNAPSHOT, 667}; 668 669/** 670 * struct nilfs_cpmode - 671 * @cc_cno: 672 * @cc_mode: 673 */ 674struct nilfs_cpmode { 675 __u64 cm_cno; 676 __u32 cm_mode; 677 __u32 cm_pad; 678}; 679 680/** 681 * struct nilfs_argv - argument vector 682 * @v_base: 683 * @v_nmembs: 684 * @v_size: 685 * @v_flags: 686 * @v_index: 687 */ 688struct nilfs_argv { 689 __u64 v_base; 690 __u32 v_nmembs; /* number of members */ 691 __u16 v_size; /* size of members */ 692 __u16 v_flags; 693 __u64 v_index; 694}; 695 696/** 697 * struct nilfs_period - 698 * @p_start: 699 * @p_end: 700 */ 701struct nilfs_period { 702 __u64 p_start; 703 __u64 p_end; 704}; 705 706/** 707 * struct nilfs_cpstat - 708 * @cs_cno: checkpoint number 709 * @cs_ncps: number of checkpoints 710 * @cs_nsss: number of snapshots 711 */ 712struct nilfs_cpstat { 713 __u64 cs_cno; 714 __u64 cs_ncps; 715 __u64 cs_nsss; 716}; 717 718/** 719 * struct nilfs_sustat - 720 * @ss_nsegs: number of segments 721 * @ss_ncleansegs: number of clean segments 722 * @ss_ndirtysegs: number of dirty segments 723 * @ss_ctime: creation time of the last segment 724 * @ss_nongc_ctime: creation time of the last segment not for GC 725 * @ss_prot_seq: least sequence number of segments which must not be reclaimed 726 */ 727struct nilfs_sustat { 728 __u64 ss_nsegs; 729 __u64 ss_ncleansegs; 730 __u64 ss_ndirtysegs; 731 __u64 ss_ctime; 732 __u64 ss_nongc_ctime; 733 __u64 ss_prot_seq; 734}; 735 736/** 737 * struct nilfs_vinfo - virtual block number information 738 * @vi_vblocknr: 739 * @vi_start: 740 * @vi_end: 741 * @vi_blocknr: 742 */ 743struct nilfs_vinfo { 744 __u64 vi_vblocknr; 745 __u64 vi_start; 746 __u64 vi_end; 747 __u64 vi_blocknr; 748}; 749 750/** 751 * struct nilfs_vdesc - 752 */ 753struct nilfs_vdesc { 754 __u64 vd_ino; 755 __u64 vd_cno; 756 __u64 vd_vblocknr; 757 struct nilfs_period vd_period; 758 __u64 vd_blocknr; 759 __u64 vd_offset; 760 __u32 vd_flags; 761 __u32 vd_pad; 762}; 763 764/** 765 * struct nilfs_bdesc - 766 */ 767struct nilfs_bdesc { 768 __u64 bd_ino; 769 __u64 bd_oblocknr; 770 __u64 bd_blocknr; 771 __u64 bd_offset; 772 __u32 bd_level; 773 __u32 bd_pad; 774}; 775 776#define NILFS_IOCTL_IDENT 'n' 777 778#define NILFS_IOCTL_CHANGE_CPMODE \ 779 _IOW(NILFS_IOCTL_IDENT, 0x80, struct nilfs_cpmode) 780#define NILFS_IOCTL_DELETE_CHECKPOINT \ 781 _IOW(NILFS_IOCTL_IDENT, 0x81, __u64) 782#define NILFS_IOCTL_GET_CPINFO \ 783 _IOR(NILFS_IOCTL_IDENT, 0x82, struct nilfs_argv) 784#define NILFS_IOCTL_GET_CPSTAT \ 785 _IOR(NILFS_IOCTL_IDENT, 0x83, struct nilfs_cpstat) 786#define NILFS_IOCTL_GET_SUINFO \ 787 _IOR(NILFS_IOCTL_IDENT, 0x84, struct nilfs_argv) 788#define NILFS_IOCTL_GET_SUSTAT \ 789 _IOR(NILFS_IOCTL_IDENT, 0x85, struct nilfs_sustat) 790#define NILFS_IOCTL_GET_VINFO \ 791 _IOWR(NILFS_IOCTL_IDENT, 0x86, struct nilfs_argv) 792#define NILFS_IOCTL_GET_BDESCS \ 793 _IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv) 794#define NILFS_IOCTL_CLEAN_SEGMENTS \ 795 _IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv[5]) 796#define NILFS_IOCTL_SYNC \ 797 _IOR(NILFS_IOCTL_IDENT, 0x8A, __u64) 798#define NILFS_IOCTL_RESIZE \ 799 _IOW(NILFS_IOCTL_IDENT, 0x8B, __u64) 800 801#endif /* _LINUX_NILFS_FS_H */