segment.h 8.3 KB
Newer Older
R
Ryusuke Konishi 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * segment.h - NILFS Segment constructor prototypes and definitions
 *
 * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
16
 * Written by Ryusuke Konishi.
R
Ryusuke Konishi 已提交
17 18 19 20 21 22 23 24
 *
 */
#ifndef _NILFS_SEGMENT_H
#define _NILFS_SEGMENT_H

#include <linux/types.h>
#include <linux/fs.h>
#include <linux/buffer_head.h>
25
#include <linux/workqueue.h>
26
#include "nilfs.h"
R
Ryusuke Konishi 已提交
27

28 29
struct nilfs_root;

R
Ryusuke Konishi 已提交
30
/**
31
 * struct nilfs_recovery_info - Recovery information
R
Ryusuke Konishi 已提交
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
 * @ri_need_recovery: Recovery status
 * @ri_super_root: Block number of the last super root
 * @ri_ri_cno: Number of the last checkpoint
 * @ri_lsegs_start: Region for roll-forwarding (start block number)
 * @ri_lsegs_end: Region for roll-forwarding (end block number)
 * @ri_lseg_start_seq: Sequence value of the segment at ri_lsegs_start
 * @ri_used_segments: List of segments to be mark active
 * @ri_pseg_start: Block number of the last partial segment
 * @ri_seq: Sequence number on the last partial segment
 * @ri_segnum: Segment number on the last partial segment
 * @ri_nextnum: Next segment number on the last partial segment
 */
struct nilfs_recovery_info {
	int			ri_need_recovery;
	sector_t		ri_super_root;
	__u64			ri_cno;

	sector_t		ri_lsegs_start;
	sector_t		ri_lsegs_end;
	u64			ri_lsegs_start_seq;
	struct list_head	ri_used_segments;
	sector_t		ri_pseg_start;
	u64			ri_seq;
	__u64			ri_segnum;
	__u64			ri_nextnum;
};

/* ri_need_recovery */
#define NILFS_RECOVERY_SR_UPDATED	 1  /* The super root was updated */
#define NILFS_RECOVERY_ROLLFORWARD_DONE	 2  /* Rollforward was carried out */

/**
 * struct nilfs_cstage - Context of collection stage
65 66
 * @scnt: Stage count, must be accessed via wrappers:
 *        nilfs_sc_cstage_inc(), nilfs_sc_cstage_set(), nilfs_sc_cstage_get()
R
Ryusuke Konishi 已提交
67 68 69 70 71 72
 * @flags: State flags
 * @dirty_file_ptr: Pointer on dirty_files list, or inode of a target file
 * @gc_inode_ptr: Pointer on the list of gc-inodes
 */
struct nilfs_cstage {
	int			scnt;
73
	unsigned int		flags;
R
Ryusuke Konishi 已提交
74 75 76 77 78 79 80 81
	struct nilfs_inode_info *dirty_file_ptr;
	struct nilfs_inode_info *gc_inode_ptr;
};

struct nilfs_segment_buffer;

struct nilfs_segsum_pointer {
	struct buffer_head     *bh;
82
	unsigned int		offset; /* offset in bytes */
R
Ryusuke Konishi 已提交
83 84 85 86 87
};

