]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/f2fs/super.c
Merge tag 'tag-chrome-platform-for-v5.6' of git://git.kernel.org/pub/scm/linux/kernel...
[linux.git] / fs / f2fs / super.c
index 9d491f8fad4fd5d7841c68d367b3e4b6f17dd172..65a7a432dfee26f0df4354a3254782b1e090e28a 100644 (file)
@@ -1238,9 +1238,9 @@ int f2fs_sync_fs(struct super_block *sb, int sync)
 
                cpc.reason = __get_cp_reason(sbi);
 
-               mutex_lock(&sbi->gc_mutex);
+               down_write(&sbi->gc_lock);
                err = f2fs_write_checkpoint(sbi, &cpc);
-               mutex_unlock(&sbi->gc_mutex);
+               up_write(&sbi->gc_lock);
        }
        f2fs_trace_ios(NULL, 1);
 
@@ -1282,12 +1282,10 @@ static int f2fs_statfs_project(struct super_block *sb,
                return PTR_ERR(dquot);
        spin_lock(&dquot->dq_dqb_lock);
 
-       limit = 0;
-       if (dquot->dq_dqb.dqb_bsoftlimit)
-               limit = dquot->dq_dqb.dqb_bsoftlimit;
-       if (dquot->dq_dqb.dqb_bhardlimit &&
-                       (!limit || dquot->dq_dqb.dqb_bhardlimit < limit))
-               limit = dquot->dq_dqb.dqb_bhardlimit;
+       limit = min_not_zero(dquot->dq_dqb.dqb_bsoftlimit,
+                                       dquot->dq_dqb.dqb_bhardlimit);
+       if (limit)
+               limit >>= sb->s_blocksize_bits;
 
        if (limit && buf->f_blocks > limit) {
                curblock = dquot->dq_dqb.dqb_curspace >> sb->s_blocksize_bits;
@@ -1297,12 +1295,8 @@ static int f2fs_statfs_project(struct super_block *sb,
                         (buf->f_blocks - curblock) : 0;
        }
 
-       limit = 0;
-       if (dquot->dq_dqb.dqb_isoftlimit)
-               limit = dquot->dq_dqb.dqb_isoftlimit;
-       if (dquot->dq_dqb.dqb_ihardlimit &&
-                       (!limit || dquot->dq_dqb.dqb_ihardlimit < limit))
-               limit = dquot->dq_dqb.dqb_ihardlimit;
+       limit = min_not_zero(dquot->dq_dqb.dqb_isoftlimit,
+                                       dquot->dq_dqb.dqb_ihardlimit);
 
        if (limit && buf->f_files > limit) {
                buf->f_files = limit;
@@ -1627,7 +1621,7 @@ static int f2fs_disable_checkpoint(struct f2fs_sb_info *sbi)
        f2fs_update_time(sbi, DISABLE_TIME);
 
        while (!f2fs_time_over(sbi, DISABLE_TIME)) {
-               mutex_lock(&sbi->gc_mutex);
+               down_write(&sbi->gc_lock);
                err = f2fs_gc(sbi, true, false, NULL_SEGNO);
                if (err == -ENODATA) {
                        err = 0;
@@ -1649,7 +1643,7 @@ static int f2fs_disable_checkpoint(struct f2fs_sb_info *sbi)
                goto restore_flag;
        }
 
-       mutex_lock(&sbi->gc_mutex);
+       down_write(&sbi->gc_lock);
        cpc.reason = CP_PAUSE;
        set_sbi_flag(sbi, SBI_CP_DISABLED);
        err = f2fs_write_checkpoint(sbi, &cpc);
@@ -1661,7 +1655,7 @@ static int f2fs_disable_checkpoint(struct f2fs_sb_info *sbi)
        spin_unlock(&sbi->stat_lock);
 
 out_unlock:
-       mutex_unlock(&sbi->gc_mutex);
+       up_write(&sbi->gc_lock);
 restore_flag:
        sbi->sb->s_flags = s_flags;     /* Restore MS_RDONLY status */
        return err;
@@ -1669,12 +1663,12 @@ static int f2fs_disable_checkpoint(struct f2fs_sb_info *sbi)
 
 static void f2fs_enable_checkpoint(struct f2fs_sb_info *sbi)
 {
-       mutex_lock(&sbi->gc_mutex);
+       down_write(&sbi->gc_lock);
        f2fs_dirty_to_prefree(sbi);
 
        clear_sbi_flag(sbi, SBI_CP_DISABLED);
        set_sbi_flag(sbi, SBI_IS_DIRTY);
-       mutex_unlock(&sbi->gc_mutex);
+       up_write(&sbi->gc_lock);
 
        f2fs_sync_fs(sbi->sb, 1);
 }
@@ -3404,7 +3398,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
 
        /* init f2fs-specific super block info */
        sbi->valid_super_block = valid_super_block;
-       mutex_init(&sbi->gc_mutex);
+       init_rwsem(&sbi->gc_lock);
        mutex_init(&sbi->writepages);
        mutex_init(&sbi->cp_mutex);
        mutex_init(&sbi->resize_mutex);