f2fs: use rw_semaphore to protect SIT cache
[linux-2.6-block.git] / fs / f2fs / gc.c
index bfe6a8ccc3a0207d51e0f11878de931958b699c1..ff8f0012888d464cca5621c914b5b4e725710f8f 100644 (file)
@@ -267,16 +267,6 @@ static unsigned int get_cb_cost(struct f2fs_sb_info *sbi, unsigned int segno)
        return UINT_MAX - ((100 * (100 - u) * age) / (100 + u));
 }
 
-static unsigned int get_greedy_cost(struct f2fs_sb_info *sbi,
-                                               unsigned int segno)
-{
-       unsigned int valid_blocks =
-                       get_valid_blocks(sbi, segno, true);
-
-       return IS_DATASEG(get_seg_entry(sbi, segno)->type) ?
-                               valid_blocks * 2 : valid_blocks;
-}
-
 static inline unsigned int get_gc_cost(struct f2fs_sb_info *sbi,
                        unsigned int segno, struct victim_sel_policy *p)
 {
@@ -285,7 +275,7 @@ static inline unsigned int get_gc_cost(struct f2fs_sb_info *sbi,
 
        /* alloc_mode == LFS */
        if (p->gc_mode == GC_GREEDY)
-               return get_greedy_cost(sbi, segno);
+               return get_valid_blocks(sbi, segno, true);
        else
                return get_cb_cost(sbi, segno);
 }
@@ -466,10 +456,10 @@ static int check_valid_map(struct f2fs_sb_info *sbi,
        struct seg_entry *sentry;
        int ret;
 
-       mutex_lock(&sit_i->sentry_lock);
+       down_read(&sit_i->sentry_lock);
        sentry = get_seg_entry(sbi, segno);
        ret = f2fs_test_bit(offset, sentry->cur_valid_map);
-       mutex_unlock(&sit_i->sentry_lock);
+       up_read(&sit_i->sentry_lock);
        return ret;
 }
 
@@ -608,6 +598,7 @@ static void move_data_block(struct inode *inode, block_t bidx,
 {
        struct f2fs_io_info fio = {
                .sbi = F2FS_I_SB(inode),
+               .ino = inode->i_ino,
                .type = DATA,
                .temp = COLD,
                .op = REQ_OP_READ,
@@ -659,8 +650,8 @@ static void move_data_block(struct inode *inode, block_t bidx,
        allocate_data_block(fio.sbi, NULL, fio.old_blkaddr, &newaddr,
                                        &sum, CURSEG_COLD_DATA, NULL, false);
 
-       fio.encrypted_page = pagecache_get_page(META_MAPPING(fio.sbi), newaddr,
-                                       FGP_LOCK | FGP_CREAT, GFP_NOFS);
+       fio.encrypted_page = f2fs_pagecache_get_page(META_MAPPING(fio.sbi),
+                               newaddr, FGP_LOCK | FGP_CREAT, GFP_NOFS);
        if (!fio.encrypted_page) {
                err = -ENOMEM;
                goto recover_block;
@@ -738,6 +729,7 @@ static void move_data_page(struct inode *inode, block_t bidx, int gc_type,
        } else {
                struct f2fs_io_info fio = {
                        .sbi = F2FS_I_SB(inode),
+                       .ino = inode->i_ino,
                        .type = DATA,
                        .temp = COLD,
                        .op = REQ_OP_WRITE,
@@ -901,10 +893,10 @@ static int __get_victim(struct f2fs_sb_info *sbi, unsigned int *victim,
        struct sit_info *sit_i = SIT_I(sbi);
        int ret;
 
-       mutex_lock(&sit_i->sentry_lock);
+       down_write(&sit_i->sentry_lock);
        ret = DIRTY_I(sbi)->v_ops->get_victim(sbi, victim, gc_type,
                                              NO_CHECK_TYPE, LFS);
-       mutex_unlock(&sit_i->sentry_lock);
+       up_write(&sit_i->sentry_lock);
        return ret;
 }
 
@@ -952,8 +944,8 @@ static int do_garbage_collect(struct f2fs_sb_info *sbi,
                /*
                 * this is to avoid deadlock:
                 * - lock_page(sum_page)         - f2fs_replace_block
-                *  - check_valid_map()            - mutex_lock(sentry_lock)
-                *   - mutex_lock(sentry_lock)     - change_curseg()
+                *  - check_valid_map()            - down_write(sentry_lock)
+                *   - down_read(sentry_lock)     - change_curseg()
                 *                                  - lock_page(sum_page)
                 */
                if (type == SUM_TYPE_NODE)