Blame view

fs/nilfs2/segbuf.h 5.96 KB
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /*
   * segbuf.h - NILFS Segment buffer 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.
   *
4b420ab4e   Ryusuke Konishi   nilfs2: clean up ...
16
   * Written by Ryusuke Konishi.
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
17
18
19
20
21
22
23
24
25
   *
   */
  #ifndef _NILFS_SEGBUF_H
  #define _NILFS_SEGBUF_H
  
  #include <linux/fs.h>
  #include <linux/buffer_head.h>
  #include <linux/bio.h>
  #include <linux/completion.h>
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
26
27
28
29
30
31
32
33
34
35
  
  /**
   * struct nilfs_segsum_info - On-memory segment summary
   * @flags: Flags
   * @nfinfo: Number of file information structures
   * @nblocks: Number of blocks included in the partial segment
   * @nsumblk: Number of summary blocks
   * @sumbytes: Byte count of segment summary
   * @nfileblk: Total number of file blocks
   * @seg_seq: Segment sequence number
50614bcf2   Ryusuke Konishi   nilfs2: insert ch...
36
   * @cno: Checkpoint number
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
37
38
39
40
41
42
43
44
45
46
47
   * @ctime: Creation time
   * @next: Block number of the next full segment
   */
  struct nilfs_segsum_info {
  	unsigned int		flags;
  	unsigned long		nfinfo;
  	unsigned long		nblocks;
  	unsigned long		nsumblk;
  	unsigned long		sumbytes;
  	unsigned long		nfileblk;
  	u64			seg_seq;
50614bcf2   Ryusuke Konishi   nilfs2: insert ch...
48
  	__u64			cno;
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
49
50
51
  	time_t			ctime;
  	sector_t		next;
  };
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
52
53
54
55
  /**
   * struct nilfs_segment_buffer - Segment buffer
   * @sb_super: back pointer to a superblock struct
   * @sb_list: List head to chain this structure
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
56
57
58
59
60
61
62
63
64
   * @sb_sum: On-memory segment summary
   * @sb_segnum: Index number of the full segment
   * @sb_nextnum: Index number of the next full segment
   * @sb_fseg_start: Start block number of the full segment
   * @sb_fseg_end: End block number of the full segment
   * @sb_pseg_start: Disk block number of partial segment
   * @sb_rest_blocks: Number of residual blocks in the current segment
   * @sb_segsum_buffers: List of buffers for segment summaries
   * @sb_payload_buffers: List of buffers for segment payload
1e2b68bf2   Ryusuke Konishi   nilfs2: move poin...
65
   * @sb_super_root: Pointer to buffer storing a super root block (if exists)
9284ad2a9   Ryusuke Konishi   nilfs2: relocate ...
66
67
68
   * @sb_nbio: Number of flying bio requests
   * @sb_err: I/O error status
   * @sb_bio_event: Completion event of log writing
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
69
70
71
72
   */
  struct nilfs_segment_buffer {
  	struct super_block     *sb_super;
  	struct list_head	sb_list;
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
73
74
75
76
77
78
79
  
  	/* Segment information */
  	struct nilfs_segsum_info sb_sum;
  	__u64			sb_segnum;
  	__u64			sb_nextnum;
  	sector_t		sb_fseg_start, sb_fseg_end;
  	sector_t		sb_pseg_start;
0c6c44cb9   Ryusuke Konishi   nilfs2: avoid bar...
80
  	unsigned int		sb_rest_blocks;
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
81
82
83
84
  
  	/* Buffers */
  	struct list_head	sb_segsum_buffers;
  	struct list_head	sb_payload_buffers; /* including super root */
1e2b68bf2   Ryusuke Konishi   nilfs2: move poin...
85
  	struct buffer_head     *sb_super_root;
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
86
87
  
  	/* io status */
9284ad2a9   Ryusuke Konishi   nilfs2: relocate ...
88
89
90
  	int			sb_nbio;
  	atomic_t		sb_err;
  	struct completion	sb_bio_event;
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
  };
  
  #define NILFS_LIST_SEGBUF(head)  \
  	list_entry((head), struct nilfs_segment_buffer, sb_list)
  #define NILFS_NEXT_SEGBUF(segbuf)  NILFS_LIST_SEGBUF((segbuf)->sb_list.next)
  #define NILFS_PREV_SEGBUF(segbuf)  NILFS_LIST_SEGBUF((segbuf)->sb_list.prev)
  #define NILFS_LAST_SEGBUF(head)    NILFS_LIST_SEGBUF((head)->prev)
  #define NILFS_FIRST_SEGBUF(head)   NILFS_LIST_SEGBUF((head)->next)
  #define NILFS_SEGBUF_IS_LAST(segbuf, head)  ((segbuf)->sb_list.next == (head))
  
  #define nilfs_for_each_segbuf_before(s, t, h) \
  	for ((s) = NILFS_FIRST_SEGBUF(h); (s) != (t); \
  	     (s) = NILFS_NEXT_SEGBUF(s))
  
  #define NILFS_SEGBUF_FIRST_BH(head)  \
  	(list_entry((head)->next, struct buffer_head, b_assoc_buffers))
  #define NILFS_SEGBUF_NEXT_BH(bh)  \
  	(list_entry((bh)->b_assoc_buffers.next, struct buffer_head, \
  		    b_assoc_buffers))
  #define NILFS_SEGBUF_BH_IS_LAST(bh, head)  ((bh)->b_assoc_buffers.next == head)
