linux/include/linux/nilfs2_fs.h
<<
>>
Prefs
   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 */
 868