diff options
| -rw-r--r-- | fs/f2fs/data.c | 16 | ||||
| -rw-r--r-- | fs/f2fs/gc.c | 3 | ||||
| -rw-r--r-- | fs/f2fs/segment.c | 1 |
3 files changed, 17 insertions, 3 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 719a372dc..c6745702a 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -1346,9 +1346,20 @@ int do_write_data_page(struct f2fs_io_info *fio) struct page *page = fio->page; struct inode *inode = page->mapping->host; struct dnode_of_data dn; + struct extent_info ei = {0,0,0}; + bool ipu_force = false; int err = 0; set_new_dnode(&dn, inode, NULL, NULL, 0); + if (need_inplace_update(fio) && + f2fs_lookup_extent_cache(inode, page->index, &ei)) { + fio->old_blkaddr = ei.blk + page->index - ei.fofs; + if (fio->old_blkaddr != NULL_ADDR && + fio->old_blkaddr != NEW_ADDR) { + ipu_force = true; + goto got_it; + } + } err = get_dnode_of_data(&dn, page->index, LOOKUP_NODE); if (err) return err; @@ -1360,7 +1371,7 @@ int do_write_data_page(struct f2fs_io_info *fio) ClearPageUptodate(page); goto out_writepage; } - +got_it: err = encrypt_one_page(fio); if (err) goto out_writepage; @@ -1371,7 +1382,7 @@ int do_write_data_page(struct f2fs_io_info *fio) * If current allocation needs SSR, * it had better in-place writes for updated data. */ - if (need_inplace_update(fio)) { + if (ipu_force || need_inplace_update(fio)) { f2fs_bug_on(fio->sbi, !fio->cp_rwsem_locked); f2fs_unlock_op(fio->sbi); fio->cp_rwsem_locked = false; @@ -1408,6 +1419,7 @@ static int __write_data_page(struct page *page, bool *submitted, .type = DATA, .op = REQ_OP_WRITE, .op_flags = wbc_to_write_flags(wbc), + .old_blkaddr = NULL_ADDR, .page = page, .encrypted_page = NULL, .submitted = false, diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index aca75fb59..34cff432a 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -713,7 +713,8 @@ static void move_data_page(struct inode *inode, block_t bidx, int gc_type, .sbi = F2FS_I_SB(inode), .type = DATA, .op = REQ_OP_WRITE, - .op_flags = REQ_SYNC | REQ_NOIDLE, + .op_flags = REQ_SYNC, + .old_blkaddr = NULL_ADDR, .page = page, .encrypted_page = NULL, }; diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 85e174ba9..603a4afb8 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -370,6 +370,7 @@ static int __commit_inmem_pages(struct inode *inode, } fio.page = page; + fio.old_blkaddr = NULL_ADDR; err = do_write_data_page(&fio); if (err) { unlock_page(page); |
