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>

+10 -7
+10 -7
fs/nilfs2/sufile.c
··· 523 struct nilfs_segment_usage *su; 524 struct nilfs_sufile_header *header; 525 void *kaddr; 526 - int ret; 527 528 if (unlikely(segnum >= nilfs_sufile_get_nsegments(sufile))) { 529 printk(KERN_WARNING "%s: invalid segment number: %llu\n", ··· 546 brelse(su_bh); 547 goto out_header; 548 } 549 550 nilfs_segment_usage_set_error(su); 551 kunmap_atomic(kaddr, KM_USER0); 552 - brelse(su_bh); 553 554 - kaddr = kmap_atomic(header_bh->b_page, KM_USER0); 555 - header = nilfs_sufile_block_get_header(sufile, header_bh, kaddr); 556 - le64_add_cpu(&header->sh_ndirtysegs, -1); 557 - kunmap_atomic(kaddr, KM_USER0); 558 - nilfs_mdt_mark_buffer_dirty(header_bh); 559 nilfs_mdt_mark_buffer_dirty(su_bh); 560 nilfs_mdt_mark_dirty(sufile); 561 brelse(su_bh);
··· 523 struct nilfs_segment_usage *su; 524 struct nilfs_sufile_header *header; 525 void *kaddr; 526 + int suclean, ret; 527 528 if (unlikely(segnum >= nilfs_sufile_get_nsegments(sufile))) { 529 printk(KERN_WARNING "%s: invalid segment number: %llu\n", ··· 546 brelse(su_bh); 547 goto out_header; 548 } 549 + suclean = nilfs_segment_usage_clean(su); 550 551 nilfs_segment_usage_set_error(su); 552 kunmap_atomic(kaddr, KM_USER0); 553 554 + if (suclean) { 555 + kaddr = kmap_atomic(header_bh->b_page, KM_USER0); 556 + header = nilfs_sufile_block_get_header(sufile, header_bh, 557 + kaddr); 558 + le64_add_cpu(&header->sh_ncleansegs, -1); 559 + kunmap_atomic(kaddr, KM_USER0); 560 + nilfs_mdt_mark_buffer_dirty(header_bh); 561 + } 562 nilfs_mdt_mark_buffer_dirty(su_bh); 563 nilfs_mdt_mark_dirty(sufile); 564 brelse(su_bh);