This patch shrinks the critical region in spin_lock.

Signed-off-by: Jaegeuk Kim <[email protected]>
---
 fs/f2fs/f2fs.h | 23 ++++++++---------------
 1 file changed, 8 insertions(+), 15 deletions(-)

diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index a05f65b..a51f230 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -1156,30 +1156,23 @@ static inline void f2fs_i_blocks_write(struct inode *, 
blkcnt_t, bool);
 static inline bool inc_valid_block_count(struct f2fs_sb_info *sbi,
                                 struct inode *inode, blkcnt_t *count)
 {
-       block_t valid_block_count;
-
-       spin_lock(&sbi->stat_lock);
 #ifdef CONFIG_F2FS_FAULT_INJECTION
-       if (time_to_inject(FAULT_BLOCK)) {
-               spin_unlock(&sbi->stat_lock);
+       if (time_to_inject(FAULT_BLOCK))
                return false;
-       }
 #endif
-       valid_block_count =
-               sbi->total_valid_block_count + (block_t)(*count);
-       if (unlikely(valid_block_count > sbi->user_block_count)) {
-               *count = sbi->user_block_count - sbi->total_valid_block_count;
+       spin_lock(&sbi->stat_lock);
+       sbi->total_valid_block_count += (block_t)(*count);
+       if (unlikely(sbi->total_valid_block_count > sbi->user_block_count)) {
+               *count -= sbi->total_valid_block_count - sbi->user_block_count;
+               sbi->total_valid_block_count = sbi->user_block_count;
                if (!*count) {
                        spin_unlock(&sbi->stat_lock);
                        return false;
                }
        }
-       /* *count can be recalculated */
-       f2fs_i_blocks_write(inode, *count, true);
-       sbi->total_valid_block_count =
-               sbi->total_valid_block_count + (block_t)(*count);
        spin_unlock(&sbi->stat_lock);
 
+       f2fs_i_blocks_write(inode, *count, true);
        percpu_counter_add(&sbi->alloc_valid_block_count, (*count));
        return true;
 }
@@ -1191,9 +1184,9 @@ static inline void dec_valid_block_count(struct 
f2fs_sb_info *sbi,
        spin_lock(&sbi->stat_lock);
        f2fs_bug_on(sbi, sbi->total_valid_block_count < (block_t) count);
        f2fs_bug_on(sbi, inode->i_blocks < count);
-       f2fs_i_blocks_write(inode, count, false);
        sbi->total_valid_block_count -= (block_t)count;
        spin_unlock(&sbi->stat_lock);
+       f2fs_i_blocks_write(inode, count, false);
 }
 
 static inline void inc_page_count(struct f2fs_sb_info *sbi, int count_type)
-- 
2.8.3


------------------------------------------------------------------------------
Attend Shape: An AT&T Tech Expo July 15-16. Meet us at AT&T Park in San
Francisco, CA to explore cutting-edge tech and listen to tech luminaries
present their vision of the future. This family event has something for
everyone, including kids. Get more information and register today.
http://sdm.link/attshape
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to