/**
 * struct nilfs_sc_info - Segment constructor information
 * @sc_super: Back pointer to super_block struct
88
 * @sc_root: root object of the current filesystem tree
R
Ryusuke Konishi 已提交
89 90 91
 * @sc_nblk_inc: Block count of current generation
 * @sc_dirty_files: List of files to be written
 * @sc_gc_inodes: List of GC inodes having blocks to be written
92 93
 * @sc_iput_queue: list of inodes for which iput should be done
 * @sc_iput_work: work struct to defer iput call
94 95
 * @sc_freesegs: array of segment numbers to be freed
 * @sc_nfreesegs: number of segments on @sc_freesegs
96 97 98
 * @sc_dsync_inode: inode whose data pages are written for a sync operation
 * @sc_dsync_start: start byte offset of data pages
 * @sc_dsync_end: end byte offset of data pages (inclusive)
R
Ryusuke Konishi 已提交
99
 * @sc_segbufs: List of segment buffers
100
 * @sc_write_logs: List of segment buffers to hold logs under writing
R
Ryusuke Konishi 已提交
101 102 103 104 105 106 107 108 109
 * @sc_segbuf_nblocks: Number of available blocks in segment buffers.
 * @sc_curseg: Current segment buffer
 * @sc_stage: Collection stage
 * @sc_finfo_ptr: pointer to the current finfo struct in the segment summary
 * @sc_binfo_ptr: pointer to the current binfo struct in the segment summary
 * @sc_blk_cnt:	Block count of a file
 * @sc_datablk_cnt: Data block count of a file
 * @sc_nblk_this_inc: Number of blocks included in the current logical segment
 * @sc_seg_ctime: Creation time
110
 * @sc_cno: checkpoint number of current log
R
Ryusuke Konishi 已提交
111 112 113 114 115 116 117 118
 * @sc_flags: Internal flags
 * @sc_state_lock: spinlock for sc_state and so on
 * @sc_state: Segctord state flags
 * @sc_flush_request: inode bitmap of metadata files to be flushed
 * @sc_wait_request: Client request queue
 * @sc_wait_daemon: Daemon wait queue
 * @sc_wait_task: Start/end wait queue to control segctord task
 * @sc_seq_request: Request counter
119
 * @sc_seq_accept: Accepted request count
R
Ryusuke Konishi 已提交
120 121 122 123 124 125 126 127 128 129 130
 * @sc_seq_done: Completion counter
 * @sc_sync: Request of explicit sync operation
 * @sc_interval: Timeout value of background construction
 * @sc_mjcp_freq: Frequency of creating checkpoints
 * @sc_lseg_stime: Start time of the latest logical segment
 * @sc_watermark: Watermark for the number of dirty buffers
 * @sc_timer: Timer for segctord
 * @sc_task: current thread of segctord
 */
struct nilfs_sc_info {
	struct super_block     *sc_super;
131
	struct nilfs_root      *sc_root;
R
Ryusuke Konishi 已提交
132 133 134 135 136

	unsigned long		sc_nblk_inc;

	struct list_head	sc_dirty_files;
	struct list_head	sc_gc_inodes;
137 138
	struct list_head	sc_iput_queue;
	struct work_struct	sc_iput_work;
R
Ryusuke Konishi 已提交
139

140 141 142
	__u64		       *sc_freesegs;
	size_t			sc_nfreesegs;

143 144 145 146
	struct nilfs_inode_info *sc_dsync_inode;
	loff_t			sc_dsync_start;
	loff_t			sc_dsync_end;

R
Ryusuke Konishi 已提交
147 148
	/* Segment buffers */
	struct list_head	sc_segbufs;
149
	struct list_head	sc_write_logs;
R
Ryusuke Konishi 已提交
150 151 152 153 154 155 156 157 158 159 160
	unsigned long		sc_segbuf_nblocks;
	struct nilfs_segment_buffer *sc_curseg;

	struct nilfs_cstage	sc_stage;

	struct nilfs_segsum_pointer sc_finfo_ptr;
	struct nilfs_segsum_pointer sc_binfo_ptr;
	unsigned long		sc_blk_cnt;
	unsigned long		sc_datablk_cnt;
	unsigned long		sc_nblk_this_inc;
	time_t			sc_seg_ctime;
161
	__u64			sc_cno;
R
Ryusuke Konishi 已提交
162 163 164 165 166 167 168 169 170 171 172
	unsigned long		sc_flags;

	spinlock_t		sc_state_lock;
	unsigned long		sc_state;
	unsigned long		sc_flush_request;

	wait_queue_head_t	sc_wait_request;
	wait_queue_head_t	sc_wait_daemon;
	wait_queue_head_t	sc_wait_task;

	__u32			sc_seq_request;
173
	__u32			sc_seq_accepted;
R
Ryusuke Konishi 已提交
174 175 176 177 178 179 180 181
	__u32			sc_seq_done;

