xref: /linux/include/uapi/linux/nilfs2_api.h (revision e63e88bc53bac7e4c3f592f8126c51a7569be673)
1*e63e88bcSRyusuke Konishi /*
2*e63e88bcSRyusuke Konishi  * nilfs2_api.h - NILFS2 user space API
3*e63e88bcSRyusuke Konishi  *
4*e63e88bcSRyusuke Konishi  * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
5*e63e88bcSRyusuke Konishi  *
6*e63e88bcSRyusuke Konishi  * This program is free software; you can redistribute it and/or modify
7*e63e88bcSRyusuke Konishi  * it under the terms of the GNU Lesser General Public License as published
8*e63e88bcSRyusuke Konishi  * by the Free Software Foundation; either version 2.1 of the License, or
9*e63e88bcSRyusuke Konishi  * (at your option) any later version.
10*e63e88bcSRyusuke Konishi  */
11*e63e88bcSRyusuke Konishi 
12*e63e88bcSRyusuke Konishi #ifndef _LINUX_NILFS2_API_H
13*e63e88bcSRyusuke Konishi #define _LINUX_NILFS2_API_H
14*e63e88bcSRyusuke Konishi 
15*e63e88bcSRyusuke Konishi #include <linux/types.h>
16*e63e88bcSRyusuke Konishi #include <linux/ioctl.h>
17*e63e88bcSRyusuke Konishi 
18*e63e88bcSRyusuke Konishi /**
19*e63e88bcSRyusuke Konishi  * struct nilfs_cpinfo - checkpoint information
20*e63e88bcSRyusuke Konishi  * @ci_flags: flags
21*e63e88bcSRyusuke Konishi  * @ci_pad: padding
22*e63e88bcSRyusuke Konishi  * @ci_cno: checkpoint number
23*e63e88bcSRyusuke Konishi  * @ci_create: creation timestamp
24*e63e88bcSRyusuke Konishi  * @ci_nblk_inc: number of blocks incremented by this checkpoint
25*e63e88bcSRyusuke Konishi  * @ci_inodes_count: inodes count
26*e63e88bcSRyusuke Konishi  * @ci_blocks_count: blocks count
27*e63e88bcSRyusuke Konishi  * @ci_next: next checkpoint number in snapshot list
28*e63e88bcSRyusuke Konishi  */
29*e63e88bcSRyusuke Konishi struct nilfs_cpinfo {
30*e63e88bcSRyusuke Konishi 	__u32 ci_flags;
31*e63e88bcSRyusuke Konishi 	__u32 ci_pad;
32*e63e88bcSRyusuke Konishi 	__u64 ci_cno;
33*e63e88bcSRyusuke Konishi 	__u64 ci_create;
34*e63e88bcSRyusuke Konishi 	__u64 ci_nblk_inc;
35*e63e88bcSRyusuke Konishi 	__u64 ci_inodes_count;
36*e63e88bcSRyusuke Konishi 	__u64 ci_blocks_count;
37*e63e88bcSRyusuke Konishi 	__u64 ci_next;
38*e63e88bcSRyusuke Konishi };
39*e63e88bcSRyusuke Konishi 
40*e63e88bcSRyusuke Konishi /* checkpoint flags */
41*e63e88bcSRyusuke Konishi enum {
42*e63e88bcSRyusuke Konishi 	NILFS_CPINFO_SNAPSHOT,
43*e63e88bcSRyusuke Konishi 	NILFS_CPINFO_INVALID,
44*e63e88bcSRyusuke Konishi 	NILFS_CPINFO_SKETCH,
45*e63e88bcSRyusuke Konishi 	NILFS_CPINFO_MINOR,
46*e63e88bcSRyusuke Konishi };
47*e63e88bcSRyusuke Konishi 
48*e63e88bcSRyusuke Konishi #define NILFS_CPINFO_FNS(flag, name)					\
49*e63e88bcSRyusuke Konishi static inline int							\
50*e63e88bcSRyusuke Konishi nilfs_cpinfo_##name(const struct nilfs_cpinfo *cpinfo)			\
51*e63e88bcSRyusuke Konishi {									\
52*e63e88bcSRyusuke Konishi 	return !!(cpinfo->ci_flags & (1UL << NILFS_CPINFO_##flag));	\
53*e63e88bcSRyusuke Konishi }
54*e63e88bcSRyusuke Konishi 
55*e63e88bcSRyusuke Konishi NILFS_CPINFO_FNS(SNAPSHOT, snapshot)
56*e63e88bcSRyusuke Konishi NILFS_CPINFO_FNS(INVALID, invalid)
57*e63e88bcSRyusuke Konishi NILFS_CPINFO_FNS(MINOR, minor)
58*e63e88bcSRyusuke Konishi 
59*e63e88bcSRyusuke Konishi /**
60*e63e88bcSRyusuke Konishi  * nilfs_suinfo - segment usage information
61*e63e88bcSRyusuke Konishi  * @sui_lastmod: timestamp of last modification
62*e63e88bcSRyusuke Konishi  * @sui_nblocks: number of written blocks in segment
63*e63e88bcSRyusuke Konishi  * @sui_flags: segment usage flags
64*e63e88bcSRyusuke Konishi  */
65*e63e88bcSRyusuke Konishi struct nilfs_suinfo {
66*e63e88bcSRyusuke Konishi 	__u64 sui_lastmod;
67*e63e88bcSRyusuke Konishi 	__u32 sui_nblocks;
68*e63e88bcSRyusuke Konishi 	__u32 sui_flags;
69*e63e88bcSRyusuke Konishi };
70*e63e88bcSRyusuke Konishi 
71*e63e88bcSRyusuke Konishi /* segment usage flags */
72*e63e88bcSRyusuke Konishi enum {
73*e63e88bcSRyusuke Konishi 	NILFS_SUINFO_ACTIVE,
74*e63e88bcSRyusuke Konishi 	NILFS_SUINFO_DIRTY,
75*e63e88bcSRyusuke Konishi 	NILFS_SUINFO_ERROR,
76*e63e88bcSRyusuke Konishi };
77*e63e88bcSRyusuke Konishi 
78*e63e88bcSRyusuke Konishi #define NILFS_SUINFO_FNS(flag, name)					\
79*e63e88bcSRyusuke Konishi static inline int							\
80*e63e88bcSRyusuke Konishi nilfs_suinfo_##name(const struct nilfs_suinfo *si)			\
81*e63e88bcSRyusuke Konishi {									\
82*e63e88bcSRyusuke Konishi 	return si->sui_flags & (1UL << NILFS_SUINFO_##flag);		\
83*e63e88bcSRyusuke Konishi }
84*e63e88bcSRyusuke Konishi 
85*e63e88bcSRyusuke Konishi NILFS_SUINFO_FNS(ACTIVE, active)
86*e63e88bcSRyusuke Konishi NILFS_SUINFO_FNS(DIRTY, dirty)
87*e63e88bcSRyusuke Konishi NILFS_SUINFO_FNS(ERROR, error)
88*e63e88bcSRyusuke Konishi 
89*e63e88bcSRyusuke Konishi static inline int nilfs_suinfo_clean(const struct nilfs_suinfo *si)
90*e63e88bcSRyusuke Konishi {
91*e63e88bcSRyusuke Konishi 	return !si->sui_flags;
92*e63e88bcSRyusuke Konishi }
93*e63e88bcSRyusuke Konishi 
94*e63e88bcSRyusuke Konishi /**
95*e63e88bcSRyusuke Konishi  * nilfs_suinfo_update - segment usage information update
96*e63e88bcSRyusuke Konishi  * @sup_segnum: segment number
97*e63e88bcSRyusuke Konishi  * @sup_flags: flags for which fields are active in sup_sui
98*e63e88bcSRyusuke Konishi  * @sup_reserved: reserved necessary for alignment
99*e63e88bcSRyusuke Konishi  * @sup_sui: segment usage information
100*e63e88bcSRyusuke Konishi  */
101*e63e88bcSRyusuke Konishi struct nilfs_suinfo_update {
102*e63e88bcSRyusuke Konishi 	__u64 sup_segnum;
103*e63e88bcSRyusuke Konishi 	__u32 sup_flags;
104*e63e88bcSRyusuke Konishi 	__u32 sup_reserved;
105*e63e88bcSRyusuke Konishi 	struct nilfs_suinfo sup_sui;
106*e63e88bcSRyusuke Konishi };
107*e63e88bcSRyusuke Konishi 
108*e63e88bcSRyusuke Konishi enum {
109*e63e88bcSRyusuke Konishi 	NILFS_SUINFO_UPDATE_LASTMOD,
110*e63e88bcSRyusuke Konishi 	NILFS_SUINFO_UPDATE_NBLOCKS,
111*e63e88bcSRyusuke Konishi 	NILFS_SUINFO_UPDATE_FLAGS,
112*e63e88bcSRyusuke Konishi 	__NR_NILFS_SUINFO_UPDATE_FIELDS,
113*e63e88bcSRyusuke Konishi };
114*e63e88bcSRyusuke Konishi 
115*e63e88bcSRyusuke Konishi #define NILFS_SUINFO_UPDATE_FNS(flag, name)				\
116*e63e88bcSRyusuke Konishi static inline void							\
117*e63e88bcSRyusuke Konishi nilfs_suinfo_update_set_##name(struct nilfs_suinfo_update *sup)		\
118*e63e88bcSRyusuke Konishi {									\
119*e63e88bcSRyusuke Konishi 	sup->sup_flags |= 1UL << NILFS_SUINFO_UPDATE_##flag;		\
120*e63e88bcSRyusuke Konishi }									\
121*e63e88bcSRyusuke Konishi static inline void							\
122*e63e88bcSRyusuke Konishi nilfs_suinfo_update_clear_##name(struct nilfs_suinfo_update *sup)	\
123*e63e88bcSRyusuke Konishi {									\
124*e63e88bcSRyusuke Konishi 	sup->sup_flags &= ~(1UL << NILFS_SUINFO_UPDATE_##flag);		\
125*e63e88bcSRyusuke Konishi }									\
126*e63e88bcSRyusuke Konishi static inline int							\
127*e63e88bcSRyusuke Konishi nilfs_suinfo_update_##name(const struct nilfs_suinfo_update *sup)	\
128*e63e88bcSRyusuke Konishi {									\
129*e63e88bcSRyusuke Konishi 	return !!(sup->sup_flags & (1UL << NILFS_SUINFO_UPDATE_##flag));\
130*e63e88bcSRyusuke Konishi }
131*e63e88bcSRyusuke Konishi 
132*e63e88bcSRyusuke Konishi NILFS_SUINFO_UPDATE_FNS(LASTMOD, lastmod)
133*e63e88bcSRyusuke Konishi NILFS_SUINFO_UPDATE_FNS(NBLOCKS, nblocks)
134*e63e88bcSRyusuke Konishi NILFS_SUINFO_UPDATE_FNS(FLAGS, flags)
135*e63e88bcSRyusuke Konishi 
136*e63e88bcSRyusuke Konishi enum {
137*e63e88bcSRyusuke Konishi 	NILFS_CHECKPOINT,
138*e63e88bcSRyusuke Konishi 	NILFS_SNAPSHOT,
139*e63e88bcSRyusuke Konishi };
140*e63e88bcSRyusuke Konishi 
141*e63e88bcSRyusuke Konishi /**
142*e63e88bcSRyusuke Konishi  * struct nilfs_cpmode - change checkpoint mode structure
143*e63e88bcSRyusuke Konishi  * @cm_cno: checkpoint number
144*e63e88bcSRyusuke Konishi  * @cm_mode: mode of checkpoint
145*e63e88bcSRyusuke Konishi  * @cm_pad: padding
146*e63e88bcSRyusuke Konishi  */
147*e63e88bcSRyusuke Konishi struct nilfs_cpmode {
148*e63e88bcSRyusuke Konishi 	__u64 cm_cno;
149*e63e88bcSRyusuke Konishi 	__u32 cm_mode;
150*e63e88bcSRyusuke Konishi 	__u32 cm_pad;
151*e63e88bcSRyusuke Konishi };
152*e63e88bcSRyusuke Konishi 
153*e63e88bcSRyusuke Konishi /**
154*e63e88bcSRyusuke Konishi  * struct nilfs_argv - argument vector
155*e63e88bcSRyusuke Konishi  * @v_base: pointer on data array from userspace
156*e63e88bcSRyusuke Konishi  * @v_nmembs: number of members in data array
157*e63e88bcSRyusuke Konishi  * @v_size: size of data array in bytes
158*e63e88bcSRyusuke Konishi  * @v_flags: flags
159*e63e88bcSRyusuke Konishi  * @v_index: start number of target data items
160*e63e88bcSRyusuke Konishi  */
161*e63e88bcSRyusuke Konishi struct nilfs_argv {
162*e63e88bcSRyusuke Konishi 	__u64 v_base;
163*e63e88bcSRyusuke Konishi 	__u32 v_nmembs;	/* number of members */
164*e63e88bcSRyusuke Konishi 	__u16 v_size;	/* size of members */
165*e63e88bcSRyusuke Konishi 	__u16 v_flags;
166*e63e88bcSRyusuke Konishi 	__u64 v_index;
167*e63e88bcSRyusuke Konishi };
168*e63e88bcSRyusuke Konishi 
169*e63e88bcSRyusuke Konishi /**
170*e63e88bcSRyusuke Konishi  * struct nilfs_period - period of checkpoint numbers
171*e63e88bcSRyusuke Konishi  * @p_start: start checkpoint number (inclusive)
172*e63e88bcSRyusuke Konishi  * @p_end: end checkpoint number (exclusive)
173*e63e88bcSRyusuke Konishi  */
174*e63e88bcSRyusuke Konishi struct nilfs_period {
175*e63e88bcSRyusuke Konishi 	__u64 p_start;
176*e63e88bcSRyusuke Konishi 	__u64 p_end;
177*e63e88bcSRyusuke Konishi };
178*e63e88bcSRyusuke Konishi 
179*e63e88bcSRyusuke Konishi /**
180*e63e88bcSRyusuke Konishi  * struct nilfs_cpstat - checkpoint statistics
181*e63e88bcSRyusuke Konishi  * @cs_cno: checkpoint number
182*e63e88bcSRyusuke Konishi  * @cs_ncps: number of checkpoints
183*e63e88bcSRyusuke Konishi  * @cs_nsss: number of snapshots
184*e63e88bcSRyusuke Konishi  */
185*e63e88bcSRyusuke Konishi struct nilfs_cpstat {
186*e63e88bcSRyusuke Konishi 	__u64 cs_cno;
187*e63e88bcSRyusuke Konishi 	__u64 cs_ncps;
188*e63e88bcSRyusuke Konishi 	__u64 cs_nsss;
189*e63e88bcSRyusuke Konishi };
190*e63e88bcSRyusuke Konishi 
191*e63e88bcSRyusuke Konishi /**
192*e63e88bcSRyusuke Konishi  * struct nilfs_sustat - segment usage statistics
193*e63e88bcSRyusuke Konishi  * @ss_nsegs: number of segments
194*e63e88bcSRyusuke Konishi  * @ss_ncleansegs: number of clean segments
195*e63e88bcSRyusuke Konishi  * @ss_ndirtysegs: number of dirty segments
196*e63e88bcSRyusuke Konishi  * @ss_ctime: creation time of the last segment
197*e63e88bcSRyusuke Konishi  * @ss_nongc_ctime: creation time of the last segment not for GC
198*e63e88bcSRyusuke Konishi  * @ss_prot_seq: least sequence number of segments which must not be reclaimed
199*e63e88bcSRyusuke Konishi  */
200*e63e88bcSRyusuke Konishi struct nilfs_sustat {
201*e63e88bcSRyusuke Konishi 	__u64 ss_nsegs;
202*e63e88bcSRyusuke Konishi 	__u64 ss_ncleansegs;
203*e63e88bcSRyusuke Konishi 	__u64 ss_ndirtysegs;
204*e63e88bcSRyusuke Konishi 	__u64 ss_ctime;
205*e63e88bcSRyusuke Konishi 	__u64 ss_nongc_ctime;
206*e63e88bcSRyusuke Konishi 	__u64 ss_prot_seq;
207*e63e88bcSRyusuke Konishi };
208*e63e88bcSRyusuke Konishi 
209*e63e88bcSRyusuke Konishi /**
210*e63e88bcSRyusuke Konishi  * struct nilfs_vinfo - virtual block number information
211*e63e88bcSRyusuke Konishi  * @vi_vblocknr: virtual block number
212*e63e88bcSRyusuke Konishi  * @vi_start: start checkpoint number (inclusive)
213*e63e88bcSRyusuke Konishi  * @vi_end: end checkpoint number (exclusive)
214*e63e88bcSRyusuke Konishi  * @vi_blocknr: disk block number
215*e63e88bcSRyusuke Konishi  */
216*e63e88bcSRyusuke Konishi struct nilfs_vinfo {
217*e63e88bcSRyusuke Konishi 	__u64 vi_vblocknr;
218*e63e88bcSRyusuke Konishi 	__u64 vi_start;
219*e63e88bcSRyusuke Konishi 	__u64 vi_end;
220*e63e88bcSRyusuke Konishi 	__u64 vi_blocknr;
221*e63e88bcSRyusuke Konishi };
222*e63e88bcSRyusuke Konishi 
223*e63e88bcSRyusuke Konishi /**
224*e63e88bcSRyusuke Konishi  * struct nilfs_vdesc - descriptor of virtual block number
225*e63e88bcSRyusuke Konishi  * @vd_ino: inode number
226*e63e88bcSRyusuke Konishi  * @vd_cno: checkpoint number
227*e63e88bcSRyusuke Konishi  * @vd_vblocknr: virtual block number
228*e63e88bcSRyusuke Konishi  * @vd_period: period of checkpoint numbers
229*e63e88bcSRyusuke Konishi  * @vd_blocknr: disk block number
230*e63e88bcSRyusuke Konishi  * @vd_offset: logical block offset inside a file
231*e63e88bcSRyusuke Konishi  * @vd_flags: flags (data or node block)
232*e63e88bcSRyusuke Konishi  * @vd_pad: padding
233*e63e88bcSRyusuke Konishi  */
234*e63e88bcSRyusuke Konishi struct nilfs_vdesc {
235*e63e88bcSRyusuke Konishi 	__u64 vd_ino;
236*e63e88bcSRyusuke Konishi 	__u64 vd_cno;
237*e63e88bcSRyusuke Konishi 	__u64 vd_vblocknr;
238*e63e88bcSRyusuke Konishi 	struct nilfs_period vd_period;
239*e63e88bcSRyusuke Konishi 	__u64 vd_blocknr;
240*e63e88bcSRyusuke Konishi 	__u64 vd_offset;
241*e63e88bcSRyusuke Konishi 	__u32 vd_flags;
242*e63e88bcSRyusuke Konishi 	__u32 vd_pad;
243*e63e88bcSRyusuke Konishi };
244*e63e88bcSRyusuke Konishi 
245*e63e88bcSRyusuke Konishi /**
246*e63e88bcSRyusuke Konishi  * struct nilfs_bdesc - descriptor of disk block number
247*e63e88bcSRyusuke Konishi  * @bd_ino: inode number
248*e63e88bcSRyusuke Konishi  * @bd_oblocknr: disk block address (for skipping dead blocks)
249*e63e88bcSRyusuke Konishi  * @bd_blocknr: disk block address
250*e63e88bcSRyusuke Konishi  * @bd_offset: logical block offset inside a file
251*e63e88bcSRyusuke Konishi  * @bd_level: level in the b-tree organization
252*e63e88bcSRyusuke Konishi  * @bd_pad: padding
253*e63e88bcSRyusuke Konishi  */
254*e63e88bcSRyusuke Konishi struct nilfs_bdesc {
255*e63e88bcSRyusuke Konishi 	__u64 bd_ino;
256*e63e88bcSRyusuke Konishi 	__u64 bd_oblocknr;
257*e63e88bcSRyusuke Konishi 	__u64 bd_blocknr;
258*e63e88bcSRyusuke Konishi 	__u64 bd_offset;
259*e63e88bcSRyusuke Konishi 	__u32 bd_level;
260*e63e88bcSRyusuke Konishi 	__u32 bd_pad;
261*e63e88bcSRyusuke Konishi };
262*e63e88bcSRyusuke Konishi 
263*e63e88bcSRyusuke Konishi #define NILFS_IOCTL_IDENT	'n'
264*e63e88bcSRyusuke Konishi 
265*e63e88bcSRyusuke Konishi #define NILFS_IOCTL_CHANGE_CPMODE					\
266*e63e88bcSRyusuke Konishi 	_IOW(NILFS_IOCTL_IDENT, 0x80, struct nilfs_cpmode)
267*e63e88bcSRyusuke Konishi #define NILFS_IOCTL_DELETE_CHECKPOINT					\
268*e63e88bcSRyusuke Konishi 	_IOW(NILFS_IOCTL_IDENT, 0x81, __u64)
269*e63e88bcSRyusuke Konishi #define NILFS_IOCTL_GET_CPINFO						\
270*e63e88bcSRyusuke Konishi 	_IOR(NILFS_IOCTL_IDENT, 0x82, struct nilfs_argv)
271*e63e88bcSRyusuke Konishi #define NILFS_IOCTL_GET_CPSTAT						\
272*e63e88bcSRyusuke Konishi 	_IOR(NILFS_IOCTL_IDENT, 0x83, struct nilfs_cpstat)
273*e63e88bcSRyusuke Konishi #define NILFS_IOCTL_GET_SUINFO						\
274*e63e88bcSRyusuke Konishi 	_IOR(NILFS_IOCTL_IDENT, 0x84, struct nilfs_argv)
275*e63e88bcSRyusuke Konishi #define NILFS_IOCTL_GET_SUSTAT						\
276*e63e88bcSRyusuke Konishi 	_IOR(NILFS_IOCTL_IDENT, 0x85, struct nilfs_sustat)
277*e63e88bcSRyusuke Konishi #define NILFS_IOCTL_GET_VINFO						\
278*e63e88bcSRyusuke Konishi 	_IOWR(NILFS_IOCTL_IDENT, 0x86, struct nilfs_argv)
279*e63e88bcSRyusuke Konishi #define NILFS_IOCTL_GET_BDESCS						\
280*e63e88bcSRyusuke Konishi 	_IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv)
281*e63e88bcSRyusuke Konishi #define NILFS_IOCTL_CLEAN_SEGMENTS					\
282*e63e88bcSRyusuke Konishi 	_IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv[5])
283*e63e88bcSRyusuke Konishi #define NILFS_IOCTL_SYNC						\
284*e63e88bcSRyusuke Konishi 	_IOR(NILFS_IOCTL_IDENT, 0x8A, __u64)
285*e63e88bcSRyusuke Konishi #define NILFS_IOCTL_RESIZE						\
286*e63e88bcSRyusuke Konishi 	_IOW(NILFS_IOCTL_IDENT, 0x8B, __u64)
287*e63e88bcSRyusuke Konishi #define NILFS_IOCTL_SET_ALLOC_RANGE					\
288*e63e88bcSRyusuke Konishi 	_IOW(NILFS_IOCTL_IDENT, 0x8C, __u64[2])
289*e63e88bcSRyusuke Konishi #define NILFS_IOCTL_SET_SUINFO						\
290*e63e88bcSRyusuke Konishi 	_IOW(NILFS_IOCTL_IDENT, 0x8D, struct nilfs_argv)
291*e63e88bcSRyusuke Konishi 
292*e63e88bcSRyusuke Konishi #endif /* _LINUX_NILFS2_API_H */
293