]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/f2fs/node.c
i2c: qcom-geni: Disable DMA processing on the Lenovo Yoga C630
[linux.git] / fs / f2fs / node.c
index a18b2a895771d9282a254dc2fff14ace550ce380..8b66bc4c004b6e345c21618e47b1e0f1b5f82724 100644 (file)
@@ -1524,7 +1524,8 @@ static int __write_node_page(struct page *page, bool atomic, bool *submitted,
        if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
                goto redirty_out;
 
-       if (wbc->sync_mode == WB_SYNC_NONE &&
+       if (!is_sbi_flag_set(sbi, SBI_CP_DISABLED) &&
+                       wbc->sync_mode == WB_SYNC_NONE &&
                        IS_DNODE(page) && is_cold_node(page))
                goto redirty_out;
 
@@ -1762,6 +1763,47 @@ int f2fs_fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode,
        return ret ? -EIO: 0;
 }
 
+static int f2fs_match_ino(struct inode *inode, unsigned long ino, void *data)
+{
+       struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+       bool clean;
+
+       if (inode->i_ino != ino)
+               return 0;
+
+       if (!is_inode_flag_set(inode, FI_DIRTY_INODE))
+               return 0;
+
+       spin_lock(&sbi->inode_lock[DIRTY_META]);
+       clean = list_empty(&F2FS_I(inode)->gdirty_list);
+       spin_unlock(&sbi->inode_lock[DIRTY_META]);
+
+       if (clean)
+               return 0;
+
+       inode = igrab(inode);
+       if (!inode)
+               return 0;
+       return 1;
+}
+
+static bool flush_dirty_inode(struct page *page)
+{
+       struct f2fs_sb_info *sbi = F2FS_P_SB(page);
+       struct inode *inode;
+       nid_t ino = ino_of_node(page);
+
+       inode = find_inode_nowait(sbi->sb, ino, f2fs_match_ino, NULL);
+       if (!inode)
+               return false;
+
+       f2fs_update_inode(inode, page);
+       unlock_page(page);
+
+       iput(inode);
+       return true;
+}
+
 int f2fs_sync_node_pages(struct f2fs_sb_info *sbi,
                                struct writeback_control *wbc,
                                bool do_balance, enum iostat_type io_type)
@@ -1785,6 +1827,7 @@ int f2fs_sync_node_pages(struct f2fs_sb_info *sbi,
                for (i = 0; i < nr_pages; i++) {
                        struct page *page = pvec.pages[i];
                        bool submitted = false;
+                       bool may_dirty = true;
 
                        /* give a priority to WB_SYNC threads */
                        if (atomic_read(&sbi->wb_sync_req[NODE]) &&
@@ -1832,6 +1875,13 @@ int f2fs_sync_node_pages(struct f2fs_sb_info *sbi,
                                goto lock_node;
                        }
 
+                       /* flush dirty inode */
+                       if (IS_INODE(page) && may_dirty) {
+                               may_dirty = false;
+                               if (flush_dirty_inode(page))
+                                       goto lock_node;
+                       }
+
                        f2fs_wait_on_page_writeback(page, NODE, true, true);
 
                        if (!clear_page_dirty_for_io(page))
@@ -1860,7 +1910,8 @@ int f2fs_sync_node_pages(struct f2fs_sb_info *sbi,
        }
 
        if (step < 2) {
-               if (wbc->sync_mode == WB_SYNC_NONE && step == 1)
+               if (!is_sbi_flag_set(sbi, SBI_CP_DISABLED) &&
+                               wbc->sync_mode == WB_SYNC_NONE && step == 1)
                        goto out;
                step++;
                goto next_step;
@@ -2964,7 +3015,7 @@ static int init_node_manager(struct f2fs_sb_info *sbi)
 
        /* not used nids: 0, node, meta, (and root counted as valid node) */
        nm_i->available_nids = nm_i->max_nid - sbi->total_valid_node_count -
-                               sbi->nquota_files - F2FS_RESERVED_NODE_NUM;
+                                               F2FS_RESERVED_NODE_NUM;
        nm_i->nid_cnt[FREE_NID] = 0;
        nm_i->nid_cnt[PREALLOC_NID] = 0;
        nm_i->nat_cnt = 0;