at v3.13 24 kB view raw
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 Lesser General Public License as published 8 * by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser 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#include <linux/magic.h> 44#include <linux/bug.h> 45 46 47#define NILFS_INODE_BMAP_SIZE 7 48/** 49 * struct nilfs_inode - structure of an inode on disk 50 * @i_blocks: blocks count 51 * @i_size: size in bytes 52 * @i_ctime: creation time (seconds) 53 * @i_mtime: modification time (seconds) 54 * @i_ctime_nsec: creation time (nano seconds) 55 * @i_mtime_nsec: modification time (nano seconds) 56 * @i_uid: user id 57 * @i_gid: group id 58 * @i_mode: file mode 59 * @i_links_count: links count 60 * @i_flags: file flags 61 * @i_bmap: block mapping 62 * @i_xattr: extended attributes 63 * @i_generation: file generation (for NFS) 64 * @i_pad: padding 65 */ 66struct nilfs_inode { 67 __le64 i_blocks; 68 __le64 i_size; 69 __le64 i_ctime; 70 __le64 i_mtime; 71 __le32 i_ctime_nsec; 72 __le32 i_mtime_nsec; 73 __le32 i_uid; 74 __le32 i_gid; 75 __le16 i_mode; 76 __le16 i_links_count; 77 __le32 i_flags; 78 __le64 i_bmap[NILFS_INODE_BMAP_SIZE]; 79#define i_device_code i_bmap[0] 80 __le64 i_xattr; 81 __le32 i_generation; 82 __le32 i_pad; 83}; 84 85/** 86 * struct nilfs_super_root - structure of super root 87 * @sr_sum: check sum 88 * @sr_bytes: byte count of the structure 89 * @sr_flags: flags (reserved) 90 * @sr_nongc_ctime: write time of the last segment not for cleaner operation 91 * @sr_dat: DAT file inode 92 * @sr_cpfile: checkpoint file inode 93 * @sr_sufile: segment usage file inode 94 */ 95struct nilfs_super_root { 96 __le32 sr_sum; 97 __le16 sr_bytes; 98 __le16 sr_flags; 99 __le64 sr_nongc_ctime; 100 struct nilfs_inode sr_dat; 101 struct nilfs_inode sr_cpfile; 102 struct nilfs_inode sr_sufile; 103}; 104 105#define NILFS_SR_MDT_OFFSET(inode_size, i) \ 106 ((unsigned long)&((struct nilfs_super_root *)0)->sr_dat + \ 107 (inode_size) * (i)) 108#define NILFS_SR_DAT_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 0) 109#define NILFS_SR_CPFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 1) 110#define NILFS_SR_SUFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 2) 111#define NILFS_SR_BYTES(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 3) 112 113/* 114 * Maximal mount counts 115 */ 116#define NILFS_DFL_MAX_MNT_COUNT 50 /* 50 mounts */ 117 118/* 119 * File system states (sbp->s_state, nilfs->ns_mount_state) 120 */ 121#define NILFS_VALID_FS 0x0001 /* Unmounted cleanly */ 122#define NILFS_ERROR_FS 0x0002 /* Errors detected */ 123#define NILFS_RESIZE_FS 0x0004 /* Resize required */ 124 125/* 126 * Mount flags (sbi->s_mount_opt) 127 */ 128#define NILFS_MOUNT_ERROR_MODE 0x0070 /* Error mode mask */ 129#define NILFS_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */ 130#define NILFS_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */ 131#define NILFS_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ 132#define NILFS_MOUNT_BARRIER 0x1000 /* Use block barriers */ 133#define NILFS_MOUNT_STRICT_ORDER 0x2000 /* Apply strict in-order 134 semantics also for data */ 135#define NILFS_MOUNT_NORECOVERY 0x4000 /* Disable write access during 136 mount-time recovery */ 137#define NILFS_MOUNT_DISCARD 0x8000 /* Issue DISCARD requests */ 138 139 140/** 141 * struct nilfs_super_block - structure of super block on disk 142 */ 143struct nilfs_super_block { 144/*00*/ __le32 s_rev_level; /* Revision level */ 145 __le16 s_minor_rev_level; /* minor revision level */ 146 __le16 s_magic; /* Magic signature */ 147 148 __le16 s_bytes; /* Bytes count of CRC calculation 149 for this structure. s_reserved 150 is excluded. */ 151 __le16 s_flags; /* flags */ 152 __le32 s_crc_seed; /* Seed value of CRC calculation */ 153/*10*/ __le32 s_sum; /* Check sum of super block */ 154 155 __le32 s_log_block_size; /* Block size represented as follows 156 blocksize = 157 1 << (s_log_block_size + 10) */ 158 __le64 s_nsegments; /* Number of segments in filesystem */ 159/*20*/ __le64 s_dev_size; /* block device size in bytes */ 160 __le64 s_first_data_block; /* 1st seg disk block number */ 161/*30*/ __le32 s_blocks_per_segment; /* number of blocks per full segment */ 162 __le32 s_r_segments_percentage; /* Reserved segments percentage */ 163 164 __le64 s_last_cno; /* Last checkpoint number */ 165/*40*/ __le64 s_last_pseg; /* disk block addr pseg written last */ 166 __le64 s_last_seq; /* seq. number of seg written last */ 167/*50*/ __le64 s_free_blocks_count; /* Free blocks count */ 168 169 __le64 s_ctime; /* Creation time (execution time of 170 newfs) */ 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; /* Threshold of data amount for 195 the segment construction */ 196/*100*/ __le64 s_feature_compat; /* Compatible feature set */ 197 __le64 s_feature_compat_ro; /* Read-only compatible feature set */ 198 __le64 s_feature_incompat; /* Incompatible feature set */ 199 __u32 s_reserved[186]; /* padding to the end of the block */ 200}; 201 202/* 203 * Codes for operating systems 204 */ 205#define NILFS_OS_LINUX 0 206/* Codes from 1 to 4 are reserved to keep compatibility with ext2 creator-OS */ 207 208/* 209 * Revision levels 210 */ 211#define NILFS_CURRENT_REV 2 /* current major revision */ 212#define NILFS_MINOR_REV 0 /* minor revision */ 213#define NILFS_MIN_SUPP_REV 2 /* minimum supported revision */ 214 215/* 216 * Feature set definitions 217 * 218 * If there is a bit set in the incompatible feature set that the kernel 219 * doesn't know about, it should refuse to mount the filesystem. 220 */ 221#define NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT 0x00000001ULL 222 223#define NILFS_FEATURE_COMPAT_SUPP 0ULL 224#define NILFS_FEATURE_COMPAT_RO_SUPP NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT 225#define NILFS_FEATURE_INCOMPAT_SUPP 0ULL 226 227/* 228 * Bytes count of super_block for CRC-calculation 229 */ 230#define NILFS_SB_BYTES \ 231 ((long)&((struct nilfs_super_block *)0)->s_reserved) 232 233/* 234 * Special inode number 235 */ 236#define NILFS_ROOT_INO 2 /* Root file inode */ 237#define NILFS_DAT_INO 3 /* DAT file */ 238#define NILFS_CPFILE_INO 4 /* checkpoint file */ 239#define NILFS_SUFILE_INO 5 /* segment usage file */ 240#define NILFS_IFILE_INO 6 /* ifile */ 241#define NILFS_ATIME_INO 7 /* Atime file (reserved) */ 242#define NILFS_XATTR_INO 8 /* Xattribute file (reserved) */ 243#define NILFS_SKETCH_INO 10 /* Sketch file */ 244#define NILFS_USER_INO 11 /* Fisrt user's file inode number */ 245 246#define NILFS_SB_OFFSET_BYTES 1024 /* byte offset of nilfs superblock */ 247 248#define NILFS_SEG_MIN_BLOCKS 16 /* Minimum number of blocks in 249 a full segment */ 250#define NILFS_PSEG_MIN_BLOCKS 2 /* Minimum number of blocks in 251 a partial segment */ 252#define NILFS_MIN_NRSVSEGS 8 /* Minimum number of reserved 253 segments */ 254 255/* 256 * We call DAT, cpfile, and sufile root metadata files. Inodes of 257 * these files are written in super root block instead of ifile, and 258 * garbage collector doesn't keep any past versions of these files. 259 */ 260#define NILFS_ROOT_METADATA_FILE(ino) \ 261 ((ino) >= NILFS_DAT_INO && (ino) <= NILFS_SUFILE_INO) 262 263/* 264 * bytes offset of secondary super block 265 */ 266#define NILFS_SB2_OFFSET_BYTES(devsize) ((((devsize) >> 12) - 1) << 12) 267 268/* 269 * Maximal count of links to a file 270 */ 271#define NILFS_LINK_MAX 32000 272 273/* 274 * Structure of a directory entry 275 * (Same as ext2) 276 */ 277 278#define NILFS_NAME_LEN 255 279 280/* 281 * Block size limitations 282 */ 283#define NILFS_MIN_BLOCK_SIZE 1024 284#define NILFS_MAX_BLOCK_SIZE 65536 285 286/* 287 * The new version of the directory entry. Since V0 structures are 288 * stored in intel byte order, and the name_len field could never be 289 * bigger than 255 chars, it's safe to reclaim the extra byte for the 290 * file_type field. 291 */ 292struct nilfs_dir_entry { 293 __le64 inode; /* Inode number */ 294 __le16 rec_len; /* Directory entry length */ 295 __u8 name_len; /* Name length */ 296 __u8 file_type; /* Dir entry type (file, dir, etc) */ 297 char name[NILFS_NAME_LEN]; /* File name */ 298 char pad; 299}; 300 301/* 302 * NILFS directory file types. Only the low 3 bits are used. The 303 * other bits are reserved for now. 304 */ 305enum { 306 NILFS_FT_UNKNOWN, 307 NILFS_FT_REG_FILE, 308 NILFS_FT_DIR, 309 NILFS_FT_CHRDEV, 310 NILFS_FT_BLKDEV, 311 NILFS_FT_FIFO, 312 NILFS_FT_SOCK, 313 NILFS_FT_SYMLINK, 314 NILFS_FT_MAX 315}; 316 317/* 318 * NILFS_DIR_PAD defines the directory entries boundaries 319 * 320 * NOTE: It must be a multiple of 8 321 */ 322#define NILFS_DIR_PAD 8 323#define NILFS_DIR_ROUND (NILFS_DIR_PAD - 1) 324#define NILFS_DIR_REC_LEN(name_len) (((name_len) + 12 + NILFS_DIR_ROUND) & \ 325 ~NILFS_DIR_ROUND) 326#define NILFS_MAX_REC_LEN ((1<<16)-1) 327 328static inline unsigned nilfs_rec_len_from_disk(__le16 dlen) 329{ 330 unsigned len = le16_to_cpu(dlen); 331 332#if !defined(__KERNEL__) || (PAGE_CACHE_SIZE >= 65536) 333 if (len == NILFS_MAX_REC_LEN) 334 return 1 << 16; 335#endif 336 return len; 337} 338 339static inline __le16 nilfs_rec_len_to_disk(unsigned len) 340{ 341#if !defined(__KERNEL__) || (PAGE_CACHE_SIZE >= 65536) 342 if (len == (1 << 16)) 343 return cpu_to_le16(NILFS_MAX_REC_LEN); 344 else if (len > (1 << 16)) 345 BUG(); 346#endif 347 return cpu_to_le16(len); 348} 349 350/** 351 * struct nilfs_finfo - file information 352 * @fi_ino: inode number 353 * @fi_cno: checkpoint number 354 * @fi_nblocks: number of blocks (including intermediate blocks) 355 * @fi_ndatablk: number of file data blocks 356 */ 357struct nilfs_finfo { 358 __le64 fi_ino; 359 __le64 fi_cno; 360 __le32 fi_nblocks; 361 __le32 fi_ndatablk; 362 /* array of virtual block numbers */ 363}; 364 365/** 366 * struct nilfs_binfo_v - information for the block to which a virtual block number is assigned 367 * @bi_vblocknr: virtual block number 368 * @bi_blkoff: block offset 369 */ 370struct nilfs_binfo_v { 371 __le64 bi_vblocknr; 372 __le64 bi_blkoff; 373}; 374 375/** 376 * struct nilfs_binfo_dat - information for the block which belongs to the DAT file 377 * @bi_blkoff: block offset 378 * @bi_level: level 379 * @bi_pad: padding 380 */ 381struct nilfs_binfo_dat { 382 __le64 bi_blkoff; 383 __u8 bi_level; 384 __u8 bi_pad[7]; 385}; 386 387/** 388 * union nilfs_binfo: block information 389 * @bi_v: nilfs_binfo_v structure 390 * @bi_dat: nilfs_binfo_dat structure 391 */ 392union nilfs_binfo { 393 struct nilfs_binfo_v bi_v; 394 struct nilfs_binfo_dat bi_dat; 395}; 396 397/** 398 * struct nilfs_segment_summary - segment summary header 399 * @ss_datasum: checksum of data 400 * @ss_sumsum: checksum of segment summary 401 * @ss_magic: magic number 402 * @ss_bytes: size of this structure in bytes 403 * @ss_flags: flags 404 * @ss_seq: sequence number 405 * @ss_create: creation timestamp 406 * @ss_next: next segment 407 * @ss_nblocks: number of blocks 408 * @ss_nfinfo: number of finfo structures 409 * @ss_sumbytes: total size of segment summary in bytes 410 * @ss_pad: padding 411 * @ss_cno: checkpoint number 412 */ 413struct nilfs_segment_summary { 414 __le32 ss_datasum; 415 __le32 ss_sumsum; 416 __le32 ss_magic; 417 __le16 ss_bytes; 418 __le16 ss_flags; 419 __le64 ss_seq; 420 __le64 ss_create; 421 __le64 ss_next; 422 __le32 ss_nblocks; 423 __le32 ss_nfinfo; 424 __le32 ss_sumbytes; 425 __le32 ss_pad; 426 __le64 ss_cno; 427 /* array of finfo structures */ 428}; 429 430#define NILFS_SEGSUM_MAGIC 0x1eaffa11 /* segment summary magic number */ 431 432/* 433 * Segment summary flags 434 */ 435#define NILFS_SS_LOGBGN 0x0001 /* begins a logical segment */ 436#define NILFS_SS_LOGEND 0x0002 /* ends a logical segment */ 437#define NILFS_SS_SR 0x0004 /* has super root */ 438#define NILFS_SS_SYNDT 0x0008 /* includes data only updates */ 439#define NILFS_SS_GC 0x0010 /* segment written for cleaner operation */ 440 441/** 442 * struct nilfs_btree_node - B-tree node 443 * @bn_flags: flags 444 * @bn_level: level 445 * @bn_nchildren: number of children 446 * @bn_pad: padding 447 */ 448struct nilfs_btree_node { 449 __u8 bn_flags; 450 __u8 bn_level; 451 __le16 bn_nchildren; 452 __le32 bn_pad; 453}; 454 455/* flags */ 456#define NILFS_BTREE_NODE_ROOT 0x01 457 458/* level */ 459#define NILFS_BTREE_LEVEL_DATA 0 460#define NILFS_BTREE_LEVEL_NODE_MIN (NILFS_BTREE_LEVEL_DATA + 1) 461#define NILFS_BTREE_LEVEL_MAX 14 462 463/** 464 * struct nilfs_palloc_group_desc - block group descriptor 465 * @pg_nfrees: number of free entries in block group 466 */ 467struct nilfs_palloc_group_desc { 468 __le32 pg_nfrees; 469}; 470 471/** 472 * struct nilfs_dat_entry - disk address translation entry 473 * @de_blocknr: block number 474 * @de_start: start checkpoint number 475 * @de_end: end checkpoint number 476 * @de_rsv: reserved for future use 477 */ 478struct nilfs_dat_entry { 479 __le64 de_blocknr; 480 __le64 de_start; 481 __le64 de_end; 482 __le64 de_rsv; 483}; 484 485/** 486 * struct nilfs_snapshot_list - snapshot list 487 * @ssl_next: next checkpoint number on snapshot list 488 * @ssl_prev: previous checkpoint number on snapshot list 489 */ 490struct nilfs_snapshot_list { 491 __le64 ssl_next; 492 __le64 ssl_prev; 493}; 494 495/** 496 * struct nilfs_checkpoint - checkpoint structure 497 * @cp_flags: flags 498 * @cp_checkpoints_count: checkpoints count in a block 499 * @cp_snapshot_list: snapshot list 500 * @cp_cno: checkpoint number 501 * @cp_create: creation timestamp 502 * @cp_nblk_inc: number of blocks incremented by this checkpoint 503 * @cp_inodes_count: inodes count 504 * @cp_blocks_count: blocks count 505 * @cp_ifile_inode: inode of ifile 506 */ 507struct nilfs_checkpoint { 508 __le32 cp_flags; 509 __le32 cp_checkpoints_count; 510 struct nilfs_snapshot_list cp_snapshot_list; 511 __le64 cp_cno; 512 __le64 cp_create; 513 __le64 cp_nblk_inc; 514 __le64 cp_inodes_count; 515 __le64 cp_blocks_count; 516 517 /* Do not change the byte offset of ifile inode. 518 To keep the compatibility of the disk format, 519 additional fields should be added behind cp_ifile_inode. */ 520 struct nilfs_inode cp_ifile_inode; 521}; 522 523/* checkpoint flags */ 524enum { 525 NILFS_CHECKPOINT_SNAPSHOT, 526 NILFS_CHECKPOINT_INVALID, 527 NILFS_CHECKPOINT_SKETCH, 528 NILFS_CHECKPOINT_MINOR, 529}; 530 531#define NILFS_CHECKPOINT_FNS(flag, name) \ 532static inline void \ 533nilfs_checkpoint_set_##name(struct nilfs_checkpoint *cp) \ 534{ \ 535 cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) | \ 536 (1UL << NILFS_CHECKPOINT_##flag)); \ 537} \ 538static inline void \ 539nilfs_checkpoint_clear_##name(struct nilfs_checkpoint *cp) \ 540{ \ 541 cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) & \ 542 ~(1UL << NILFS_CHECKPOINT_##flag)); \ 543} \ 544static inline int \ 545nilfs_checkpoint_##name(const struct nilfs_checkpoint *cp) \ 546{ \ 547 return !!(le32_to_cpu(cp->cp_flags) & \ 548 (1UL << NILFS_CHECKPOINT_##flag)); \ 549} 550 551NILFS_CHECKPOINT_FNS(SNAPSHOT, snapshot) 552NILFS_CHECKPOINT_FNS(INVALID, invalid) 553NILFS_CHECKPOINT_FNS(MINOR, minor) 554 555/** 556 * struct nilfs_cpinfo - checkpoint information 557 * @ci_flags: flags 558 * @ci_pad: padding 559 * @ci_cno: checkpoint number 560 * @ci_create: creation timestamp 561 * @ci_nblk_inc: number of blocks incremented by this checkpoint 562 * @ci_inodes_count: inodes count 563 * @ci_blocks_count: blocks count 564 * @ci_next: next checkpoint number in snapshot list 565 */ 566struct nilfs_cpinfo { 567 __u32 ci_flags; 568 __u32 ci_pad; 569 __u64 ci_cno; 570 __u64 ci_create; 571 __u64 ci_nblk_inc; 572 __u64 ci_inodes_count; 573 __u64 ci_blocks_count; 574 __u64 ci_next; 575}; 576 577#define NILFS_CPINFO_FNS(flag, name) \ 578static inline int \ 579nilfs_cpinfo_##name(const struct nilfs_cpinfo *cpinfo) \ 580{ \ 581 return !!(cpinfo->ci_flags & (1UL << NILFS_CHECKPOINT_##flag)); \ 582} 583 584NILFS_CPINFO_FNS(SNAPSHOT, snapshot) 585NILFS_CPINFO_FNS(INVALID, invalid) 586NILFS_CPINFO_FNS(MINOR, minor) 587 588 589/** 590 * struct nilfs_cpfile_header - checkpoint file header 591 * @ch_ncheckpoints: number of checkpoints 592 * @ch_nsnapshots: number of snapshots 593 * @ch_snapshot_list: snapshot list 594 */ 595struct nilfs_cpfile_header { 596 __le64 ch_ncheckpoints; 597 __le64 ch_nsnapshots; 598 struct nilfs_snapshot_list ch_snapshot_list; 599}; 600 601#define NILFS_CPFILE_FIRST_CHECKPOINT_OFFSET \ 602 ((sizeof(struct nilfs_cpfile_header) + \ 603 sizeof(struct nilfs_checkpoint) - 1) / \ 604 sizeof(struct nilfs_checkpoint)) 605 606/** 607 * struct nilfs_segment_usage - segment usage 608 * @su_lastmod: last modified timestamp 609 * @su_nblocks: number of blocks in segment 610 * @su_flags: flags 611 */ 612struct nilfs_segment_usage { 613 __le64 su_lastmod; 614 __le32 su_nblocks; 615 __le32 su_flags; 616}; 617 618/* segment usage flag */ 619enum { 620 NILFS_SEGMENT_USAGE_ACTIVE, 621 NILFS_SEGMENT_USAGE_DIRTY, 622 NILFS_SEGMENT_USAGE_ERROR, 623 624 /* ... */ 625}; 626 627#define NILFS_SEGMENT_USAGE_FNS(flag, name) \ 628static inline void \ 629nilfs_segment_usage_set_##name(struct nilfs_segment_usage *su) \ 630{ \ 631 su->su_flags = cpu_to_le32(le32_to_cpu(su->su_flags) | \ 632 (1UL << NILFS_SEGMENT_USAGE_##flag));\ 633} \ 634static inline void \ 635nilfs_segment_usage_clear_##name(struct nilfs_segment_usage *su) \ 636{ \ 637 su->su_flags = \ 638 cpu_to_le32(le32_to_cpu(su->su_flags) & \ 639 ~(1UL << NILFS_SEGMENT_USAGE_##flag)); \ 640} \ 641static inline int \ 642nilfs_segment_usage_##name(const struct nilfs_segment_usage *su) \ 643{ \ 644 return !!(le32_to_cpu(su->su_flags) & \ 645 (1UL << NILFS_SEGMENT_USAGE_##flag)); \ 646} 647 648NILFS_SEGMENT_USAGE_FNS(ACTIVE, active) 649NILFS_SEGMENT_USAGE_FNS(DIRTY, dirty) 650NILFS_SEGMENT_USAGE_FNS(ERROR, error) 651 652static inline void 653nilfs_segment_usage_set_clean(struct nilfs_segment_usage *su) 654{ 655 su->su_lastmod = cpu_to_le64(0); 656 su->su_nblocks = cpu_to_le32(0); 657 su->su_flags = cpu_to_le32(0); 658} 659 660static inline int 661nilfs_segment_usage_clean(const struct nilfs_segment_usage *su) 662{ 663 return !le32_to_cpu(su->su_flags); 664} 665 666/** 667 * struct nilfs_sufile_header - segment usage file header 668 * @sh_ncleansegs: number of clean segments 669 * @sh_ndirtysegs: number of dirty segments 670 * @sh_last_alloc: last allocated segment number 671 */ 672struct nilfs_sufile_header { 673 __le64 sh_ncleansegs; 674 __le64 sh_ndirtysegs; 675 __le64 sh_last_alloc; 676 /* ... */ 677}; 678 679#define NILFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET \ 680 ((sizeof(struct nilfs_sufile_header) + \ 681 sizeof(struct nilfs_segment_usage) - 1) / \ 682 sizeof(struct nilfs_segment_usage)) 683 684/** 685 * nilfs_suinfo - segment usage information 686 * @sui_lastmod: timestamp of last modification 687 * @sui_nblocks: number of written blocks in segment 688 * @sui_flags: segment usage flags 689 */ 690struct nilfs_suinfo { 691 __u64 sui_lastmod; 692 __u32 sui_nblocks; 693 __u32 sui_flags; 694}; 695 696#define NILFS_SUINFO_FNS(flag, name) \ 697static inline int \ 698nilfs_suinfo_##name(const struct nilfs_suinfo *si) \ 699{ \ 700 return si->sui_flags & (1UL << NILFS_SEGMENT_USAGE_##flag); \ 701} 702 703NILFS_SUINFO_FNS(ACTIVE, active) 704NILFS_SUINFO_FNS(DIRTY, dirty) 705NILFS_SUINFO_FNS(ERROR, error) 706 707static inline int nilfs_suinfo_clean(const struct nilfs_suinfo *si) 708{ 709 return !si->sui_flags; 710} 711 712/* ioctl */ 713enum { 714 NILFS_CHECKPOINT, 715 NILFS_SNAPSHOT, 716}; 717 718/** 719 * struct nilfs_cpmode - change checkpoint mode structure 720 * @cm_cno: checkpoint number 721 * @cm_mode: mode of checkpoint 722 * @cm_pad: padding 723 */ 724struct nilfs_cpmode { 725 __u64 cm_cno; 726 __u32 cm_mode; 727 __u32 cm_pad; 728}; 729 730/** 731 * struct nilfs_argv - argument vector 732 * @v_base: pointer on data array from userspace 733 * @v_nmembs: number of members in data array 734 * @v_size: size of data array in bytes 735 * @v_flags: flags 736 * @v_index: start number of target data items 737 */ 738struct nilfs_argv { 739 __u64 v_base; 740 __u32 v_nmembs; /* number of members */ 741 __u16 v_size; /* size of members */ 742 __u16 v_flags; 743 __u64 v_index; 744}; 745 746/** 747 * struct nilfs_period - period of checkpoint numbers 748 * @p_start: start checkpoint number (inclusive) 749 * @p_end: end checkpoint number (exclusive) 750 */ 751struct nilfs_period { 752 __u64 p_start; 753 __u64 p_end; 754}; 755 756/** 757 * struct nilfs_cpstat - checkpoint statistics 758 * @cs_cno: checkpoint number 759 * @cs_ncps: number of checkpoints 760 * @cs_nsss: number of snapshots 761 */ 762struct nilfs_cpstat { 763 __u64 cs_cno; 764 __u64 cs_ncps; 765 __u64 cs_nsss; 766}; 767 768/** 769 * struct nilfs_sustat - segment usage statistics 770 * @ss_nsegs: number of segments 771 * @ss_ncleansegs: number of clean segments 772 * @ss_ndirtysegs: number of dirty segments 773 * @ss_ctime: creation time of the last segment 774 * @ss_nongc_ctime: creation time of the last segment not for GC 775 * @ss_prot_seq: least sequence number of segments which must not be reclaimed 776 */ 777struct nilfs_sustat { 778 __u64 ss_nsegs; 779 __u64 ss_ncleansegs; 780 __u64 ss_ndirtysegs; 781 __u64 ss_ctime; 782 __u64 ss_nongc_ctime; 783 __u64 ss_prot_seq; 784}; 785 786/** 787 * struct nilfs_vinfo - virtual block number information 788 * @vi_vblocknr: virtual block number 789 * @vi_start: start checkpoint number (inclusive) 790 * @vi_end: end checkpoint number (exclusive) 791 * @vi_blocknr: disk block number 792 */ 793struct nilfs_vinfo { 794 __u64 vi_vblocknr; 795 __u64 vi_start; 796 __u64 vi_end; 797 __u64 vi_blocknr; 798}; 799 800/** 801 * struct nilfs_vdesc - descriptor of virtual block number 802 * @vd_ino: inode number 803 * @vd_cno: checkpoint number 804 * @vd_vblocknr: virtual block number 805 * @vd_period: period of checkpoint numbers 806 * @vd_blocknr: disk block number 807 * @vd_offset: logical block offset inside a file 808 * @vd_flags: flags (data or node block) 809 * @vd_pad: padding 810 */ 811struct nilfs_vdesc { 812 __u64 vd_ino; 813 __u64 vd_cno; 814 __u64 vd_vblocknr; 815 struct nilfs_period vd_period; 816 __u64 vd_blocknr; 817 __u64 vd_offset; 818 __u32 vd_flags; 819 __u32 vd_pad; 820}; 821 822/** 823 * struct nilfs_bdesc - descriptor of disk block number 824 * @bd_ino: inode number 825 * @bd_oblocknr: disk block address (for skipping dead blocks) 826 * @bd_blocknr: disk block address 827 * @bd_offset: logical block offset inside a file 828 * @bd_level: level in the b-tree organization 829 * @bd_pad: padding 830 */ 831struct nilfs_bdesc { 832 __u64 bd_ino; 833 __u64 bd_oblocknr; 834 __u64 bd_blocknr; 835 __u64 bd_offset; 836 __u32 bd_level; 837 __u32 bd_pad; 838}; 839 840#define NILFS_IOCTL_IDENT 'n' 841 842#define NILFS_IOCTL_CHANGE_CPMODE \ 843 _IOW(NILFS_IOCTL_IDENT, 0x80, struct nilfs_cpmode) 844#define NILFS_IOCTL_DELETE_CHECKPOINT \ 845 _IOW(NILFS_IOCTL_IDENT, 0x81, __u64) 846#define NILFS_IOCTL_GET_CPINFO \ 847 _IOR(NILFS_IOCTL_IDENT, 0x82, struct nilfs_argv) 848#define NILFS_IOCTL_GET_CPSTAT \ 849 _IOR(NILFS_IOCTL_IDENT, 0x83, struct nilfs_cpstat) 850#define NILFS_IOCTL_GET_SUINFO \ 851 _IOR(NILFS_IOCTL_IDENT, 0x84, struct nilfs_argv) 852#define NILFS_IOCTL_GET_SUSTAT \ 853 _IOR(NILFS_IOCTL_IDENT, 0x85, struct nilfs_sustat) 854#define NILFS_IOCTL_GET_VINFO \ 855 _IOWR(NILFS_IOCTL_IDENT, 0x86, struct nilfs_argv) 856#define NILFS_IOCTL_GET_BDESCS \ 857 _IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv) 858#define NILFS_IOCTL_CLEAN_SEGMENTS \ 859 _IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv[5]) 860#define NILFS_IOCTL_SYNC \ 861 _IOR(NILFS_IOCTL_IDENT, 0x8A, __u64) 862#define NILFS_IOCTL_RESIZE \ 863 _IOW(NILFS_IOCTL_IDENT, 0x8B, __u64) 864#define NILFS_IOCTL_SET_ALLOC_RANGE \ 865 _IOW(NILFS_IOCTL_IDENT, 0x8C, __u64[2]) 866 867#endif /* _LINUX_NILFS_FS_H */