nilfs2: fix nilfs_sufile_mark_dirty() not set segment usage as dirty
[sfrench/cifs-2.6.git] / fs / nilfs2 / sufile.c
index 77ff8e95421fa86b3b3a0b0afa1b89936717db91..dc359b56fdfac4e83c60f20b71f0490d55b7189c 100644 (file)
@@ -495,14 +495,22 @@ void nilfs_sufile_do_free(struct inode *sufile, __u64 segnum,
 int nilfs_sufile_mark_dirty(struct inode *sufile, __u64 segnum)
 {
        struct buffer_head *bh;
+       void *kaddr;
+       struct nilfs_segment_usage *su;
        int ret;
 
+       down_write(&NILFS_MDT(sufile)->mi_sem);
        ret = nilfs_sufile_get_segment_usage_block(sufile, segnum, 0, &bh);
        if (!ret) {
                mark_buffer_dirty(bh);
                nilfs_mdt_mark_dirty(sufile);
+               kaddr = kmap_atomic(bh->b_page);
+               su = nilfs_sufile_block_get_segment_usage(sufile, segnum, bh, kaddr);
+               nilfs_segment_usage_set_dirty(su);
+               kunmap_atomic(kaddr);
                brelse(bh);
        }
+       up_write(&NILFS_MDT(sufile)->mi_sem);
        return ret;
 }