OSDN Git Service

f2fs: support get_page error injection
authorChao Yu <yuchao0@huawei.com>
Sat, 28 Oct 2017 08:52:30 +0000 (16:52 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 16 Nov 2017 05:58:16 +0000 (21:58 -0800)
This patch adds to support get_page error injection to simulate
out-of-memory test scenario.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/data.c
fs/f2fs/f2fs.h
fs/f2fs/gc.c
fs/f2fs/node.c
fs/f2fs/super.c

index 6750584..81ec0c6 100644 (file)
@@ -1962,7 +1962,8 @@ repeat:
         * Do not use grab_cache_page_write_begin() to avoid deadlock due to
         * wait_for_stable_page. Will wait that below with our IO control.
         */
-       page = grab_cache_page(mapping, index);
+       page = f2fs_pagecache_get_page(mapping, index,
+                               FGP_LOCK | FGP_WRITE | FGP_CREAT, GFP_NOFS);
        if (!page) {
                err = -ENOMEM;
                goto fail;
index d67d1d9..b35d894 100644 (file)
@@ -47,6 +47,7 @@
 enum {
        FAULT_KMALLOC,
        FAULT_PAGE_ALLOC,
+       FAULT_PAGE_GET,
        FAULT_ALLOC_NID,
        FAULT_ORPHAN,
        FAULT_BLOCK,
@@ -1896,6 +1897,19 @@ static inline struct page *f2fs_grab_cache_page(struct address_space *mapping,
        return grab_cache_page_write_begin(mapping, index, AOP_FLAG_NOFS);
 }
 
+static inline struct page *f2fs_pagecache_get_page(
+                               struct address_space *mapping, pgoff_t index,
+                               int fgp_flags, gfp_t gfp_mask)
+{
+#ifdef CONFIG_F2FS_FAULT_INJECTION
+       if (time_to_inject(F2FS_M_SB(mapping), FAULT_PAGE_GET)) {
+               f2fs_show_injection_info(FAULT_PAGE_GET);
+               return NULL;
+       }
+#endif
+       return pagecache_get_page(mapping, index, fgp_flags, gfp_mask);
+}
+
 static inline void f2fs_copy_page(struct page *src, struct page *dst)
 {
        char *src_kaddr = kmap(src);
index 32b0b06..359e7b5 100644 (file)
@@ -650,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;
index 77b39a0..1c81a91 100644 (file)
@@ -1218,7 +1218,8 @@ static void flush_inline_data(struct f2fs_sb_info *sbi, nid_t ino)
        if (!inode)
                return;
 
-       page = pagecache_get_page(inode->i_mapping, 0, FGP_LOCK|FGP_NOWAIT, 0);
+       page = f2fs_pagecache_get_page(inode->i_mapping, 0,
+                                       FGP_LOCK|FGP_NOWAIT, 0);
        if (!page)
                goto iput_out;
 
index 8a99182..a5304d9 100644 (file)
@@ -44,6 +44,7 @@ static struct kmem_cache *f2fs_inode_cachep;
 char *fault_name[FAULT_MAX] = {
        [FAULT_KMALLOC]         = "kmalloc",
        [FAULT_PAGE_ALLOC]      = "page alloc",
+       [FAULT_PAGE_GET]        = "page get",
        [FAULT_ALLOC_NID]       = "alloc nid",
        [FAULT_ORPHAN]          = "orphan",
        [FAULT_BLOCK]           = "no more block",