]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/f2fs/checkpoint.c
f2fs: introduce NODE_MAPPING for code consistency
[karo-tx-linux.git] / fs / f2fs / checkpoint.c
index 2fc3b6beaeb8b7ddeb8ddb48edd7f3445b8be75e..293d0486a40f7e8560b25d012a7a2398ef4e955c 100644 (file)
@@ -30,7 +30,7 @@ static struct kmem_cache *inode_entry_slab;
  */
 struct page *grab_meta_page(struct f2fs_sb_info *sbi, pgoff_t index)
 {
-       struct address_space *mapping = sbi->meta_inode->i_mapping;
+       struct address_space *mapping = META_MAPPING(sbi);
        struct page *page = NULL;
 repeat:
        page = grab_cache_page(mapping, index);
@@ -50,7 +50,7 @@ repeat:
  */
 struct page *get_meta_page(struct f2fs_sb_info *sbi, pgoff_t index)
 {
-       struct address_space *mapping = sbi->meta_inode->i_mapping;
+       struct address_space *mapping = META_MAPPING(sbi);
        struct page *page;
 repeat:
        page = grab_cache_page(mapping, index);
@@ -128,7 +128,7 @@ static int f2fs_write_meta_pages(struct address_space *mapping,
 long sync_meta_pages(struct f2fs_sb_info *sbi, enum page_type type,
                                                long nr_to_write)
 {
-       struct address_space *mapping = sbi->meta_inode->i_mapping;
+       struct address_space *mapping = META_MAPPING(sbi);
        pgoff_t index = 0, end = LONG_MAX;
        struct pagevec pvec;
        long nwritten = 0;
@@ -194,32 +194,24 @@ const struct address_space_operations f2fs_meta_aops = {
 
 int acquire_orphan_inode(struct f2fs_sb_info *sbi)
 {
-       unsigned int max_orphans;
        int err = 0;
 
-       /*
-        * considering 512 blocks in a segment 8 blocks are needed for cp
-        * and log segment summaries. Remaining blocks are used to keep
-        * orphan entries with the limitation one reserved segment
-        * for cp pack we can have max 1020*504 orphan entries
-        */
-       max_orphans = (sbi->blocks_per_seg - 2 - NR_CURSEG_TYPE)
-                               * F2FS_ORPHANS_PER_BLOCK;
-       mutex_lock(&sbi->orphan_inode_mutex);
-       if (unlikely(sbi->n_orphans >= max_orphans))
+       spin_lock(&sbi->orphan_inode_lock);
+       if (unlikely(sbi->n_orphans >= sbi->max_orphans))
                err = -ENOSPC;
        else
                sbi->n_orphans++;
-       mutex_unlock(&sbi->orphan_inode_mutex);
+       spin_unlock(&sbi->orphan_inode_lock);
+
        return err;
 }
 
 void release_orphan_inode(struct f2fs_sb_info *sbi)
 {
-       mutex_lock(&sbi->orphan_inode_mutex);
+       spin_lock(&sbi->orphan_inode_lock);
        f2fs_bug_on(sbi->n_orphans == 0);
        sbi->n_orphans--;
-       mutex_unlock(&sbi->orphan_inode_mutex);
+       spin_unlock(&sbi->orphan_inode_lock);
 }
 
 void add_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
@@ -227,27 +219,30 @@ void add_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
        struct list_head *head, *this;
        struct orphan_inode_entry *new = NULL, *orphan = NULL;
 
-       mutex_lock(&sbi->orphan_inode_mutex);
+       new = f2fs_kmem_cache_alloc(orphan_entry_slab, GFP_ATOMIC);
+       new->ino = ino;
+
+       spin_lock(&sbi->orphan_inode_lock);
        head = &sbi->orphan_inode_list;
        list_for_each(this, head) {
                orphan = list_entry(this, struct orphan_inode_entry, list);
-               if (orphan->ino == ino)
-                       goto out;
+               if (orphan->ino == ino) {
+                       spin_unlock(&sbi->orphan_inode_lock);
+                       kmem_cache_free(orphan_entry_slab, new);
+                       return;
+               }
+
                if (orphan->ino > ino)
                        break;
                orphan = NULL;
        }
 
-       new = f2fs_kmem_cache_alloc(orphan_entry_slab, GFP_ATOMIC);
-       new->ino = ino;
-
        /* add new_oentry into list which is sorted by inode number */
        if (orphan)
                list_add(&new->list, this->prev);
        else
                list_add_tail(&new->list, head);
-out:
-       mutex_unlock(&sbi->orphan_inode_mutex);
+       spin_unlock(&sbi->orphan_inode_lock);
 }
 
 void remove_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
@@ -255,7 +250,7 @@ void remove_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
        struct list_head *head;
        struct orphan_inode_entry *orphan;
 
-       mutex_lock(&sbi->orphan_inode_mutex);
+       spin_lock(&sbi->orphan_inode_lock);
        head = &sbi->orphan_inode_list;
        list_for_each_entry(orphan, head, list) {
                if (orphan->ino == ino) {
@@ -266,7 +261,7 @@ void remove_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
                        break;
                }
        }
-       mutex_unlock(&sbi->orphan_inode_mutex);
+       spin_unlock(&sbi->orphan_inode_lock);
 }
 
 static void recover_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
@@ -311,25 +306,29 @@ static void write_orphan_inodes(struct f2fs_sb_info *sbi, block_t start_blk)
 {
        struct list_head *head;
        struct f2fs_orphan_block *orphan_blk = NULL;
-       struct page *page = NULL;
        unsigned int nentries = 0;
-       unsigned short index = 1;
-       unsigned short orphan_blocks;
+       unsigned short index;
+       unsigned short orphan_blocks = (unsigned short)((sbi->n_orphans +
+               (F2FS_ORPHANS_PER_BLOCK - 1)) / F2FS_ORPHANS_PER_BLOCK);
+       struct page *page = NULL;
        struct orphan_inode_entry *orphan = NULL;
 
-       orphan_blocks = (unsigned short)((sbi->n_orphans +
-               (F2FS_ORPHANS_PER_BLOCK - 1)) / F2FS_ORPHANS_PER_BLOCK);
+       for (index = 0; index < orphan_blocks; index++)
+               grab_meta_page(sbi, start_blk + index);
 
-       mutex_lock(&sbi->orphan_inode_mutex);
+       index = 1;
+       spin_lock(&sbi->orphan_inode_lock);
        head = &sbi->orphan_inode_list;
 
        /* loop for each orphan inode entry and write them in Jornal block */
        list_for_each_entry(orphan, head, list) {
                if (!page) {
-                       page = grab_meta_page(sbi, start_blk);
+                       page = find_get_page(META_MAPPING(sbi), start_blk++);
+                       f2fs_bug_on(!page);
                        orphan_blk =
                                (struct f2fs_orphan_block *)page_address(page);
                        memset(orphan_blk, 0, sizeof(*orphan_blk));
+                       f2fs_put_page(page, 0);
                }
 
                orphan_blk->ino[nentries++] = cpu_to_le32(orphan->ino);
@@ -346,7 +345,6 @@ static void write_orphan_inodes(struct f2fs_sb_info *sbi, block_t start_blk)
                        set_page_dirty(page);
                        f2fs_put_page(page, 1);
                        index++;
-                       start_blk++;
                        nentries = 0;
                        page = NULL;
                }
@@ -360,7 +358,7 @@ static void write_orphan_inodes(struct f2fs_sb_info *sbi, block_t start_blk)
                f2fs_put_page(page, 1);
        }
 
-       mutex_unlock(&sbi->orphan_inode_mutex);
+       spin_unlock(&sbi->orphan_inode_lock);
 }
 
 static struct page *validate_checkpoint(struct f2fs_sb_info *sbi,
@@ -773,8 +771,8 @@ static void do_checkpoint(struct f2fs_sb_info *sbi, bool is_umount)
        /* wait for previous submitted node/meta pages writeback */
        wait_on_all_pages_writeback(sbi);
 
-       filemap_fdatawait_range(sbi->node_inode->i_mapping, 0, LONG_MAX);
-       filemap_fdatawait_range(sbi->meta_inode->i_mapping, 0, LONG_MAX);
+       filemap_fdatawait_range(NODE_MAPPING(sbi), 0, LONG_MAX);
+       filemap_fdatawait_range(META_MAPPING(sbi), 0, LONG_MAX);
 
        /* update user_block_counts */
        sbi->last_valid_block_count = sbi->total_valid_block_count;
@@ -831,9 +829,17 @@ void write_checkpoint(struct f2fs_sb_info *sbi, bool is_umount)
 
 void init_orphan_info(struct f2fs_sb_info *sbi)
 {
-       mutex_init(&sbi->orphan_inode_mutex);
+       spin_lock_init(&sbi->orphan_inode_lock);
        INIT_LIST_HEAD(&sbi->orphan_inode_list);
        sbi->n_orphans = 0;
+       /*
+        * considering 512 blocks in a segment 8 blocks are needed for cp
+        * and log segment summaries. Remaining blocks are used to keep
+        * orphan entries with the limitation one reserved segment
+        * for cp pack we can have max 1020*504 orphan entries
+        */
+       sbi->max_orphans = (sbi->blocks_per_seg - 2 - NR_CURSEG_TYPE)
+                               * F2FS_ORPHANS_PER_BLOCK;
 }
 
 int __init create_checkpoint_caches(void)