aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nilfs2/segbuf.c
diff options
context:
space:
mode:
authorRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>2009-04-06 22:01:58 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-04-07 11:31:20 -0400
commitcece552074c591970353ad48308d65f110aeaf28 (patch)
tree2dcca7913d38df89711504f5daeecccfedb5a3eb /fs/nilfs2/segbuf.c
parentc96fa464a567a2a8796009af0e79bc68af73f485 (diff)
nilfs2: simplify handling of active state of segments
will reduce some lines of segment constructor. Previously, the state was complexly controlled through a list of segments in order to keep consistency in meta data of usage state of segments. Instead, this presents ``calculated'' active flags to userland cleaner program and stop maintaining its real flag on disk. Only by this fake flag, the cleaner cannot exactly know if each segment is reclaimable or not. However, the recent extension of nilfs_sustat ioctl struct (nilfs2-extend-nilfs_sustat-ioctl-struct.patch) can prevent the cleaner from reclaiming in-use segment wrongly. So, now I can apply this for simplification. 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/segbuf.c')
-rw-r--r--fs/nilfs2/segbuf.c24
1 files changed, 1 insertions, 23 deletions
diff --git a/fs/nilfs2/segbuf.c b/fs/nilfs2/segbuf.c
index 3d3ea8351f6d..1e68821b4a9b 100644
--- a/fs/nilfs2/segbuf.c
+++ b/fs/nilfs2/segbuf.c
@@ -64,27 +64,17 @@ struct nilfs_segment_buffer *nilfs_segbuf_new(struct super_block *sb)
64 INIT_LIST_HEAD(&segbuf->sb_list); 64 INIT_LIST_HEAD(&segbuf->sb_list);
65 INIT_LIST_HEAD(&segbuf->sb_segsum_buffers); 65 INIT_LIST_HEAD(&segbuf->sb_segsum_buffers);
66 INIT_LIST_HEAD(&segbuf->sb_payload_buffers); 66 INIT_LIST_HEAD(&segbuf->sb_payload_buffers);
67 segbuf->sb_segent = NULL;
68 return segbuf; 67 return segbuf;
69} 68}
70 69
71void nilfs_segbuf_free(struct nilfs_segment_buffer *segbuf) 70void nilfs_segbuf_free(struct nilfs_segment_buffer *segbuf)
72{ 71{
73 struct nilfs_segment_entry *ent = segbuf->sb_segent;
74
75 if (ent != NULL && list_empty(&ent->list)) {
76 /* free isolated segment list head */
77 nilfs_free_segment_entry(segbuf->sb_segent);
78 segbuf->sb_segent = NULL;
79 }
80 kmem_cache_free(nilfs_segbuf_cachep, segbuf); 72 kmem_cache_free(nilfs_segbuf_cachep, segbuf);
81} 73}
82 74
83int nilfs_segbuf_map(struct nilfs_segment_buffer *segbuf, __u64 segnum, 75void nilfs_segbuf_map(struct nilfs_segment_buffer *segbuf, __u64 segnum,
84 unsigned long offset, struct the_nilfs *nilfs) 76 unsigned long offset, struct the_nilfs *nilfs)
85{ 77{
86 struct nilfs_segment_entry *ent;
87
88 segbuf->sb_segnum = segnum; 78 segbuf->sb_segnum = segnum;
89 nilfs_get_segment_range(nilfs, segnum, &segbuf->sb_fseg_start, 79 nilfs_get_segment_range(nilfs, segnum, &segbuf->sb_fseg_start,
90 &segbuf->sb_fseg_end); 80 &segbuf->sb_fseg_end);
@@ -92,18 +82,6 @@ int nilfs_segbuf_map(struct nilfs_segment_buffer *segbuf, __u64 segnum,
92 segbuf->sb_pseg_start = segbuf->sb_fseg_start + offset; 82 segbuf->sb_pseg_start = segbuf->sb_fseg_start + offset;
93 segbuf->sb_rest_blocks = 83 segbuf->sb_rest_blocks =
94 segbuf->sb_fseg_end - segbuf->sb_pseg_start + 1; 84 segbuf->sb_fseg_end - segbuf->sb_pseg_start + 1;
95
96 /* Attach a segment list head */
97 ent = segbuf->sb_segent;
98 if (ent == NULL) {
99 segbuf->sb_segent = nilfs_alloc_segment_entry(segnum);
100 if (unlikely(!segbuf->sb_segent))
101 return -ENOMEM;
102 } else {
103 BUG_ON(ent->bh_su || !list_empty(&ent->list));
104 ent->segnum = segnum;
105 }
106 return 0;
107} 85}
108 86
109void nilfs_segbuf_set_next_segnum(struct nilfs_segment_buffer *segbuf, 87void nilfs_segbuf_set_next_segnum(struct nilfs_segment_buffer *segbuf,