]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - fs/f2fs/node.c
f2fs: return error during fill_super
[mirror_ubuntu-bionic-kernel.git] / fs / f2fs / node.c
index d3322752426fae84372e38132ebb5243f7993775..be2f9835c8bd8dfbb941c940d4b28d3a68a6f3bc 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);
@@ -1140,7 +1155,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);
@@ -1164,7 +1180,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)