41c88bd74   Li Hong   nilfs2: cleanup m...
111
  extern struct kmem_cache *nilfs_segbuf_cachep;
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
112

64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
113
114
  struct nilfs_segment_buffer *nilfs_segbuf_new(struct super_block *);
  void nilfs_segbuf_free(struct nilfs_segment_buffer *);
cece55207   Ryusuke Konishi   nilfs2: simplify ...
115
116
  void nilfs_segbuf_map(struct nilfs_segment_buffer *, __u64, unsigned long,
  		      struct the_nilfs *);
a694291a6   Ryusuke Konishi   nilfs2: separate ...
117
118
  void nilfs_segbuf_map_cont(struct nilfs_segment_buffer *segbuf,
  			   struct nilfs_segment_buffer *prev);
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
119
120
  void nilfs_segbuf_set_next_segnum(struct nilfs_segment_buffer *, __u64,
  				  struct the_nilfs *);
0c6c44cb9   Ryusuke Konishi   nilfs2: avoid bar...
121
122
  int nilfs_segbuf_reset(struct nilfs_segment_buffer *, unsigned int, time_t,
  		       __u64);
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
123
124
125
126
  int nilfs_segbuf_extend_segsum(struct nilfs_segment_buffer *);
  int nilfs_segbuf_extend_payload(struct nilfs_segment_buffer *,
  				struct buffer_head **);
  void nilfs_segbuf_fill_in_segsum(struct nilfs_segment_buffer *);
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
127

4762077c7   Ryusuke Konishi   nilfs2: get rid o...
128
129
130
131
132
133
134
135
136
137
138
139
  static inline int nilfs_segbuf_simplex(struct nilfs_segment_buffer *segbuf)
  {
  	unsigned int flags = segbuf->sb_sum.flags;
  
  	return (flags & (NILFS_SS_LOGBGN | NILFS_SS_LOGEND)) ==
  		(NILFS_SS_LOGBGN | NILFS_SS_LOGEND);
  }
  
  static inline int nilfs_segbuf_empty(struct nilfs_segment_buffer *segbuf)
  {
  	return segbuf->sb_sum.nblocks == segbuf->sb_sum.nsumblk;
  }
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
  static inline void
  nilfs_segbuf_add_segsum_buffer(struct nilfs_segment_buffer *segbuf,
  			       struct buffer_head *bh)
  {
  	list_add_tail(&bh->b_assoc_buffers, &segbuf->sb_segsum_buffers);
  	segbuf->sb_sum.nblocks++;
  	segbuf->sb_sum.nsumblk++;
  }
  
  static inline void
  nilfs_segbuf_add_payload_buffer(struct nilfs_segment_buffer *segbuf,
  				struct buffer_head *bh)
  {
  	list_add_tail(&bh->b_assoc_buffers, &segbuf->sb_payload_buffers);
  	segbuf->sb_sum.nblocks++;
  }
  
  static inline void
  nilfs_segbuf_add_file_buffer(struct nilfs_segment_buffer *segbuf,
  			     struct buffer_head *bh)
  {
  	get_bh(bh);
  	nilfs_segbuf_add_payload_buffer(segbuf, bh);
  	segbuf->sb_sum.nfileblk++;
  }
e29df395b   Ryusuke Konishi   nilfs2: add itera...
165
166
167
  void nilfs_clear_logs(struct list_head *logs);
  void nilfs_truncate_logs(struct list_head *logs,
  			 struct nilfs_segment_buffer *last);
d1c6b72a7   Ryusuke Konishi   nilfs2: move iter...
168
  int nilfs_write_logs(struct list_head *logs, struct the_nilfs *nilfs);
e29df395b   Ryusuke Konishi   nilfs2: add itera...
169
  int nilfs_wait_on_logs(struct list_head *logs);
aaed1d5bf   Ryusuke Konishi   nilfs2: move out ...
170
  void nilfs_add_checksums_on_logs(struct list_head *logs, u32 seed);
e29df395b   Ryusuke Konishi   nilfs2: add itera...
171
172
173
174
175
  
  static inline void nilfs_destroy_logs(struct list_head *logs)
  {
  	nilfs_truncate_logs(logs, NULL);
  }
64b5a32e0   Ryusuke Konishi   nilfs2: segment b...
176
  #endif /* _NILFS_SEGBUF_H */