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