mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 11:46:19 +00:00
nilfs2: fix wrong accounting and duplicate brelse in nilfs_sufile_set_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>
This commit is contained in:
parent
3efb55b496
commit
88072faf9a
1 changed files with 10 additions and 7 deletions
|
@ -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",
|
||||
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue