]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/f2fs/gc.c
Merge tag 'kgdb-5.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/danielt/linux
[linux.git] / fs / f2fs / gc.c
index b3d3996232901090d7d50eb908c940575a5c693b..db8725d473b52c285e1522d6379e5c271ea23359 100644 (file)
@@ -78,18 +78,18 @@ static int gc_thread_func(void *data)
                 */
                if (sbi->gc_mode == GC_URGENT) {
                        wait_ms = gc_th->urgent_sleep_time;
-                       mutex_lock(&sbi->gc_mutex);
+                       down_write(&sbi->gc_lock);
                        goto do_gc;
                }
 
-               if (!mutex_trylock(&sbi->gc_mutex)) {
+               if (!down_write_trylock(&sbi->gc_lock)) {
                        stat_other_skip_bggc_count(sbi);
                        goto next;
                }
 
                if (!is_idle(sbi, GC_TIME)) {
                        increase_sleep_time(gc_th, &wait_ms);
-                       mutex_unlock(&sbi->gc_mutex);
+                       up_write(&sbi->gc_lock);
                        stat_io_skip_bggc_count(sbi);
                        goto next;
                }
@@ -99,7 +99,7 @@ static int gc_thread_func(void *data)
                else
                        increase_sleep_time(gc_th, &wait_ms);
 do_gc:
-               stat_inc_bggc_count(sbi);
+               stat_inc_bggc_count(sbi->stat_info);
 
                /* if return value is not zero, no victim was selected */
                if (f2fs_gc(sbi, test_opt(sbi, FORCE_FG_GC), true, NULL_SEGNO))
@@ -1049,8 +1049,10 @@ static int gc_data_segment(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
 
                if (phase == 3) {
                        inode = f2fs_iget(sb, dni.ino);
-                       if (IS_ERR(inode) || is_bad_inode(inode))
+                       if (IS_ERR(inode) || is_bad_inode(inode)) {
+                               set_sbi_flag(sbi, SBI_NEED_FSCK);
                                continue;
+                       }
 
                        if (!down_write_trylock(
                                &F2FS_I(inode)->i_gc_rwsem[WRITE])) {
@@ -1368,7 +1370,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync,
                                reserved_segments(sbi),
                                prefree_segments(sbi));
 
-       mutex_unlock(&sbi->gc_mutex);
+       up_write(&sbi->gc_lock);
 
        put_gc_inode(&gc_list);
 
@@ -1407,9 +1409,9 @@ static int free_segment_range(struct f2fs_sb_info *sbi, unsigned int start,
                        .iroot = RADIX_TREE_INIT(gc_list.iroot, GFP_NOFS),
                };
 
-               mutex_lock(&sbi->gc_mutex);
+               down_write(&sbi->gc_lock);
                do_garbage_collect(sbi, segno, &gc_list, FG_GC);
-               mutex_unlock(&sbi->gc_mutex);
+               up_write(&sbi->gc_lock);
                put_gc_inode(&gc_list);
 
                if (get_valid_blocks(sbi, segno, true))