}
 
        if (unlikely(!PageUptodate(page))) {
-               if (page->index == sbi->metapage_eio_ofs) {
-                       if (sbi->metapage_eio_cnt++ == MAX_RETRY_META_PAGE_EIO)
-                               set_ckpt_flags(sbi, CP_ERROR_FLAG);
-               } else {
-                       sbi->metapage_eio_ofs = page->index;
-                       sbi->metapage_eio_cnt = 0;
-               }
+               f2fs_handle_page_eio(sbi, page->index, META);
                f2fs_put_page(page, 1);
                return ERR_PTR(-EIO);
        }
 
 /* maximum retry quota flush count */
 #define DEFAULT_RETRY_QUOTA_FLUSH_COUNT                8
 
-/* maximum retry of EIO'ed meta page */
-#define MAX_RETRY_META_PAGE_EIO                        100
+/* maximum retry of EIO'ed page */
+#define MAX_RETRY_PAGE_EIO                     100
 
 #define F2FS_LINK_MAX  0xffffffff      /* maximum link count per file */
 
        /* keep migration IO order for LFS mode */
        struct f2fs_rwsem io_order_lock;
        mempool_t *write_io_dummy;              /* Dummy pages */
-       pgoff_t metapage_eio_ofs;               /* EIO page offset */
-       int metapage_eio_cnt;                   /* EIO count */
+       pgoff_t page_eio_ofs[NR_PAGE_TYPE];     /* EIO page offset */
+       int page_eio_cnt[NR_PAGE_TYPE];         /* EIO count */
 
        /* for checkpoint */
        struct f2fs_checkpoint *ckpt;           /* raw checkpoint pointer */
        io_schedule_timeout(timeout);
 }
 
+static inline void f2fs_handle_page_eio(struct f2fs_sb_info *sbi, pgoff_t ofs,
+                                       enum page_type type)
+{
+       if (unlikely(f2fs_cp_error(sbi)))
+               return;
+
+       if (ofs == sbi->page_eio_ofs[type]) {
+               if (sbi->page_eio_cnt[type]++ == MAX_RETRY_PAGE_EIO)
+                       set_ckpt_flags(sbi, CP_ERROR_FLAG);
+       } else {
+               sbi->page_eio_ofs[type] = ofs;
+               sbi->page_eio_cnt[type] = 0;
+       }
+}
+
 #define EFSBADCRC      EBADMSG         /* Bad CRC detected */
 #define EFSCORRUPTED   EUCLEAN         /* Filesystem is corrupted */
 
 
 
        err = read_node_page(page, 0);
        if (err < 0) {
-               f2fs_put_page(page, 1);
-               return ERR_PTR(err);
+               goto out_put_err;
        } else if (err == LOCKED_PAGE) {
                err = 0;
                goto page_hit;
                goto out_err;
        }
 page_hit:
-       if (unlikely(nid != nid_of_node(page))) {
-               f2fs_warn(sbi, "inconsistent node block, nid:%lu, node_footer[nid:%u,ino:%u,ofs:%u,cpver:%llu,blkaddr:%u]",
+       if (likely(nid == nid_of_node(page)))
+               return page;
+
+       f2fs_warn(sbi, "inconsistent node block, nid:%lu, node_footer[nid:%u,ino:%u,ofs:%u,cpver:%llu,blkaddr:%u]",
                          nid, nid_of_node(page), ino_of_node(page),
                          ofs_of_node(page), cpver_of_node(page),
                          next_blkaddr_of_node(page));
-               set_sbi_flag(sbi, SBI_NEED_FSCK);
-               err = -EINVAL;
+       set_sbi_flag(sbi, SBI_NEED_FSCK);
+       err = -EINVAL;
 out_err:
-               ClearPageUptodate(page);
-               f2fs_put_page(page, 1);
-               return ERR_PTR(err);
-       }
-       return page;
+       ClearPageUptodate(page);
+out_put_err:
+       f2fs_handle_page_eio(sbi, page->index, NODE);
+       f2fs_put_page(page, 1);
+       return ERR_PTR(err);
 }
 
 struct page *f2fs_get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid)