Merge 4.14.56 into android-4.14
[GitHub/moto-9609/android_kernel_motorola_exynos9610.git] / fs / f2fs / node.c
index 803a0102a47b7f7b52c4e3fc12cdf49b06663527..a367e80640607fc4fe05bc17d8ec54cca23ae54b 100644 (file)
@@ -29,6 +29,21 @@ static struct kmem_cache *nat_entry_slab;
 static struct kmem_cache *free_nid_slab;
 static struct kmem_cache *nat_entry_set_slab;
 
+/*
+ * Check whether the given nid is within node id range.
+ */
+int check_nid_range(struct f2fs_sb_info *sbi, nid_t nid)
+{
+       if (unlikely(nid < F2FS_ROOT_INO(sbi) || nid >= NM_I(sbi)->max_nid)) {
+               set_sbi_flag(sbi, SBI_NEED_FSCK);
+               f2fs_msg(sbi->sb, KERN_WARNING,
+                               "%s: out-of-range nid=%x, run fsck to fix.",
+                               __func__, nid);
+               return -EINVAL;
+       }
+       return 0;
+}
+
 bool available_free_memory(struct f2fs_sb_info *sbi, int type)
 {
        struct f2fs_nm_info *nm_i = NM_I(sbi);
@@ -1158,7 +1173,8 @@ void ra_node_page(struct f2fs_sb_info *sbi, nid_t nid)
 
        if (!nid)
                return;
-       f2fs_bug_on(sbi, check_nid_range(sbi, nid));
+       if (check_nid_range(sbi, nid))
+               return;
 
        rcu_read_lock();
        apage = radix_tree_lookup(&NODE_MAPPING(sbi)->page_tree, nid);
@@ -1182,7 +1198,8 @@ static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid,
 
        if (!nid)
                return ERR_PTR(-ENOENT);
-       f2fs_bug_on(sbi, check_nid_range(sbi, nid));
+       if (check_nid_range(sbi, nid))
+               return ERR_PTR(-EINVAL);
 repeat:
        page = f2fs_grab_cache_page(NODE_MAPPING(sbi), nid, false);
        if (!page)