aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/f2fs/data.c16
-rw-r--r--fs/f2fs/gc.c3
-rw-r--r--fs/f2fs/segment.c1
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);