|
@@ -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)->i_pages, 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)
|