| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 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 | /** | 
| Ryusuke Konishi | 7a65004 | 2010-03-14 03:32:40 +0900 | [diff] [blame] | 33 | * struct nilfs_recovery_info - Recovery information | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 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 | */ | 
|  | 46 | struct 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 | */ | 
|  | 72 | struct nilfs_cstage { | 
|  | 73 | int			scnt; | 
| Ryusuke Konishi | 55480a0 | 2010-03-14 03:55:56 +0900 | [diff] [blame] | 74 | unsigned		flags; | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 75 | struct nilfs_inode_info *dirty_file_ptr; | 
|  | 76 | struct nilfs_inode_info *gc_inode_ptr; | 
|  | 77 | }; | 
|  | 78 |  | 
|  | 79 | struct nilfs_segment_buffer; | 
|  | 80 |  | 
|  | 81 | struct 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 | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 93 | * @sc_copied_buffers: List of copied buffers (buffer heads) to freeze data | 
| Ryusuke Konishi | 071cb4b | 2009-05-16 23:44:55 +0900 | [diff] [blame] | 94 | * @sc_freesegs: array of segment numbers to be freed | 
|  | 95 | * @sc_nfreesegs: number of segments on @sc_freesegs | 
| Ryusuke Konishi | f30bf3e | 2009-04-06 19:01:38 -0700 | [diff] [blame] | 96 | * @sc_dsync_inode: inode whose data pages are written for a sync operation | 
|  | 97 | * @sc_dsync_start: start byte offset of data pages | 
|  | 98 | * @sc_dsync_end: end byte offset of data pages (inclusive) | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 99 | * @sc_segbufs: List of segment buffers | 
| Ryusuke Konishi | a694291 | 2009-11-29 23:03:04 +0900 | [diff] [blame] | 100 | * @sc_write_logs: List of segment buffers to hold logs under writing | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 101 | * @sc_segbuf_nblocks: Number of available blocks in segment buffers. | 
|  | 102 | * @sc_curseg: Current segment buffer | 
|  | 103 | * @sc_super_root: Pointer to the super root buffer | 
|  | 104 | * @sc_stage: Collection stage | 
|  | 105 | * @sc_finfo_ptr: pointer to the current finfo struct in the segment summary | 
|  | 106 | * @sc_binfo_ptr: pointer to the current binfo struct in the segment summary | 
|  | 107 | * @sc_blk_cnt:	Block count of a file | 
|  | 108 | * @sc_datablk_cnt: Data block count of a file | 
|  | 109 | * @sc_nblk_this_inc: Number of blocks included in the current logical segment | 
|  | 110 | * @sc_seg_ctime: Creation time | 
|  | 111 | * @sc_flags: Internal flags | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 112 | * @sc_state_lock: spinlock for sc_state and so on | 
|  | 113 | * @sc_state: Segctord state flags | 
|  | 114 | * @sc_flush_request: inode bitmap of metadata files to be flushed | 
|  | 115 | * @sc_wait_request: Client request queue | 
|  | 116 | * @sc_wait_daemon: Daemon wait queue | 
|  | 117 | * @sc_wait_task: Start/end wait queue to control segctord task | 
|  | 118 | * @sc_seq_request: Request counter | 
| Ryusuke Konishi | dcd7618 | 2010-01-26 15:20:15 +0900 | [diff] [blame] | 119 | * @sc_seq_accept: Accepted request count | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 120 | * @sc_seq_done: Completion counter | 
|  | 121 | * @sc_sync: Request of explicit sync operation | 
|  | 122 | * @sc_interval: Timeout value of background construction | 
|  | 123 | * @sc_mjcp_freq: Frequency of creating checkpoints | 
|  | 124 | * @sc_lseg_stime: Start time of the latest logical segment | 
|  | 125 | * @sc_watermark: Watermark for the number of dirty buffers | 
|  | 126 | * @sc_timer: Timer for segctord | 
|  | 127 | * @sc_task: current thread of segctord | 
|  | 128 | */ | 
|  | 129 | struct nilfs_sc_info { | 
|  | 130 | struct super_block     *sc_super; | 
|  | 131 | struct nilfs_sb_info   *sc_sbi; | 
|  | 132 |  | 
|  | 133 | unsigned long		sc_nblk_inc; | 
|  | 134 |  | 
|  | 135 | struct list_head	sc_dirty_files; | 
|  | 136 | struct list_head	sc_gc_inodes; | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 137 | struct list_head	sc_copied_buffers; | 
|  | 138 |  | 
| Ryusuke Konishi | 071cb4b | 2009-05-16 23:44:55 +0900 | [diff] [blame] | 139 | __u64		       *sc_freesegs; | 
|  | 140 | size_t			sc_nfreesegs; | 
|  | 141 |  | 
| Ryusuke Konishi | f30bf3e | 2009-04-06 19:01:38 -0700 | [diff] [blame] | 142 | struct nilfs_inode_info *sc_dsync_inode; | 
|  | 143 | loff_t			sc_dsync_start; | 
|  | 144 | loff_t			sc_dsync_end; | 
|  | 145 |  | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 146 | /* Segment buffers */ | 
|  | 147 | struct list_head	sc_segbufs; | 
| Ryusuke Konishi | a694291 | 2009-11-29 23:03:04 +0900 | [diff] [blame] | 148 | struct list_head	sc_write_logs; | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 149 | unsigned long		sc_segbuf_nblocks; | 
|  | 150 | struct nilfs_segment_buffer *sc_curseg; | 
|  | 151 | struct buffer_head     *sc_super_root; | 
|  | 152 |  | 
|  | 153 | struct nilfs_cstage	sc_stage; | 
|  | 154 |  | 
|  | 155 | struct nilfs_segsum_pointer sc_finfo_ptr; | 
|  | 156 | struct nilfs_segsum_pointer sc_binfo_ptr; | 
|  | 157 | unsigned long		sc_blk_cnt; | 
|  | 158 | unsigned long		sc_datablk_cnt; | 
|  | 159 | unsigned long		sc_nblk_this_inc; | 
|  | 160 | time_t			sc_seg_ctime; | 
|  | 161 |  | 
|  | 162 | unsigned long		sc_flags; | 
|  | 163 |  | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 164 | spinlock_t		sc_state_lock; | 
|  | 165 | unsigned long		sc_state; | 
|  | 166 | unsigned long		sc_flush_request; | 
|  | 167 |  | 
|  | 168 | wait_queue_head_t	sc_wait_request; | 
|  | 169 | wait_queue_head_t	sc_wait_daemon; | 
|  | 170 | wait_queue_head_t	sc_wait_task; | 
|  | 171 |  | 
|  | 172 | __u32			sc_seq_request; | 
| Ryusuke Konishi | dcd7618 | 2010-01-26 15:20:15 +0900 | [diff] [blame] | 173 | __u32			sc_seq_accepted; | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 174 | __u32			sc_seq_done; | 
|  | 175 |  | 
|  | 176 | int			sc_sync; | 
|  | 177 | unsigned long		sc_interval; | 
|  | 178 | unsigned long		sc_mjcp_freq; | 
|  | 179 | unsigned long		sc_lseg_stime;	/* in 1/HZ seconds */ | 
|  | 180 | unsigned long		sc_watermark; | 
|  | 181 |  | 
|  | 182 | struct timer_list      *sc_timer; | 
|  | 183 | struct task_struct     *sc_task; | 
|  | 184 | }; | 
|  | 185 |  | 
|  | 186 | /* sc_flags */ | 
|  | 187 | enum { | 
|  | 188 | NILFS_SC_DIRTY,		/* One or more dirty meta-data blocks exist */ | 
|  | 189 | NILFS_SC_UNCLOSED,	/* Logical segment is not closed */ | 
|  | 190 | NILFS_SC_SUPER_ROOT,	/* The latest segment has a super root */ | 
|  | 191 | NILFS_SC_PRIOR_FLUSH,	/* Requesting immediate flush without making a | 
|  | 192 | checkpoint */ | 
| Ryusuke Konishi | c96fa46 | 2009-04-06 19:01:57 -0700 | [diff] [blame] | 193 | NILFS_SC_HAVE_DELTA,	/* Next checkpoint will have update of files | 
|  | 194 | other than DAT, cpfile, sufile, or files | 
|  | 195 | moved by GC */ | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 196 | }; | 
|  | 197 |  | 
|  | 198 | /* sc_state */ | 
|  | 199 | #define NILFS_SEGCTOR_QUIT	    0x0001  /* segctord is being destroyed */ | 
|  | 200 | #define NILFS_SEGCTOR_COMMIT	    0x0004  /* committed transaction exists */ | 
|  | 201 |  | 
|  | 202 | /* | 
|  | 203 | * Constant parameters | 
|  | 204 | */ | 
|  | 205 | #define NILFS_SC_CLEANUP_RETRY	    3  /* Retry count of construction when | 
|  | 206 | destroying segctord */ | 
|  | 207 |  | 
|  | 208 | /* | 
|  | 209 | * Default values of timeout, in seconds. | 
|  | 210 | */ | 
|  | 211 | #define NILFS_SC_DEFAULT_TIMEOUT    5   /* Timeout value of dirty blocks. | 
|  | 212 | It triggers construction of a | 
|  | 213 | logical segment with a super root */ | 
|  | 214 | #define NILFS_SC_DEFAULT_SR_FREQ    30  /* Maximum frequency of super root | 
|  | 215 | creation */ | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 216 |  | 
|  | 217 | /* | 
|  | 218 | * The default threshold amount of data, in block counts. | 
|  | 219 | */ | 
|  | 220 | #define NILFS_SC_DEFAULT_WATERMARK  3600 | 
|  | 221 |  | 
|  | 222 |  | 
|  | 223 | /* segment.c */ | 
|  | 224 | extern int nilfs_init_transaction_cache(void); | 
|  | 225 | extern void nilfs_destroy_transaction_cache(void); | 
|  | 226 | extern void nilfs_relax_pressure_in_lock(struct super_block *); | 
|  | 227 |  | 
|  | 228 | extern int nilfs_construct_segment(struct super_block *); | 
| Ryusuke Konishi | f30bf3e | 2009-04-06 19:01:38 -0700 | [diff] [blame] | 229 | extern int nilfs_construct_dsync_segment(struct super_block *, struct inode *, | 
|  | 230 | loff_t, loff_t); | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 231 | extern void nilfs_flush_segment(struct super_block *, ino_t); | 
| Ryusuke Konishi | 4f6b828 | 2009-05-10 22:41:43 +0900 | [diff] [blame] | 232 | extern int nilfs_clean_segments(struct super_block *, struct nilfs_argv *, | 
|  | 233 | void **); | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 234 |  | 
| Ryusuke Konishi | cece552 | 2009-04-06 19:01:58 -0700 | [diff] [blame] | 235 | extern int nilfs_attach_segment_constructor(struct nilfs_sb_info *); | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 236 | extern void nilfs_detach_segment_constructor(struct nilfs_sb_info *); | 
|  | 237 |  | 
|  | 238 | /* recovery.c */ | 
|  | 239 | extern int nilfs_read_super_root_block(struct super_block *, sector_t, | 
|  | 240 | struct buffer_head **, int); | 
|  | 241 | extern int nilfs_search_super_root(struct the_nilfs *, struct nilfs_sb_info *, | 
|  | 242 | struct nilfs_recovery_info *); | 
|  | 243 | extern int nilfs_recover_logical_segments(struct the_nilfs *, | 
|  | 244 | struct nilfs_sb_info *, | 
|  | 245 | struct nilfs_recovery_info *); | 
| Ryusuke Konishi | 654137d | 2009-05-17 19:07:21 +0900 | [diff] [blame] | 246 | extern void nilfs_dispose_segment_list(struct list_head *); | 
| Ryusuke Konishi | 9ff0512 | 2009-04-06 19:01:37 -0700 | [diff] [blame] | 247 |  | 
|  | 248 | #endif /* _NILFS_SEGMENT_H */ |