Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
[pandora-kernel.git] / fs / nilfs2 / segment.c
index 91dc066..687d090 100644 (file)
@@ -191,6 +191,8 @@ int nilfs_transaction_begin(struct super_block *sb,
        if (ret > 0)
                return 0;
 
+       vfs_check_frozen(sb, SB_FREEZE_WRITE);
+
        sbi = NILFS_SB(sb);
        nilfs = sbi->s_nilfs;
        down_read(&nilfs->ns_segctor_sem);
@@ -1607,7 +1609,7 @@ nilfs_copy_replace_page_buffers(struct page *page, struct list_head *out)
        kunmap_atomic(kaddr, KM_USER0);
 
        if (!TestSetPageWriteback(clone_page))
-               inc_zone_page_state(clone_page, NR_WRITEBACK);
+               account_page_writeback(clone_page);
        unlock_page(clone_page);
 
        return 0;
@@ -1945,11 +1947,9 @@ static void nilfs_segctor_complete_write(struct nilfs_sc_info *sci)
 
        nilfs_drop_collected_inodes(&sci->sc_dirty_files);
 
-       if (nilfs_doing_gc()) {
+       if (nilfs_doing_gc())
                nilfs_drop_collected_inodes(&sci->sc_gc_inodes);
-               if (update_sr)
-                       nilfs_commit_gcdat_inode(nilfs);
-       } else
+       else
                nilfs->ns_nongc_ctime = sci->sc_seg_ctime;
 
        sci->sc_nblk_inc += sci->sc_nblk_this_inc;
@@ -2472,13 +2472,15 @@ int nilfs_clean_segments(struct super_block *sb, struct nilfs_argv *argv,
 
        nilfs_transaction_lock(sbi, &ti, 1);
 
-       err = nilfs_init_gcdat_inode(nilfs);
+       err = nilfs_mdt_save_to_shadow_map(nilfs->ns_dat);
        if (unlikely(err))
                goto out_unlock;
 
        err = nilfs_ioctl_prepare_clean_segments(nilfs, argv, kbufs);
-       if (unlikely(err))
+       if (unlikely(err)) {
+               nilfs_mdt_restore_from_shadow_map(nilfs->ns_dat);
                goto out_unlock;
+       }
 
        sci->sc_freesegs = kbufs[4];
        sci->sc_nfreesegs = argv[4].v_nmembs;
@@ -2510,7 +2512,7 @@ int nilfs_clean_segments(struct super_block *sb, struct nilfs_argv *argv,
  out_unlock:
        sci->sc_freesegs = NULL;
        sci->sc_nfreesegs = 0;
-       nilfs_clear_gcdat_inode(nilfs);
+       nilfs_mdt_clear_shadow_map(nilfs->ns_dat);
        nilfs_transaction_unlock(sbi);
        return err;
 }
@@ -2672,6 +2674,8 @@ static int nilfs_segctor_start_thread(struct nilfs_sc_info *sci)
 }
 
 static void nilfs_segctor_kill_thread(struct nilfs_sc_info *sci)
+       __acquires(&sci->sc_state_lock)
+       __releases(&sci->sc_state_lock)
 {
        sci->sc_state |= NILFS_SEGCTOR_QUIT;
 
@@ -2799,7 +2803,6 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci)
 int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi,
                                     struct nilfs_root *root)
 {
-       struct the_nilfs *nilfs = sbi->s_nilfs;
        int err;
 
        if (NILFS_SC(sbi)) {
@@ -2815,10 +2818,8 @@ int nilfs_attach_segment_constructor(struct nilfs_sb_info *sbi,
        if (!sbi->s_sc_info)
                return -ENOMEM;
 
-       nilfs_attach_writer(nilfs, sbi);
        err = nilfs_segctor_start_thread(NILFS_SC(sbi));
        if (err) {
-               nilfs_detach_writer(nilfs, sbi);
                kfree(sbi->s_sc_info);
                sbi->s_sc_info = NULL;
        }
@@ -2855,5 +2856,4 @@ void nilfs_detach_segment_constructor(struct nilfs_sb_info *sbi)
        up_write(&nilfs->ns_segctor_sem);
 
        nilfs_dispose_list(sbi, &garbage_list, 1);
-       nilfs_detach_writer(nilfs, sbi);
 }