blob: 5988dd57ba666ea71eb31910d2739ac235142bec [file] [log] [blame]
Koji Satoeed10e32009-04-06 19:01:21 -07001/*
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
Ryusuke Konishic486f382010-10-03 17:44:03 +09007 * 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
Koji Satoeed10e32009-04-06 19:01:21 -07009 * (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
Ryusuke Konishic486f382010-10-03 17:44:03 +090014 * GNU Lesser General Public License for more details.
Koji Satoeed10e32009-04-06 19:01:21 -070015 *
Ryusuke Konishi4b420ab2016-05-23 16:23:09 -070016 * Written by Koji Sato and Ryusuke Konishi.
Koji Satoeed10e32009-04-06 19:01:21 -070017 */
18/*
19 * linux/include/linux/ext2_fs.h
20 *
21 * Copyright (C) 1992, 1993, 1994, 1995
22 * Remy Card (card@masi.ibp.fr)
23 * Laboratoire MASI - Institut Blaise Pascal
24 * Universite Pierre et Marie Curie (Paris VI)
25 *
26 * from
27 *
28 * linux/include/linux/minix_fs.h
29 *
30 * Copyright (C) 1991, 1992 Linus Torvalds
31 */
32
33#ifndef _LINUX_NILFS_FS_H
34#define _LINUX_NILFS_FS_H
35
36#include <linux/types.h>
37#include <linux/ioctl.h>
Jiro SEKIBA4d3cf1b2011-03-10 16:54:15 +090038#include <linux/magic.h>
Paul Gortmaker187f1882011-11-23 20:12:59 -050039#include <linux/bug.h>
Koji Satoeed10e32009-04-06 19:01:21 -070040
Koji Satoeed10e32009-04-06 19:01:21 -070041
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
Ryusuke Konishi61239232009-04-06 19:02:00 -070047 * @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)
Koji Satoeed10e32009-04-06 19:01:21 -070051 * @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 */
61struct nilfs_inode {
62 __le64 i_blocks;
63 __le64 i_size;
64 __le64 i_ctime;
65 __le64 i_mtime;
Ryusuke Konishi61239232009-04-06 19:02:00 -070066 __le32 i_ctime_nsec;
67 __le32 i_mtime_nsec;
Koji Satoeed10e32009-04-06 19:01:21 -070068 __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
Ryusuke Konishi0ec060d2014-04-03 14:50:31 -070080#define NILFS_MIN_INODE_SIZE 128
81
Koji Satoeed10e32009-04-06 19:01:21 -070082/**
83 * struct nilfs_super_root - structure of super root
84 * @sr_sum: check sum
85 * @sr_bytes: byte count of the structure
86 * @sr_flags: flags (reserved)
87 * @sr_nongc_ctime: write time of the last segment not for cleaner operation
88 * @sr_dat: DAT file inode
89 * @sr_cpfile: checkpoint file inode
90 * @sr_sufile: segment usage file inode
91 */
92struct nilfs_super_root {
93 __le32 sr_sum;
94 __le16 sr_bytes;
95 __le16 sr_flags;
96 __le64 sr_nongc_ctime;
97 struct nilfs_inode sr_dat;
98 struct nilfs_inode sr_cpfile;
99 struct nilfs_inode sr_sufile;
100};
101
102#define NILFS_SR_MDT_OFFSET(inode_size, i) \
103 ((unsigned long)&((struct nilfs_super_root *)0)->sr_dat + \
104 (inode_size) * (i))
105#define NILFS_SR_DAT_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 0)
106#define NILFS_SR_CPFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 1)
107#define NILFS_SR_SUFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 2)
Ryusuke Konishi6c6de1a2011-04-30 18:56:12 +0900108#define NILFS_SR_BYTES(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 3)
Koji Satoeed10e32009-04-06 19:01:21 -0700109
110/*
111 * Maximal mount counts
112 */
113#define NILFS_DFL_MAX_MNT_COUNT 50 /* 50 mounts */
114
115/*
116 * File system states (sbp->s_state, nilfs->ns_mount_state)
117 */
118#define NILFS_VALID_FS 0x0001 /* Unmounted cleanly */
119#define NILFS_ERROR_FS 0x0002 /* Errors detected */
120#define NILFS_RESIZE_FS 0x0004 /* Resize required */
121
122/*
123 * Mount flags (sbi->s_mount_opt)
124 */
125#define NILFS_MOUNT_ERROR_MODE 0x0070 /* Error mode mask */
126#define NILFS_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */
127#define NILFS_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */
128#define NILFS_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */
Koji Satoeed10e32009-04-06 19:01:21 -0700129#define NILFS_MOUNT_BARRIER 0x1000 /* Use block barriers */
Ryusuke Konishi076a3782016-05-23 16:23:48 -0700130#define NILFS_MOUNT_STRICT_ORDER 0x2000 /*
131 * Apply strict in-order
132 * semantics also for data
133 */
134#define NILFS_MOUNT_NORECOVERY 0x4000 /*
135 * Disable write access during
136 * mount-time recovery
137 */
Jiro SEKIBAe902ec92010-01-30 18:06:35 +0900138#define NILFS_MOUNT_DISCARD 0x8000 /* Issue DISCARD requests */
Koji Satoeed10e32009-04-06 19:01:21 -0700139
140
141/**
142 * struct nilfs_super_block - structure of super block on disk
143 */
144struct nilfs_super_block {
Ryusuke Konishi2f1b7cd2010-07-22 03:22:18 +0900145/*00*/ __le32 s_rev_level; /* Revision level */
Koji Satoeed10e32009-04-06 19:01:21 -0700146 __le16 s_minor_rev_level; /* minor revision level */
147 __le16 s_magic; /* Magic signature */
148
Ryusuke Konishi076a3782016-05-23 16:23:48 -0700149 __le16 s_bytes; /*
150 * Bytes count of CRC calculation
151 * for this structure. s_reserved
152 * is excluded.
153 */
Koji Satoeed10e32009-04-06 19:01:21 -0700154 __le16 s_flags; /* flags */
155 __le32 s_crc_seed; /* Seed value of CRC calculation */
Ryusuke Konishi2f1b7cd2010-07-22 03:22:18 +0900156/*10*/ __le32 s_sum; /* Check sum of super block */
Koji Satoeed10e32009-04-06 19:01:21 -0700157
Ryusuke Konishi076a3782016-05-23 16:23:48 -0700158 __le32 s_log_block_size; /*
159 * Block size represented as follows
160 * blocksize =
161 * 1 << (s_log_block_size + 10)
162 */
Koji Satoeed10e32009-04-06 19:01:21 -0700163 __le64 s_nsegments; /* Number of segments in filesystem */
Ryusuke Konishi2f1b7cd2010-07-22 03:22:18 +0900164/*20*/ __le64 s_dev_size; /* block device size in bytes */
Koji Satoeed10e32009-04-06 19:01:21 -0700165 __le64 s_first_data_block; /* 1st seg disk block number */
Ryusuke Konishi2f1b7cd2010-07-22 03:22:18 +0900166/*30*/ __le32 s_blocks_per_segment; /* number of blocks per full segment */
Koji Satoeed10e32009-04-06 19:01:21 -0700167 __le32 s_r_segments_percentage; /* Reserved segments percentage */
168
169 __le64 s_last_cno; /* Last checkpoint number */
Ryusuke Konishi2f1b7cd2010-07-22 03:22:18 +0900170/*40*/ __le64 s_last_pseg; /* disk block addr pseg written last */
Koji Satoeed10e32009-04-06 19:01:21 -0700171 __le64 s_last_seq; /* seq. number of seg written last */
Ryusuke Konishi2f1b7cd2010-07-22 03:22:18 +0900172/*50*/ __le64 s_free_blocks_count; /* Free blocks count */
Koji Satoeed10e32009-04-06 19:01:21 -0700173
Ryusuke Konishi076a3782016-05-23 16:23:48 -0700174 __le64 s_ctime; /*
175 * Creation time (execution time of
176 * newfs)
177 */
Ryusuke Konishi2f1b7cd2010-07-22 03:22:18 +0900178/*60*/ __le64 s_mtime; /* Mount time */
Koji Satoeed10e32009-04-06 19:01:21 -0700179 __le64 s_wtime; /* Write time */
Ryusuke Konishi2f1b7cd2010-07-22 03:22:18 +0900180/*70*/ __le16 s_mnt_count; /* Mount count */
Koji Satoeed10e32009-04-06 19:01:21 -0700181 __le16 s_max_mnt_count; /* Maximal mount count */
182 __le16 s_state; /* File system state */
183 __le16 s_errors; /* Behaviour when detecting errors */
184 __le64 s_lastcheck; /* time of last check */
185
Ryusuke Konishi2f1b7cd2010-07-22 03:22:18 +0900186/*80*/ __le32 s_checkinterval; /* max. time between checks */
Koji Satoeed10e32009-04-06 19:01:21 -0700187 __le32 s_creator_os; /* OS */
188 __le16 s_def_resuid; /* Default uid for reserved blocks */
189 __le16 s_def_resgid; /* Default gid for reserved blocks */
Ryusuke Konishi0d9cc232010-04-26 01:17:48 +0900190 __le32 s_first_ino; /* First non-reserved inode */
Koji Satoeed10e32009-04-06 19:01:21 -0700191
Ryusuke Konishi2f1b7cd2010-07-22 03:22:18 +0900192/*90*/ __le16 s_inode_size; /* Size of an inode */
Koji Satoeed10e32009-04-06 19:01:21 -0700193 __le16 s_dat_entry_size; /* Size of a dat entry */
194 __le16 s_checkpoint_size; /* Size of a checkpoint */
195 __le16 s_segment_usage_size; /* Size of a segment usage */
196
Ryusuke Konishi2f1b7cd2010-07-22 03:22:18 +0900197/*98*/ __u8 s_uuid[16]; /* 128-bit uuid for volume */
198/*A8*/ char s_volume_name[80]; /* volume name */
Koji Satoeed10e32009-04-06 19:01:21 -0700199
Ryusuke Konishi2f1b7cd2010-07-22 03:22:18 +0900200/*F8*/ __le32 s_c_interval; /* Commit interval of segment */
Ryusuke Konishi076a3782016-05-23 16:23:48 -0700201 __le32 s_c_block_max; /*
202 * Threshold of data amount for
203 * the segment construction
204 */
Ryusuke Konishi1a80a172010-07-22 03:22:19 +0900205/*100*/ __le64 s_feature_compat; /* Compatible feature set */
206 __le64 s_feature_compat_ro; /* Read-only compatible feature set */
207 __le64 s_feature_incompat; /* Incompatible feature set */
208 __u32 s_reserved[186]; /* padding to the end of the block */
Koji Satoeed10e32009-04-06 19:01:21 -0700209};
210
211/*
212 * Codes for operating systems
213 */
214#define NILFS_OS_LINUX 0
215/* Codes from 1 to 4 are reserved to keep compatibility with ext2 creator-OS */
216
217/*
218 * Revision levels
219 */
220#define NILFS_CURRENT_REV 2 /* current major revision */
221#define NILFS_MINOR_REV 0 /* minor revision */
Ryusuke Konishi9566a7a2010-08-10 00:58:41 +0900222#define NILFS_MIN_SUPP_REV 2 /* minimum supported revision */
Koji Satoeed10e32009-04-06 19:01:21 -0700223
224/*
Ryusuke Konishi1a80a172010-07-22 03:22:19 +0900225 * Feature set definitions
226 *
227 * If there is a bit set in the incompatible feature set that the kernel
228 * doesn't know about, it should refuse to mount the filesystem.
229 */
Ryusuke Konishibe667372011-03-05 00:19:32 +0900230#define NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT 0x00000001ULL
231
Ryusuke Konishi1a80a172010-07-22 03:22:19 +0900232#define NILFS_FEATURE_COMPAT_SUPP 0ULL
Ryusuke Konishibe667372011-03-05 00:19:32 +0900233#define NILFS_FEATURE_COMPAT_RO_SUPP NILFS_FEATURE_COMPAT_RO_BLOCK_COUNT
Ryusuke Konishi1a80a172010-07-22 03:22:19 +0900234#define NILFS_FEATURE_INCOMPAT_SUPP 0ULL
235
236/*
Koji Satoeed10e32009-04-06 19:01:21 -0700237 * Bytes count of super_block for CRC-calculation
238 */
239#define NILFS_SB_BYTES \
240 ((long)&((struct nilfs_super_block *)0)->s_reserved)
241
242/*
243 * Special inode number
244 */
245#define NILFS_ROOT_INO 2 /* Root file inode */
246#define NILFS_DAT_INO 3 /* DAT file */
247#define NILFS_CPFILE_INO 4 /* checkpoint file */
248#define NILFS_SUFILE_INO 5 /* segment usage file */
249#define NILFS_IFILE_INO 6 /* ifile */
250#define NILFS_ATIME_INO 7 /* Atime file (reserved) */
251#define NILFS_XATTR_INO 8 /* Xattribute file (reserved) */
252#define NILFS_SKETCH_INO 10 /* Sketch file */
253#define NILFS_USER_INO 11 /* Fisrt user's file inode number */
254
255#define NILFS_SB_OFFSET_BYTES 1024 /* byte offset of nilfs superblock */
Koji Satoeed10e32009-04-06 19:01:21 -0700256
Ryusuke Konishi076a3782016-05-23 16:23:48 -0700257#define NILFS_SEG_MIN_BLOCKS 16 /*
258 * Minimum number of blocks in
259 * a full segment
260 */
261#define NILFS_PSEG_MIN_BLOCKS 2 /*
262 * Minimum number of blocks in
263 * a partial segment
264 */
265#define NILFS_MIN_NRSVSEGS 8 /*
266 * Minimum number of reserved
267 * segments
268 */
Koji Satoeed10e32009-04-06 19:01:21 -0700269
Ryusuke Konishie339ad32009-04-06 19:01:59 -0700270/*
Ryusuke Konishi6c43f412010-08-20 20:10:38 +0900271 * We call DAT, cpfile, and sufile root metadata files. Inodes of
272 * these files are written in super root block instead of ifile, and
273 * garbage collector doesn't keep any past versions of these files.
274 */
275#define NILFS_ROOT_METADATA_FILE(ino) \
276 ((ino) >= NILFS_DAT_INO && (ino) <= NILFS_SUFILE_INO)
277
278/*
Ryusuke Konishie339ad32009-04-06 19:01:59 -0700279 * bytes offset of secondary super block
280 */
281#define NILFS_SB2_OFFSET_BYTES(devsize) ((((devsize) >> 12) - 1) << 12)
Koji Satoeed10e32009-04-06 19:01:21 -0700282
283/*
284 * Maximal count of links to a file
285 */
286#define NILFS_LINK_MAX 32000
287
288/*
289 * Structure of a directory entry
290 * (Same as ext2)
291 */
292
293#define NILFS_NAME_LEN 255
294
295/*
Ryusuke Konishi89c0fd02010-07-25 22:44:53 +0900296 * Block size limitations
297 */
298#define NILFS_MIN_BLOCK_SIZE 1024
299#define NILFS_MAX_BLOCK_SIZE 65536
300
301/*
Koji Satoeed10e32009-04-06 19:01:21 -0700302 * The new version of the directory entry. Since V0 structures are
303 * stored in intel byte order, and the name_len field could never be
304 * bigger than 255 chars, it's safe to reclaim the extra byte for the
305 * file_type field.
306 */
307struct nilfs_dir_entry {
308 __le64 inode; /* Inode number */
309 __le16 rec_len; /* Directory entry length */
310 __u8 name_len; /* Name length */
Vyacheslav Dubeyko8c74ac02012-07-30 14:42:09 -0700311 __u8 file_type; /* Dir entry type (file, dir, etc) */
Koji Satoeed10e32009-04-06 19:01:21 -0700312 char name[NILFS_NAME_LEN]; /* File name */
313 char pad;
314};
315
316/*
317 * NILFS directory file types. Only the low 3 bits are used. The
318 * other bits are reserved for now.
319 */
320enum {
321 NILFS_FT_UNKNOWN,
322 NILFS_FT_REG_FILE,
323 NILFS_FT_DIR,
324 NILFS_FT_CHRDEV,
325 NILFS_FT_BLKDEV,
326 NILFS_FT_FIFO,
327 NILFS_FT_SOCK,
328 NILFS_FT_SYMLINK,
329 NILFS_FT_MAX
330};
331
332/*
333 * NILFS_DIR_PAD defines the directory entries boundaries
334 *
335 * NOTE: It must be a multiple of 8
336 */
337#define NILFS_DIR_PAD 8
338#define NILFS_DIR_ROUND (NILFS_DIR_PAD - 1)
339#define NILFS_DIR_REC_LEN(name_len) (((name_len) + 12 + NILFS_DIR_ROUND) & \
340 ~NILFS_DIR_ROUND)
Ryusuke Konishi6cda9fa2010-07-25 20:39:03 +0900341#define NILFS_MAX_REC_LEN ((1<<16)-1)
Koji Satoeed10e32009-04-06 19:01:21 -0700342
Ryusuke Konishi0c6c44c2016-05-23 16:23:39 -0700343static inline unsigned int nilfs_rec_len_from_disk(__le16 dlen)
Ryusuke Konishi6cda9fa2010-07-25 20:39:03 +0900344{
Ryusuke Konishi0c6c44c2016-05-23 16:23:39 -0700345 unsigned int len = le16_to_cpu(dlen);
Ryusuke Konishi6cda9fa2010-07-25 20:39:03 +0900346
Kirill A. Shutemovea1754a2016-04-01 15:29:48 +0300347#if !defined(__KERNEL__) || (PAGE_SIZE >= 65536)
Ryusuke Konishi6cda9fa2010-07-25 20:39:03 +0900348 if (len == NILFS_MAX_REC_LEN)
349 return 1 << 16;
Ryusuke Konishiae191832011-02-04 01:19:38 +0900350#endif
Ryusuke Konishi6cda9fa2010-07-25 20:39:03 +0900351 return len;
352}
353
Ryusuke Konishi0c6c44c2016-05-23 16:23:39 -0700354static inline __le16 nilfs_rec_len_to_disk(unsigned int len)
Ryusuke Konishi6cda9fa2010-07-25 20:39:03 +0900355{
Kirill A. Shutemovea1754a2016-04-01 15:29:48 +0300356#if !defined(__KERNEL__) || (PAGE_SIZE >= 65536)
Ryusuke Konishi6cda9fa2010-07-25 20:39:03 +0900357 if (len == (1 << 16))
358 return cpu_to_le16(NILFS_MAX_REC_LEN);
359 else if (len > (1 << 16))
360 BUG();
Ryusuke Konishiae191832011-02-04 01:19:38 +0900361#endif
Ryusuke Konishi6cda9fa2010-07-25 20:39:03 +0900362 return cpu_to_le16(len);
363}
Koji Satoeed10e32009-04-06 19:01:21 -0700364
365/**
366 * struct nilfs_finfo - file information
367 * @fi_ino: inode number
368 * @fi_cno: checkpoint number
369 * @fi_nblocks: number of blocks (including intermediate blocks)
370 * @fi_ndatablk: number of file data blocks
371 */
372struct nilfs_finfo {
373 __le64 fi_ino;
374 __le64 fi_cno;
375 __le32 fi_nblocks;
376 __le32 fi_ndatablk;
377 /* array of virtual block numbers */
378};
379
380/**
381 * struct nilfs_binfo_v - information for the block to which a virtual block number is assigned
382 * @bi_vblocknr: virtual block number
383 * @bi_blkoff: block offset
384 */
385struct nilfs_binfo_v {
386 __le64 bi_vblocknr;
387 __le64 bi_blkoff;
388};
389
390/**
391 * struct nilfs_binfo_dat - information for the block which belongs to the DAT file
392 * @bi_blkoff: block offset
393 * @bi_level: level
394 * @bi_pad: padding
395 */
396struct nilfs_binfo_dat {
397 __le64 bi_blkoff;
398 __u8 bi_level;
399 __u8 bi_pad[7];
400};
401
402/**
403 * union nilfs_binfo: block information
404 * @bi_v: nilfs_binfo_v structure
405 * @bi_dat: nilfs_binfo_dat structure
406 */
407union nilfs_binfo {
408 struct nilfs_binfo_v bi_v;
409 struct nilfs_binfo_dat bi_dat;
410};
411
412/**
Vyacheslav Dubeyko8c74ac02012-07-30 14:42:09 -0700413 * struct nilfs_segment_summary - segment summary header
Koji Satoeed10e32009-04-06 19:01:21 -0700414 * @ss_datasum: checksum of data
415 * @ss_sumsum: checksum of segment summary
416 * @ss_magic: magic number
417 * @ss_bytes: size of this structure in bytes
418 * @ss_flags: flags
419 * @ss_seq: sequence number
420 * @ss_create: creation timestamp
421 * @ss_next: next segment
422 * @ss_nblocks: number of blocks
423 * @ss_nfinfo: number of finfo structures
424 * @ss_sumbytes: total size of segment summary in bytes
425 * @ss_pad: padding
Ryusuke Konishi50614bc2010-04-10 17:59:15 +0900426 * @ss_cno: checkpoint number
Koji Satoeed10e32009-04-06 19:01:21 -0700427 */
428struct nilfs_segment_summary {
429 __le32 ss_datasum;
430 __le32 ss_sumsum;
431 __le32 ss_magic;
432 __le16 ss_bytes;
433 __le16 ss_flags;
434 __le64 ss_seq;
435 __le64 ss_create;
436 __le64 ss_next;
437 __le32 ss_nblocks;
438 __le32 ss_nfinfo;
439 __le32 ss_sumbytes;
440 __le32 ss_pad;
Ryusuke Konishi50614bc2010-04-10 17:59:15 +0900441 __le64 ss_cno;
Koji Satoeed10e32009-04-06 19:01:21 -0700442 /* array of finfo structures */
443};
444
445#define NILFS_SEGSUM_MAGIC 0x1eaffa11 /* segment summary magic number */
446
447/*
448 * Segment summary flags
449 */
450#define NILFS_SS_LOGBGN 0x0001 /* begins a logical segment */
451#define NILFS_SS_LOGEND 0x0002 /* ends a logical segment */
452#define NILFS_SS_SR 0x0004 /* has super root */
453#define NILFS_SS_SYNDT 0x0008 /* includes data only updates */
454#define NILFS_SS_GC 0x0010 /* segment written for cleaner operation */
455
456/**
Jiro SEKIBA6600b9d2009-11-09 19:10:11 +0900457 * struct nilfs_btree_node - B-tree node
458 * @bn_flags: flags
459 * @bn_level: level
460 * @bn_nchildren: number of children
461 * @bn_pad: padding
462 */
463struct nilfs_btree_node {
464 __u8 bn_flags;
465 __u8 bn_level;
466 __le16 bn_nchildren;
467 __le32 bn_pad;
468};
469
470/* flags */
471#define NILFS_BTREE_NODE_ROOT 0x01
472
473/* level */
474#define NILFS_BTREE_LEVEL_DATA 0
475#define NILFS_BTREE_LEVEL_NODE_MIN (NILFS_BTREE_LEVEL_DATA + 1)
Ryusuke Konishid8fd1502015-05-05 16:24:00 -0700476#define NILFS_BTREE_LEVEL_MAX 14 /* Max level (exclusive) */
Jiro SEKIBA6600b9d2009-11-09 19:10:11 +0900477
478/**
Koji Satoeed10e32009-04-06 19:01:21 -0700479 * struct nilfs_palloc_group_desc - block group descriptor
480 * @pg_nfrees: number of free entries in block group
481 */
482struct nilfs_palloc_group_desc {
483 __le32 pg_nfrees;
484};
485
486/**
487 * struct nilfs_dat_entry - disk address translation entry
Qinghuang Feng37e11f32010-04-25 20:17:25 +0800488 * @de_blocknr: block number
489 * @de_start: start checkpoint number
490 * @de_end: end checkpoint number
491 * @de_rsv: reserved for future use
Koji Satoeed10e32009-04-06 19:01:21 -0700492 */
493struct nilfs_dat_entry {
494 __le64 de_blocknr;
495 __le64 de_start;
496 __le64 de_end;
497 __le64 de_rsv;
498};
499
Ryusuke Konishi0ec060d2014-04-03 14:50:31 -0700500#define NILFS_MIN_DAT_ENTRY_SIZE 32
501
Koji Satoeed10e32009-04-06 19:01:21 -0700502/**
Koji Satoeed10e32009-04-06 19:01:21 -0700503 * struct nilfs_snapshot_list - snapshot list
504 * @ssl_next: next checkpoint number on snapshot list
505 * @ssl_prev: previous checkpoint number on snapshot list
506 */
507struct nilfs_snapshot_list {
508 __le64 ssl_next;
509 __le64 ssl_prev;
510};
511
512/**
513 * struct nilfs_checkpoint - checkpoint structure
514 * @cp_flags: flags
515 * @cp_checkpoints_count: checkpoints count in a block
516 * @cp_snapshot_list: snapshot list
517 * @cp_cno: checkpoint number
518 * @cp_create: creation timestamp
519 * @cp_nblk_inc: number of blocks incremented by this checkpoint
520 * @cp_inodes_count: inodes count
521 * @cp_blocks_count: blocks count
522 * @cp_ifile_inode: inode of ifile
523 */
524struct nilfs_checkpoint {
525 __le32 cp_flags;
526 __le32 cp_checkpoints_count;
527 struct nilfs_snapshot_list cp_snapshot_list;
528 __le64 cp_cno;
529 __le64 cp_create;
530 __le64 cp_nblk_inc;
531 __le64 cp_inodes_count;
Ryusuke Konishibe667372011-03-05 00:19:32 +0900532 __le64 cp_blocks_count;
Koji Satoeed10e32009-04-06 19:01:21 -0700533
Ryusuke Konishi076a3782016-05-23 16:23:48 -0700534 /*
535 * Do not change the byte offset of ifile inode.
536 * To keep the compatibility of the disk format,
537 * additional fields should be added behind cp_ifile_inode.
538 */
Koji Satoeed10e32009-04-06 19:01:21 -0700539 struct nilfs_inode cp_ifile_inode;
540};
541
Ryusuke Konishi0ec060d2014-04-03 14:50:31 -0700542#define NILFS_MIN_CHECKPOINT_SIZE (64 + NILFS_MIN_INODE_SIZE)
543
Koji Satoeed10e32009-04-06 19:01:21 -0700544/* checkpoint flags */
545enum {
546 NILFS_CHECKPOINT_SNAPSHOT,
547 NILFS_CHECKPOINT_INVALID,
548 NILFS_CHECKPOINT_SKETCH,
Ryusuke Konishic96fa462009-04-06 19:01:57 -0700549 NILFS_CHECKPOINT_MINOR,
Koji Satoeed10e32009-04-06 19:01:21 -0700550};
551
552#define NILFS_CHECKPOINT_FNS(flag, name) \
553static inline void \
554nilfs_checkpoint_set_##name(struct nilfs_checkpoint *cp) \
555{ \
556 cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) | \
557 (1UL << NILFS_CHECKPOINT_##flag)); \
558} \
559static inline void \
560nilfs_checkpoint_clear_##name(struct nilfs_checkpoint *cp) \
561{ \
562 cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) & \
563 ~(1UL << NILFS_CHECKPOINT_##flag)); \
564} \
565static inline int \
566nilfs_checkpoint_##name(const struct nilfs_checkpoint *cp) \
567{ \
568 return !!(le32_to_cpu(cp->cp_flags) & \
569 (1UL << NILFS_CHECKPOINT_##flag)); \
570}
571
572NILFS_CHECKPOINT_FNS(SNAPSHOT, snapshot)
573NILFS_CHECKPOINT_FNS(INVALID, invalid)
Ryusuke Konishic96fa462009-04-06 19:01:57 -0700574NILFS_CHECKPOINT_FNS(MINOR, minor)
Koji Satoeed10e32009-04-06 19:01:21 -0700575
576/**
577 * struct nilfs_cpinfo - checkpoint information
578 * @ci_flags: flags
Ryusuke Konishidc498d02009-04-06 19:01:52 -0700579 * @ci_pad: padding
Koji Satoeed10e32009-04-06 19:01:21 -0700580 * @ci_cno: checkpoint number
581 * @ci_create: creation timestamp
582 * @ci_nblk_inc: number of blocks incremented by this checkpoint
583 * @ci_inodes_count: inodes count
584 * @ci_blocks_count: blocks count
585 * @ci_next: next checkpoint number in snapshot list
586 */
587struct nilfs_cpinfo {
588 __u32 ci_flags;
Ryusuke Konishidc498d02009-04-06 19:01:52 -0700589 __u32 ci_pad;
Koji Satoeed10e32009-04-06 19:01:21 -0700590 __u64 ci_cno;
591 __u64 ci_create;
592 __u64 ci_nblk_inc;
593 __u64 ci_inodes_count;
594 __u64 ci_blocks_count;
595 __u64 ci_next;
596};
597
598#define NILFS_CPINFO_FNS(flag, name) \
599static inline int \
600nilfs_cpinfo_##name(const struct nilfs_cpinfo *cpinfo) \
601{ \
602 return !!(cpinfo->ci_flags & (1UL << NILFS_CHECKPOINT_##flag)); \
603}
604
605NILFS_CPINFO_FNS(SNAPSHOT, snapshot)
606NILFS_CPINFO_FNS(INVALID, invalid)
Ryusuke Konishic96fa462009-04-06 19:01:57 -0700607NILFS_CPINFO_FNS(MINOR, minor)
Koji Satoeed10e32009-04-06 19:01:21 -0700608
609
610/**
611 * struct nilfs_cpfile_header - checkpoint file header
612 * @ch_ncheckpoints: number of checkpoints
613 * @ch_nsnapshots: number of snapshots
614 * @ch_snapshot_list: snapshot list
615 */
616struct nilfs_cpfile_header {
617 __le64 ch_ncheckpoints;
618 __le64 ch_nsnapshots;
619 struct nilfs_snapshot_list ch_snapshot_list;
620};
621
622#define NILFS_CPFILE_FIRST_CHECKPOINT_OFFSET \
623 ((sizeof(struct nilfs_cpfile_header) + \
624 sizeof(struct nilfs_checkpoint) - 1) / \
625 sizeof(struct nilfs_checkpoint))
626
627/**
628 * struct nilfs_segment_usage - segment usage
629 * @su_lastmod: last modified timestamp
630 * @su_nblocks: number of blocks in segment
631 * @su_flags: flags
632 */
633struct nilfs_segment_usage {
634 __le64 su_lastmod;
635 __le32 su_nblocks;
636 __le32 su_flags;
637};
638
Ryusuke Konishi0ec060d2014-04-03 14:50:31 -0700639#define NILFS_MIN_SEGMENT_USAGE_SIZE 16
640
Koji Satoeed10e32009-04-06 19:01:21 -0700641/* segment usage flag */
642enum {
643 NILFS_SEGMENT_USAGE_ACTIVE,
644 NILFS_SEGMENT_USAGE_DIRTY,
645 NILFS_SEGMENT_USAGE_ERROR,
646
Koji Satoeed10e32009-04-06 19:01:21 -0700647 /* ... */
648};
649
650#define NILFS_SEGMENT_USAGE_FNS(flag, name) \
651static inline void \
652nilfs_segment_usage_set_##name(struct nilfs_segment_usage *su) \
653{ \
654 su->su_flags = cpu_to_le32(le32_to_cpu(su->su_flags) | \
655 (1UL << NILFS_SEGMENT_USAGE_##flag));\
656} \
657static inline void \
658nilfs_segment_usage_clear_##name(struct nilfs_segment_usage *su) \
659{ \
660 su->su_flags = \
661 cpu_to_le32(le32_to_cpu(su->su_flags) & \
662 ~(1UL << NILFS_SEGMENT_USAGE_##flag)); \
663} \
664static inline int \
665nilfs_segment_usage_##name(const struct nilfs_segment_usage *su) \
666{ \
667 return !!(le32_to_cpu(su->su_flags) & \
668 (1UL << NILFS_SEGMENT_USAGE_##flag)); \
669}
670
671NILFS_SEGMENT_USAGE_FNS(ACTIVE, active)
672NILFS_SEGMENT_USAGE_FNS(DIRTY, dirty)
673NILFS_SEGMENT_USAGE_FNS(ERROR, error)
Koji Satoeed10e32009-04-06 19:01:21 -0700674
675static inline void
676nilfs_segment_usage_set_clean(struct nilfs_segment_usage *su)
677{
678 su->su_lastmod = cpu_to_le64(0);
679 su->su_nblocks = cpu_to_le32(0);
680 su->su_flags = cpu_to_le32(0);
681}
682
683static inline int
684nilfs_segment_usage_clean(const struct nilfs_segment_usage *su)
685{
686 return !le32_to_cpu(su->su_flags);
687}
688
689/**
690 * struct nilfs_sufile_header - segment usage file header
691 * @sh_ncleansegs: number of clean segments
692 * @sh_ndirtysegs: number of dirty segments
693 * @sh_last_alloc: last allocated segment number
694 */
695struct nilfs_sufile_header {
696 __le64 sh_ncleansegs;
697 __le64 sh_ndirtysegs;
698 __le64 sh_last_alloc;
699 /* ... */
700};
701
702#define NILFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET \
703 ((sizeof(struct nilfs_sufile_header) + \
704 sizeof(struct nilfs_segment_usage) - 1) / \
705 sizeof(struct nilfs_segment_usage))
706
707/**
708 * nilfs_suinfo - segment usage information
Vyacheslav Dubeyko8c74ac02012-07-30 14:42:09 -0700709 * @sui_lastmod: timestamp of last modification
710 * @sui_nblocks: number of written blocks in segment
711 * @sui_flags: segment usage flags
Koji Satoeed10e32009-04-06 19:01:21 -0700712 */
713struct nilfs_suinfo {
714 __u64 sui_lastmod;
715 __u32 sui_nblocks;
716 __u32 sui_flags;
717};
718
719#define NILFS_SUINFO_FNS(flag, name) \
720static inline int \
721nilfs_suinfo_##name(const struct nilfs_suinfo *si) \
722{ \
723 return si->sui_flags & (1UL << NILFS_SEGMENT_USAGE_##flag); \
724}
725
726NILFS_SUINFO_FNS(ACTIVE, active)
727NILFS_SUINFO_FNS(DIRTY, dirty)
728NILFS_SUINFO_FNS(ERROR, error)
Koji Satoeed10e32009-04-06 19:01:21 -0700729
730static inline int nilfs_suinfo_clean(const struct nilfs_suinfo *si)
731{
732 return !si->sui_flags;
733}
734
735/* ioctl */
Andreas Rohner90ccf7d2014-04-03 14:50:26 -0700736/**
737 * nilfs_suinfo_update - segment usage information update
738 * @sup_segnum: segment number
739 * @sup_flags: flags for which fields are active in sup_sui
740 * @sup_reserved: reserved necessary for alignment
741 * @sup_sui: segment usage information
742 */
743struct nilfs_suinfo_update {
744 __u64 sup_segnum;
745 __u32 sup_flags;
746 __u32 sup_reserved;
747 struct nilfs_suinfo sup_sui;
748};
749
750enum {
751 NILFS_SUINFO_UPDATE_LASTMOD,
752 NILFS_SUINFO_UPDATE_NBLOCKS,
753 NILFS_SUINFO_UPDATE_FLAGS,
754 __NR_NILFS_SUINFO_UPDATE_FIELDS,
755};
756
757#define NILFS_SUINFO_UPDATE_FNS(flag, name) \
758static inline void \
759nilfs_suinfo_update_set_##name(struct nilfs_suinfo_update *sup) \
760{ \
761 sup->sup_flags |= 1UL << NILFS_SUINFO_UPDATE_##flag; \
762} \
763static inline void \
764nilfs_suinfo_update_clear_##name(struct nilfs_suinfo_update *sup) \
765{ \
766 sup->sup_flags &= ~(1UL << NILFS_SUINFO_UPDATE_##flag); \
767} \
768static inline int \
769nilfs_suinfo_update_##name(const struct nilfs_suinfo_update *sup) \
770{ \
771 return !!(sup->sup_flags & (1UL << NILFS_SUINFO_UPDATE_##flag));\
772}
773
774NILFS_SUINFO_UPDATE_FNS(LASTMOD, lastmod)
775NILFS_SUINFO_UPDATE_FNS(NBLOCKS, nblocks)
776NILFS_SUINFO_UPDATE_FNS(FLAGS, flags)
777
Koji Satoeed10e32009-04-06 19:01:21 -0700778enum {
779 NILFS_CHECKPOINT,
780 NILFS_SNAPSHOT,
781};
782
783/**
Vyacheslav Dubeyko8c74ac02012-07-30 14:42:09 -0700784 * struct nilfs_cpmode - change checkpoint mode structure
785 * @cm_cno: checkpoint number
786 * @cm_mode: mode of checkpoint
787 * @cm_pad: padding
Koji Satoeed10e32009-04-06 19:01:21 -0700788 */
789struct nilfs_cpmode {
790 __u64 cm_cno;
Ryusuke Konishidc498d02009-04-06 19:01:52 -0700791 __u32 cm_mode;
792 __u32 cm_pad;
Koji Satoeed10e32009-04-06 19:01:21 -0700793};
794
795/**
796 * struct nilfs_argv - argument vector
Vyacheslav Dubeyko8c74ac02012-07-30 14:42:09 -0700797 * @v_base: pointer on data array from userspace
798 * @v_nmembs: number of members in data array
799 * @v_size: size of data array in bytes
800 * @v_flags: flags
801 * @v_index: start number of target data items
Koji Satoeed10e32009-04-06 19:01:21 -0700802 */
803struct nilfs_argv {
Ryusuke Konishidc498d02009-04-06 19:01:52 -0700804 __u64 v_base;
805 __u32 v_nmembs; /* number of members */
806 __u16 v_size; /* size of members */
807 __u16 v_flags;
808 __u64 v_index;
Koji Satoeed10e32009-04-06 19:01:21 -0700809};
810
811/**
Vyacheslav Dubeyko8c74ac02012-07-30 14:42:09 -0700812 * struct nilfs_period - period of checkpoint numbers
813 * @p_start: start checkpoint number (inclusive)
814 * @p_end: end checkpoint number (exclusive)
Koji Satoeed10e32009-04-06 19:01:21 -0700815 */
816struct nilfs_period {
817 __u64 p_start;
818 __u64 p_end;
819};
820
821/**
Vyacheslav Dubeyko8c74ac02012-07-30 14:42:09 -0700822 * struct nilfs_cpstat - checkpoint statistics
Koji Satoeed10e32009-04-06 19:01:21 -0700823 * @cs_cno: checkpoint number
824 * @cs_ncps: number of checkpoints
825 * @cs_nsss: number of snapshots
826 */
827struct nilfs_cpstat {
828 __u64 cs_cno;
829 __u64 cs_ncps;
830 __u64 cs_nsss;
831};
832
833/**
Vyacheslav Dubeyko8c74ac02012-07-30 14:42:09 -0700834 * struct nilfs_sustat - segment usage statistics
Koji Satoeed10e32009-04-06 19:01:21 -0700835 * @ss_nsegs: number of segments
836 * @ss_ncleansegs: number of clean segments
837 * @ss_ndirtysegs: number of dirty segments
Ryusuke Konishi2c2e52f2009-04-06 19:01:54 -0700838 * @ss_ctime: creation time of the last segment
839 * @ss_nongc_ctime: creation time of the last segment not for GC
840 * @ss_prot_seq: least sequence number of segments which must not be reclaimed
Koji Satoeed10e32009-04-06 19:01:21 -0700841 */
842struct nilfs_sustat {
843 __u64 ss_nsegs;
844 __u64 ss_ncleansegs;
845 __u64 ss_ndirtysegs;
Ryusuke Konishidc498d02009-04-06 19:01:52 -0700846 __u64 ss_ctime;
847 __u64 ss_nongc_ctime;
Ryusuke Konishi2c2e52f2009-04-06 19:01:54 -0700848 __u64 ss_prot_seq;
Koji Satoeed10e32009-04-06 19:01:21 -0700849};
850
851/**
852 * struct nilfs_vinfo - virtual block number information
Vyacheslav Dubeyko8c74ac02012-07-30 14:42:09 -0700853 * @vi_vblocknr: virtual block number
854 * @vi_start: start checkpoint number (inclusive)
855 * @vi_end: end checkpoint number (exclusive)
856 * @vi_blocknr: disk block number
Koji Satoeed10e32009-04-06 19:01:21 -0700857 */
858struct nilfs_vinfo {
859 __u64 vi_vblocknr;
860 __u64 vi_start;
861 __u64 vi_end;
862 __u64 vi_blocknr;
863};
864
865/**
Vyacheslav Dubeyko8c74ac02012-07-30 14:42:09 -0700866 * struct nilfs_vdesc - descriptor of virtual block number
867 * @vd_ino: inode number
868 * @vd_cno: checkpoint number
869 * @vd_vblocknr: virtual block number
870 * @vd_period: period of checkpoint numbers
871 * @vd_blocknr: disk block number
872 * @vd_offset: logical block offset inside a file
873 * @vd_flags: flags (data or node block)
874 * @vd_pad: padding
Koji Satoeed10e32009-04-06 19:01:21 -0700875 */
876struct nilfs_vdesc {
877 __u64 vd_ino;
878 __u64 vd_cno;
879 __u64 vd_vblocknr;
880 struct nilfs_period vd_period;
881 __u64 vd_blocknr;
882 __u64 vd_offset;
883 __u32 vd_flags;
Ryusuke Konishidc498d02009-04-06 19:01:52 -0700884 __u32 vd_pad;
Koji Satoeed10e32009-04-06 19:01:21 -0700885};
886
887/**
Vyacheslav Dubeyko8c74ac02012-07-30 14:42:09 -0700888 * struct nilfs_bdesc - descriptor of disk block number
889 * @bd_ino: inode number
890 * @bd_oblocknr: disk block address (for skipping dead blocks)
891 * @bd_blocknr: disk block address
892 * @bd_offset: logical block offset inside a file
893 * @bd_level: level in the b-tree organization
894 * @bd_pad: padding
Koji Satoeed10e32009-04-06 19:01:21 -0700895 */
896struct nilfs_bdesc {
897 __u64 bd_ino;
898 __u64 bd_oblocknr;
899 __u64 bd_blocknr;
900 __u64 bd_offset;
901 __u32 bd_level;
Ryusuke Konishidc498d02009-04-06 19:01:52 -0700902 __u32 bd_pad;
Koji Satoeed10e32009-04-06 19:01:21 -0700903};
904
Koji Satoeed10e32009-04-06 19:01:21 -0700905#define NILFS_IOCTL_IDENT 'n'
906
907#define NILFS_IOCTL_CHANGE_CPMODE \
908 _IOW(NILFS_IOCTL_IDENT, 0x80, struct nilfs_cpmode)
909#define NILFS_IOCTL_DELETE_CHECKPOINT \
910 _IOW(NILFS_IOCTL_IDENT, 0x81, __u64)
911#define NILFS_IOCTL_GET_CPINFO \
912 _IOR(NILFS_IOCTL_IDENT, 0x82, struct nilfs_argv)
913#define NILFS_IOCTL_GET_CPSTAT \
914 _IOR(NILFS_IOCTL_IDENT, 0x83, struct nilfs_cpstat)
915#define NILFS_IOCTL_GET_SUINFO \
916 _IOR(NILFS_IOCTL_IDENT, 0x84, struct nilfs_argv)
917#define NILFS_IOCTL_GET_SUSTAT \
918 _IOR(NILFS_IOCTL_IDENT, 0x85, struct nilfs_sustat)
919#define NILFS_IOCTL_GET_VINFO \
920 _IOWR(NILFS_IOCTL_IDENT, 0x86, struct nilfs_argv)
921#define NILFS_IOCTL_GET_BDESCS \
922 _IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv)
923#define NILFS_IOCTL_CLEAN_SEGMENTS \
924 _IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv[5])
Koji Satoeed10e32009-04-06 19:01:21 -0700925#define NILFS_IOCTL_SYNC \
926 _IOR(NILFS_IOCTL_IDENT, 0x8A, __u64)
927#define NILFS_IOCTL_RESIZE \
928 _IOW(NILFS_IOCTL_IDENT, 0x8B, __u64)
Ryusuke Konishi619205d2011-05-05 01:23:57 +0900929#define NILFS_IOCTL_SET_ALLOC_RANGE \
930 _IOW(NILFS_IOCTL_IDENT, 0x8C, __u64[2])
Andreas Rohner2cc88f32014-04-03 14:50:28 -0700931#define NILFS_IOCTL_SET_SUINFO \
932 _IOW(NILFS_IOCTL_IDENT, 0x8D, struct nilfs_argv)
Koji Satoeed10e32009-04-06 19:01:21 -0700933
Koji Satoeed10e32009-04-06 19:01:21 -0700934#endif /* _LINUX_NILFS_FS_H */