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