Skip to content

Commit

Permalink
nilfs2: fix wrong accounting and duplicate brelse in nilfs_sufile_set…
Browse files Browse the repository at this point in the history
…_error

The nilfs_sufile_set_error() function wrongly adjusts the number of
dirty segments instead of the number of clean segments.  In addition,
the function calls brelse() twice for the same buffer head.

This fixes these bugs.

Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
  • Loading branch information
konis committed Apr 13, 2009
1 parent 3efb55b commit 88072fa
Showing 1 changed file with 10 additions and 7 deletions.
17 changes: 10 additions & 7 deletions fs/nilfs2/sufile.c
Original file line number Diff line number Diff line change
Expand Up @@ -523,7 +523,7 @@ int nilfs_sufile_set_error(struct inode *sufile, __u64 segnum)
struct nilfs_segment_usage *su;
struct nilfs_sufile_header *header;
void *kaddr;
int ret;
int suclean, ret;

if (unlikely(segnum >= nilfs_sufile_get_nsegments(sufile))) {
printk(KERN_WARNING "%s: invalid segment number: %llu\n",
Expand All @@ -546,16 +546,19 @@ int nilfs_sufile_set_error(struct inode *sufile, __u64 segnum)
brelse(su_bh);
goto out_header;
}
suclean = nilfs_segment_usage_clean(su);

nilfs_segment_usage_set_error(su);
kunmap_atomic(kaddr, KM_USER0);
brelse(su_bh);

kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
header = nilfs_sufile_block_get_header(sufile, header_bh, kaddr);
le64_add_cpu(&header->sh_ndirtysegs, -1);
kunmap_atomic(kaddr, KM_USER0);
nilfs_mdt_mark_buffer_dirty(header_bh);
if (suclean) {
kaddr = kmap_atomic(header_bh->b_page, KM_USER0);
header = nilfs_sufile_block_get_header(sufile, header_bh,
kaddr);
le64_add_cpu(&header->sh_ncleansegs, -1);
kunmap_atomic(kaddr, KM_USER0);
nilfs_mdt_mark_buffer_dirty(header_bh);
}
nilfs_mdt_mark_buffer_dirty(su_bh);
nilfs_mdt_mark_dirty(sufile);
brelse(su_bh);
Expand Down

0 comments on commit 88072fa

Please sign in to comment.