nilfs2_fs.h 22 KB

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