	int			sc_sync;
	unsigned long		sc_interval;
	unsigned long		sc_mjcp_freq;
	unsigned long		sc_lseg_stime;	/* in 1/HZ seconds */
	unsigned long		sc_watermark;

182
	struct timer_list	sc_timer;
183
	struct task_struct     *sc_timer_task;
R
Ryusuke Konishi 已提交
184 185 186 187 188 189 190 191
	struct task_struct     *sc_task;
};

/* sc_flags */
enum {
	NILFS_SC_DIRTY,		/* One or more dirty meta-data blocks exist */
	NILFS_SC_UNCLOSED,	/* Logical segment is not closed */
	NILFS_SC_SUPER_ROOT,	/* The latest segment has a super root */
R
Ryusuke Konishi 已提交
192 193 194 195 196 197 198 199 200
	NILFS_SC_PRIOR_FLUSH,	/*
				 * Requesting immediate flush without making a
				 * checkpoint
				 */
	NILFS_SC_HAVE_DELTA,	/*
				 * Next checkpoint will have update of files
				 * other than DAT, cpfile, sufile, or files
				 * moved by GC.
				 */
R
Ryusuke Konishi 已提交
201 202 203 204 205 206 207 208 209
};

/* sc_state */
#define NILFS_SEGCTOR_QUIT	    0x0001  /* segctord is being destroyed */
#define NILFS_SEGCTOR_COMMIT	    0x0004  /* committed transaction exists */

/*
 * Constant parameters
 */
R
Ryusuke Konishi 已提交
210 211 212 213
#define NILFS_SC_CLEANUP_RETRY	    3  /*
					* Retry count of construction when
					* destroying segctord
					*/
R
Ryusuke Konishi 已提交
214 215 216 217

/*
 * Default values of timeout, in seconds.
 */
R
Ryusuke Konishi 已提交
218 219 220 221 222 223 224 225 226
#define NILFS_SC_DEFAULT_TIMEOUT    5   /*
					 * Timeout value of dirty blocks.
					 * It triggers construction of a
					 * logical segment with a super root.
					 */
#define NILFS_SC_DEFAULT_SR_FREQ    30  /*
					 * Maximum frequency of super root
					 * creation
					 */
R
Ryusuke Konishi 已提交
227 228 229 230 231 232

/*
 * The default threshold amount of data, in block counts.
 */
#define NILFS_SC_DEFAULT_WATERMARK  3600

233 234
/* super.c */
extern struct kmem_cache *nilfs_transaction_cachep;
R
Ryusuke Konishi 已提交
235 236 237 238 239

/* segment.c */
extern void nilfs_relax_pressure_in_lock(struct super_block *);

extern int nilfs_construct_segment(struct super_block *);
240 241
extern int nilfs_construct_dsync_segment(struct super_block *, struct inode *,
					 loff_t, loff_t);
R
Ryusuke Konishi 已提交
242
extern void nilfs_flush_segment(struct super_block *, ino_t);
243 244
extern int nilfs_clean_segments(struct super_block *, struct nilfs_argv *,
				void **);
R
Ryusuke Konishi 已提交
245

246 247
int nilfs_attach_log_writer(struct super_block *sb, struct nilfs_root *root);
void nilfs_detach_log_writer(struct super_block *sb);
R
Ryusuke Konishi 已提交
248 249

/* recovery.c */
250
extern int nilfs_read_super_root_block(struct the_nilfs *, sector_t,
R
Ryusuke Konishi 已提交
251
				       struct buffer_head **, int);
252
extern int nilfs_search_super_root(struct the_nilfs *,
R
Ryusuke Konishi 已提交
253
				   struct nilfs_recovery_info *);
254 255
int nilfs_salvage_orphan_logs(struct the_nilfs *nilfs, struct super_block *sb,
			      struct nilfs_recovery_info *ri);
256
extern void nilfs_dispose_segment_list(struct list_head *);
R
Ryusuke Konishi 已提交
257 258

#endif /* _NILFS_SEGMENT_H */