|
@@ -441,7 +441,10 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio)
|
|
|
struct page *page = fio->encrypted_page ?
|
|
|
fio->encrypted_page : fio->page;
|
|
|
|
|
|
- verify_block_addr(fio, fio->new_blkaddr);
|
|
|
+ if (!f2fs_is_valid_blkaddr(fio->sbi, fio->new_blkaddr,
|
|
|
+ __is_meta_io(fio) ? META_GENERIC : DATA_GENERIC))
|
|
|
+ return -EFAULT;
|
|
|
+
|
|
|
trace_f2fs_submit_page_bio(page, fio);
|
|
|
f2fs_trace_ios(fio, 0);
|
|
|
|
|
@@ -1045,6 +1048,12 @@ next_dnode:
|
|
|
next_block:
|
|
|
blkaddr = datablock_addr(dn.inode, dn.node_page, dn.ofs_in_node);
|
|
|
|
|
|
+ if (__is_valid_data_blkaddr(blkaddr) &&
|
|
|
+ !f2fs_is_valid_blkaddr(sbi, blkaddr, DATA_GENERIC)) {
|
|
|
+ err = -EFAULT;
|
|
|
+ goto sync_out;
|
|
|
+ }
|
|
|
+
|
|
|
if (!is_valid_data_blkaddr(sbi, blkaddr)) {
|
|
|
if (create) {
|
|
|
if (unlikely(f2fs_cp_error(sbi))) {
|
|
@@ -1500,6 +1509,10 @@ got_it:
|
|
|
SetPageUptodate(page);
|
|
|
goto confused;
|
|
|
}
|
|
|
+
|
|
|
+ if (!f2fs_is_valid_blkaddr(F2FS_I_SB(inode), block_nr,
|
|
|
+ DATA_GENERIC))
|
|
|
+ goto set_error_page;
|
|
|
} else {
|
|
|
zero_user_segment(page, 0, PAGE_SIZE);
|
|
|
if (!PageUptodate(page))
|
|
@@ -1700,11 +1713,13 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio)
|
|
|
f2fs_lookup_extent_cache(inode, page->index, &ei)) {
|
|
|
fio->old_blkaddr = ei.blk + page->index - ei.fofs;
|
|
|
|
|
|
- if (is_valid_data_blkaddr(fio->sbi, fio->old_blkaddr)) {
|
|
|
- ipu_force = true;
|
|
|
- fio->need_lock = LOCK_DONE;
|
|
|
- goto got_it;
|
|
|
- }
|
|
|
+ if (!f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr,
|
|
|
+ DATA_GENERIC))
|
|
|
+ return -EFAULT;
|
|
|
+
|
|
|
+ ipu_force = true;
|
|
|
+ fio->need_lock = LOCK_DONE;
|
|
|
+ goto got_it;
|
|
|
}
|
|
|
|
|
|
/* Deadlock due to between page->lock and f2fs_lock_op */
|
|
@@ -1723,6 +1738,12 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio)
|
|
|
goto out_writepage;
|
|
|
}
|
|
|
got_it:
|
|
|
+ if (__is_valid_data_blkaddr(fio->old_blkaddr) &&
|
|
|
+ !f2fs_is_valid_blkaddr(fio->sbi, fio->old_blkaddr,
|
|
|
+ DATA_GENERIC)) {
|
|
|
+ err = -EFAULT;
|
|
|
+ goto out_writepage;
|
|
|
+ }
|
|
|
/*
|
|
|
* If current allocation needs SSR,
|
|
|
* it had better in-place writes for updated data.
|