Skip to content

Commit 591fc34

Browse files
Daeho JeongJaegeuk Kim
authored andcommitted
f2fs: use cow inode data when updating atomic write
Need to use cow inode data content instead of the one in the original inode, when we try to write the already updated atomic write files. Signed-off-by: Daeho Jeong <[email protected]> Reviewed-by: Chao Yu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent 2e2c6e9 commit 591fc34

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

fs/f2fs/data.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3491,7 +3491,7 @@ static int __reserve_data_block(struct inode *inode, pgoff_t index,
34913491

34923492
static int prepare_atomic_write_begin(struct f2fs_sb_info *sbi,
34933493
struct page *page, loff_t pos, unsigned int len,
3494-
block_t *blk_addr, bool *node_changed)
3494+
block_t *blk_addr, bool *node_changed, bool *use_cow)
34953495
{
34963496
struct inode *inode = page->mapping->host;
34973497
struct inode *cow_inode = F2FS_I(inode)->cow_inode;
@@ -3505,10 +3505,12 @@ static int prepare_atomic_write_begin(struct f2fs_sb_info *sbi,
35053505

35063506
/* Look for the block in COW inode first */
35073507
err = __find_data_block(cow_inode, index, blk_addr);
3508-
if (err)
3508+
if (err) {
35093509
return err;
3510-
else if (*blk_addr != NULL_ADDR)
3510+
} else if (*blk_addr != NULL_ADDR) {
3511+
*use_cow = true;
35113512
return 0;
3513+
}
35123514

35133515
if (is_inode_flag_set(inode, FI_ATOMIC_REPLACE))
35143516
goto reserve_block;
@@ -3538,6 +3540,7 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
35383540
struct page *page = NULL;
35393541
pgoff_t index = ((unsigned long long) pos) >> PAGE_SHIFT;
35403542
bool need_balance = false;
3543+
bool use_cow = false;
35413544
block_t blkaddr = NULL_ADDR;
35423545
int err = 0;
35433546

@@ -3597,7 +3600,7 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
35973600

35983601
if (f2fs_is_atomic_file(inode))
35993602
err = prepare_atomic_write_begin(sbi, page, pos, len,
3600-
&blkaddr, &need_balance);
3603+
&blkaddr, &need_balance, &use_cow);
36013604
else
36023605
err = prepare_write_begin(sbi, page, pos, len,
36033606
&blkaddr, &need_balance);
@@ -3637,7 +3640,9 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping,
36373640
f2fs_handle_error(sbi, ERROR_INVALID_BLKADDR);
36383641
goto fail;
36393642
}
3640-
err = f2fs_submit_page_read(inode, page, blkaddr, 0, true);
3643+
err = f2fs_submit_page_read(use_cow ?
3644+
F2FS_I(inode)->cow_inode : inode, page,
3645+
blkaddr, 0, true);
36413646
if (err)
36423647
goto fail;
36433648

0 commit comments

Comments
 (0)