xref: /openbmc/linux/fs/nilfs2/segment.h (revision 9ff05123e3bfbb1d2b68ba1d9bf1f7d1dffc1453)
1*9ff05123SRyusuke Konishi /*
2*9ff05123SRyusuke Konishi  * segment.h - NILFS Segment constructor prototypes and definitions
3*9ff05123SRyusuke Konishi  *
4*9ff05123SRyusuke Konishi  * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
5*9ff05123SRyusuke Konishi  *
6*9ff05123SRyusuke Konishi  * This program is free software; you can redistribute it and/or modify
7*9ff05123SRyusuke Konishi  * it under the terms of the GNU General Public License as published by
8*9ff05123SRyusuke Konishi  * the Free Software Foundation; either version 2 of the License, or
9*9ff05123SRyusuke Konishi  * (at your option) any later version.
10*9ff05123SRyusuke Konishi  *
11*9ff05123SRyusuke Konishi  * This program is distributed in the hope that it will be useful,
12*9ff05123SRyusuke Konishi  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*9ff05123SRyusuke Konishi  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*9ff05123SRyusuke Konishi  * GNU General Public License for more details.
15*9ff05123SRyusuke Konishi  *
16*9ff05123SRyusuke Konishi  * You should have received a copy of the GNU General Public License
17*9ff05123SRyusuke Konishi  * along with this program; if not, write to the Free Software
18*9ff05123SRyusuke Konishi  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19*9ff05123SRyusuke Konishi  *
20*9ff05123SRyusuke Konishi  * Written by Ryusuke Konishi <ryusuke@osrg.net>
21*9ff05123SRyusuke Konishi  *
22*9ff05123SRyusuke Konishi  */
23*9ff05123SRyusuke Konishi #ifndef _NILFS_SEGMENT_H
24*9ff05123SRyusuke Konishi #define _NILFS_SEGMENT_H
25*9ff05123SRyusuke Konishi 
26*9ff05123SRyusuke Konishi #include <linux/types.h>
27*9ff05123SRyusuke Konishi #include <linux/fs.h>
28*9ff05123SRyusuke Konishi #include <linux/buffer_head.h>
29*9ff05123SRyusuke Konishi #include <linux/nilfs2_fs.h>
30*9ff05123SRyusuke Konishi #include "sb.h"
31*9ff05123SRyusuke Konishi 
32*9ff05123SRyusuke Konishi /**
33*9ff05123SRyusuke Konishi  * struct nilfs_recovery_info - Recovery infomation
34*9ff05123SRyusuke Konishi  * @ri_need_recovery: Recovery status
35*9ff05123SRyusuke Konishi  * @ri_super_root: Block number of the last super root
36*9ff05123SRyusuke Konishi  * @ri_ri_cno: Number of the last checkpoint
37*9ff05123SRyusuke Konishi  * @ri_lsegs_start: Region for roll-forwarding (start block number)
38*9ff05123SRyusuke Konishi  * @ri_lsegs_end: Region for roll-forwarding (end block number)
39*9ff05123SRyusuke Konishi  * @ri_lseg_start_seq: Sequence value of the segment at ri_lsegs_start
40*9ff05123SRyusuke Konishi  * @ri_used_segments: List of segments to be mark active
41*9ff05123SRyusuke Konishi  * @ri_pseg_start: Block number of the last partial segment
42*9ff05123SRyusuke Konishi  * @ri_seq: Sequence number on the last partial segment
43*9ff05123SRyusuke Konishi  * @ri_segnum: Segment number on the last partial segment
44*9ff05123SRyusuke Konishi  * @ri_nextnum: Next segment number on the last partial segment
45*9ff05123SRyusuke Konishi  */
46*9ff05123SRyusuke Konishi struct nilfs_recovery_info {
47*9ff05123SRyusuke Konishi 	int			ri_need_recovery;
48*9ff05123SRyusuke Konishi 	sector_t		ri_super_root;
49*9ff05123SRyusuke Konishi 	__u64			ri_cno;
50*9ff05123SRyusuke Konishi 
51*9ff05123SRyusuke Konishi 	sector_t		ri_lsegs_start;
52*9ff05123SRyusuke Konishi 	sector_t		ri_lsegs_end;
53*9ff05123SRyusuke Konishi 	u64			ri_lsegs_start_seq;
54*9ff05123SRyusuke Konishi 	struct list_head	ri_used_segments;
55*9ff05123SRyusuke Konishi 	sector_t		ri_pseg_start;
56*9ff05123SRyusuke Konishi 	u64			ri_seq;
57*9ff05123SRyusuke Konishi 	__u64			ri_segnum;
58*9ff05123SRyusuke Konishi 	__u64			ri_nextnum;
59*9ff05123SRyusuke Konishi };
60*9ff05123SRyusuke Konishi 
61*9ff05123SRyusuke Konishi /* ri_need_recovery */
62*9ff05123SRyusuke Konishi #define NILFS_RECOVERY_SR_UPDATED	 1  /* The super root was updated */
63*9ff05123SRyusuke Konishi #define NILFS_RECOVERY_ROLLFORWARD_DONE	 2  /* Rollforward was carried out */
64*9ff05123SRyusuke Konishi 
65*9ff05123SRyusuke Konishi /**
66*9ff05123SRyusuke Konishi  * struct nilfs_cstage - Context of collection stage
67*9ff05123SRyusuke Konishi  * @scnt: Stage count
68*9ff05123SRyusuke Konishi  * @flags: State flags
69*9ff05123SRyusuke Konishi  * @dirty_file_ptr: Pointer on dirty_files list, or inode of a target file
70*9ff05123SRyusuke Konishi  * @gc_inode_ptr: Pointer on the list of gc-inodes
71*9ff05123SRyusuke Konishi  */
72*9ff05123SRyusuke Konishi struct nilfs_cstage {
73*9ff05123SRyusuke Konishi 	int			scnt;
74*9ff05123SRyusuke Konishi 	unsigned 		flags;
75*9ff05123SRyusuke Konishi 	struct nilfs_inode_info *dirty_file_ptr;
76*9ff05123SRyusuke Konishi 	struct nilfs_inode_info *gc_inode_ptr;
77*9ff05123SRyusuke Konishi };
78*9ff05123SRyusuke Konishi 
79*9ff05123SRyusuke Konishi struct nilfs_segment_buffer;
80*9ff05123SRyusuke Konishi 
81*9ff05123SRyusuke Konishi struct nilfs_segsum_pointer {
82*9ff05123SRyusuke Konishi 	struct buffer_head     *bh;
83*9ff05123SRyusuke Konishi 	unsigned		offset; /* offset in bytes */
84*9ff05123SRyusuke Konishi };
85*9ff05123SRyusuke Konishi 
86*9ff05123SRyusuke Konishi /**
87*9ff05123SRyusuke Konishi  * struct nilfs_sc_info - Segment constructor information
88*9ff05123SRyusuke Konishi  * @sc_super: Back pointer to super_block struct
89*9ff05123SRyusuke Konishi  * @sc_sbi: Back pointer to nilfs_sb_info struct
90*9ff05123SRyusuke Konishi  * @sc_nblk_inc: Block count of current generation
91*9ff05123SRyusuke Konishi  * @sc_dirty_files: List of files to be written
92*9ff05123SRyusuke Konishi  * @sc_gc_inodes: List of GC inodes having blocks to be written
93*9ff05123SRyusuke Konishi  * @sc_active_segments: List of active segments that were already written out
94*9ff05123SRyusuke Konishi  * @sc_cleaning_segments: List of segments to be freed through construction
95*9ff05123SRyusuke Konishi  * @sc_copied_buffers: List of copied buffers (buffer heads) to freeze data
96*9ff05123SRyusuke Konishi  * @sc_segbufs: List of segment buffers
97*9ff05123SRyusuke Konishi  * @sc_segbuf_nblocks: Number of available blocks in segment buffers.
98*9ff05123SRyusuke Konishi  * @sc_curseg: Current segment buffer
99*9ff05123SRyusuke Konishi  * @sc_super_root: Pointer to the super root buffer
100*9ff05123SRyusuke Konishi  * @sc_stage: Collection stage
101*9ff05123SRyusuke Konishi  * @sc_finfo_ptr: pointer to the current finfo struct in the segment summary
102*9ff05123SRyusuke Konishi  * @sc_binfo_ptr: pointer to the current binfo struct in the segment summary
103*9ff05123SRyusuke Konishi  * @sc_blk_cnt:	Block count of a file
104*9ff05123SRyusuke Konishi  * @sc_datablk_cnt: Data block count of a file
105*9ff05123SRyusuke Konishi  * @sc_nblk_this_inc: Number of blocks included in the current logical segment
106*9ff05123SRyusuke Konishi  * @sc_seg_ctime: Creation time
107*9ff05123SRyusuke Konishi  * @sc_flags: Internal flags
108*9ff05123SRyusuke Konishi  * @sc_sketch_inode: Inode of the sketch file
109*9ff05123SRyusuke Konishi  * @sc_state_lock: spinlock for sc_state and so on
110*9ff05123SRyusuke Konishi  * @sc_state: Segctord state flags
111*9ff05123SRyusuke Konishi  * @sc_flush_request: inode bitmap of metadata files to be flushed
112*9ff05123SRyusuke Konishi  * @sc_wait_request: Client request queue
113*9ff05123SRyusuke Konishi  * @sc_wait_daemon: Daemon wait queue
114*9ff05123SRyusuke Konishi  * @sc_wait_task: Start/end wait queue to control segctord task
115*9ff05123SRyusuke Konishi  * @sc_seq_request: Request counter
116*9ff05123SRyusuke Konishi  * @sc_seq_done: Completion counter
117*9ff05123SRyusuke Konishi  * @sc_sync: Request of explicit sync operation
118*9ff05123SRyusuke Konishi  * @sc_interval: Timeout value of background construction
119*9ff05123SRyusuke Konishi  * @sc_mjcp_freq: Frequency of creating checkpoints
120*9ff05123SRyusuke Konishi  * @sc_lseg_stime: Start time of the latest logical segment
121*9ff05123SRyusuke Konishi  * @sc_watermark: Watermark for the number of dirty buffers
122*9ff05123SRyusuke Konishi  * @sc_timer: Timer for segctord
123*9ff05123SRyusuke Konishi  * @sc_task: current thread of segctord
124*9ff05123SRyusuke Konishi  */
125*9ff05123SRyusuke Konishi struct nilfs_sc_info {
126*9ff05123SRyusuke Konishi 	struct super_block     *sc_super;
127*9ff05123SRyusuke Konishi 	struct nilfs_sb_info   *sc_sbi;
128*9ff05123SRyusuke Konishi 
129*9ff05123SRyusuke Konishi 	unsigned long		sc_nblk_inc;
130*9ff05123SRyusuke Konishi 
131*9ff05123SRyusuke Konishi 	struct list_head	sc_dirty_files;
132*9ff05123SRyusuke Konishi 	struct list_head	sc_gc_inodes;
133*9ff05123SRyusuke Konishi 	struct list_head	sc_active_segments;
134*9ff05123SRyusuke Konishi 	struct list_head	sc_cleaning_segments;
135*9ff05123SRyusuke Konishi 	struct list_head	sc_copied_buffers;
136*9ff05123SRyusuke Konishi 
137*9ff05123SRyusuke Konishi 	/* Segment buffers */
138*9ff05123SRyusuke Konishi 	struct list_head	sc_segbufs;
139*9ff05123SRyusuke Konishi 	unsigned long		sc_segbuf_nblocks;
140*9ff05123SRyusuke Konishi 	struct nilfs_segment_buffer *sc_curseg;
141*9ff05123SRyusuke Konishi 	struct buffer_head     *sc_super_root;
142*9ff05123SRyusuke Konishi 
143*9ff05123SRyusuke Konishi 	struct nilfs_cstage	sc_stage;
144*9ff05123SRyusuke Konishi 
145*9ff05123SRyusuke Konishi 	struct nilfs_segsum_pointer sc_finfo_ptr;
146*9ff05123SRyusuke Konishi 	struct nilfs_segsum_pointer sc_binfo_ptr;
147*9ff05123SRyusuke Konishi 	unsigned long		sc_blk_cnt;
148*9ff05123SRyusuke Konishi 	unsigned long		sc_datablk_cnt;
149*9ff05123SRyusuke Konishi 	unsigned long		sc_nblk_this_inc;
150*9ff05123SRyusuke Konishi 	time_t			sc_seg_ctime;
151*9ff05123SRyusuke Konishi 
152*9ff05123SRyusuke Konishi 	unsigned long		sc_flags;
153*9ff05123SRyusuke Konishi 
154*9ff05123SRyusuke Konishi 	/*
155*9ff05123SRyusuke Konishi 	 * Pointer to an inode of the sketch.
156*9ff05123SRyusuke Konishi 	 * This pointer is kept only while it contains data.
157*9ff05123SRyusuke Konishi 	 * We protect it with a semaphore of the segment constructor.
158*9ff05123SRyusuke Konishi 	 */
159*9ff05123SRyusuke Konishi 	struct inode	       *sc_sketch_inode;
160*9ff05123SRyusuke Konishi 
161*9ff05123SRyusuke Konishi 	spinlock_t		sc_state_lock;
162*9ff05123SRyusuke Konishi 	unsigned long		sc_state;
163*9ff05123SRyusuke Konishi 	unsigned long		sc_flush_request;
164*9ff05123SRyusuke Konishi 
165*9ff05123SRyusuke Konishi 	wait_queue_head_t	sc_wait_request;
166*9ff05123SRyusuke Konishi 	wait_queue_head_t	sc_wait_daemon;
167*9ff05123SRyusuke Konishi 	wait_queue_head_t	sc_wait_task;
168*9ff05123SRyusuke Konishi 
169*9ff05123SRyusuke Konishi 	__u32			sc_seq_request;
170*9ff05123SRyusuke Konishi 	__u32			sc_seq_done;
171*9ff05123SRyusuke Konishi 
172*9ff05123SRyusuke Konishi 	int			sc_sync;
173*9ff05123SRyusuke Konishi 	unsigned long		sc_interval;
174*9ff05123SRyusuke Konishi 	unsigned long		sc_mjcp_freq;
175*9ff05123SRyusuke Konishi 	unsigned long		sc_lseg_stime;	/* in 1/HZ seconds */
176*9ff05123SRyusuke Konishi 	unsigned long		sc_watermark;
177*9ff05123SRyusuke Konishi 
178*9ff05123SRyusuke Konishi 	struct timer_list      *sc_timer;
179*9ff05123SRyusuke Konishi 	struct task_struct     *sc_task;
180*9ff05123SRyusuke Konishi };
181*9ff05123SRyusuke Konishi 
182*9ff05123SRyusuke Konishi /* sc_flags */
183*9ff05123SRyusuke Konishi enum {
184*9ff05123SRyusuke Konishi 	NILFS_SC_DIRTY,		/* One or more dirty meta-data blocks exist */
185*9ff05123SRyusuke Konishi 	NILFS_SC_UNCLOSED,	/* Logical segment is not closed */
186*9ff05123SRyusuke Konishi 	NILFS_SC_SUPER_ROOT,	/* The latest segment has a super root */
187*9ff05123SRyusuke Konishi 	NILFS_SC_PRIOR_FLUSH,	/* Requesting immediate flush without making a
188*9ff05123SRyusuke Konishi 				   checkpoint */
189*9ff05123SRyusuke Konishi };
190*9ff05123SRyusuke Konishi 
191*9ff05123SRyusuke Konishi /* sc_state */
192*9ff05123SRyusuke Konishi #define NILFS_SEGCTOR_QUIT	    0x0001  /* segctord is being destroyed */
193*9ff05123SRyusuke Konishi #define NILFS_SEGCTOR_COMMIT	    0x0004  /* committed transaction exists */
194*9ff05123SRyusuke Konishi 
195*9ff05123SRyusuke Konishi /*
196*9ff05123SRyusuke Konishi  * Constant parameters
197*9ff05123SRyusuke Konishi  */
198*9ff05123SRyusuke Konishi #define NILFS_SC_CLEANUP_RETRY	    3  /* Retry count of construction when
199*9ff05123SRyusuke Konishi 					  destroying segctord */
200*9ff05123SRyusuke Konishi 
201*9ff05123SRyusuke Konishi /*
202*9ff05123SRyusuke Konishi  * Default values of timeout, in seconds.
203*9ff05123SRyusuke Konishi  */
204*9ff05123SRyusuke Konishi #define NILFS_SC_DEFAULT_TIMEOUT    5   /* Timeout value of dirty blocks.
205*9ff05123SRyusuke Konishi 					   It triggers construction of a
206*9ff05123SRyusuke Konishi 					   logical segment with a super root */
207*9ff05123SRyusuke Konishi #define NILFS_SC_DEFAULT_SR_FREQ    30  /* Maximum frequency of super root
208*9ff05123SRyusuke Konishi 					   creation */
209*9ff05123SRyusuke Konishi #define NILFS_SC_DEFAULT_SB_FREQ    30  /* Minimum interval of periodical
210*9ff05123SRyusuke Konishi 					   update of superblock (reserved) */
211*9ff05123SRyusuke Konishi 
212*9ff05123SRyusuke Konishi /*
213*9ff05123SRyusuke Konishi  * The default threshold amount of data, in block counts.
214*9ff05123SRyusuke Konishi  */
215*9ff05123SRyusuke Konishi #define NILFS_SC_DEFAULT_WATERMARK  3600
216*9ff05123SRyusuke Konishi 
217*9ff05123SRyusuke Konishi 
218*9ff05123SRyusuke Konishi /* segment.c */
219*9ff05123SRyusuke Konishi extern int nilfs_init_transaction_cache(void);
220*9ff05123SRyusuke Konishi extern void nilfs_destroy_transaction_cache(void);
221*9ff05123SRyusuke Konishi extern void nilfs_relax_pressure_in_lock(struct super_block *);
222*9ff05123SRyusuke Konishi 
223*9ff05123SRyusuke Konishi extern int nilfs_construct_segment(struct super_block *);
224*9ff05123SRyusuke Konishi extern int nilfs_construct_dsync_segment(struct super_block *,
225*9ff05123SRyusuke Konishi 					 struct inode *);
226*9ff05123SRyusuke Konishi extern void nilfs_flush_segment(struct super_block *, ino_t);
227*9ff05123SRyusuke Konishi extern int nilfs_clean_segments(struct super_block *, void __user *);
228*9ff05123SRyusuke Konishi 
229*9ff05123SRyusuke Konishi extern int nilfs_segctor_add_segments_to_be_freed(struct nilfs_sc_info *,
230*9ff05123SRyusuke Konishi 						  __u64 *, size_t);
231*9ff05123SRyusuke Konishi extern void nilfs_segctor_clear_segments_to_be_freed(struct nilfs_sc_info *);
232*9ff05123SRyusuke Konishi 
233*9ff05123SRyusuke Konishi extern int nilfs_attach_segment_constructor(struct nilfs_sb_info *,
234*9ff05123SRyusuke Konishi 					    struct nilfs_recovery_info *);
235*9ff05123SRyusuke Konishi extern void nilfs_detach_segment_constructor(struct nilfs_sb_info *);
236*9ff05123SRyusuke Konishi 
237*9ff05123SRyusuke Konishi /* recovery.c */
238*9ff05123SRyusuke Konishi extern int nilfs_read_super_root_block(struct super_block *, sector_t,
239*9ff05123SRyusuke Konishi 				       struct buffer_head **, int);
240*9ff05123SRyusuke Konishi extern int nilfs_search_super_root(struct the_nilfs *, struct nilfs_sb_info *,
241*9ff05123SRyusuke Konishi 				   struct nilfs_recovery_info *);
242*9ff05123SRyusuke Konishi extern int nilfs_recover_logical_segments(struct the_nilfs *,
243*9ff05123SRyusuke Konishi 					  struct nilfs_sb_info *,
244*9ff05123SRyusuke Konishi 					  struct nilfs_recovery_info *);
245*9ff05123SRyusuke Konishi 
246*9ff05123SRyusuke Konishi #endif /* _NILFS_SEGMENT_H */
247