Skip to content

Commit 0a4ed2d

Browse files
chaseyuJaegeuk Kim
authored andcommitted
f2fs: compress: fix to cover {reserve,release}_compress_blocks() w/ cp_rwsem lock
It needs to cover {reserve,release}_compress_blocks() w/ cp_rwsem lock to avoid racing with checkpoint, otherwise, filesystem metadata including blkaddr in dnode, inode fields and .total_valid_block_count may be corrupted after SPO case. Fixes: ef8d563 ("f2fs: introduce F2FS_IOC_RELEASE_COMPRESS_BLOCKS") Fixes: c75488f ("f2fs: introduce F2FS_IOC_RESERVE_COMPRESS_BLOCKS") Signed-off-by: Chao Yu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent 043c832 commit 0a4ed2d

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

fs/f2fs/file.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3593,9 +3593,12 @@ static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg)
35933593
struct dnode_of_data dn;
35943594
pgoff_t end_offset, count;
35953595

3596+
f2fs_lock_op(sbi);
3597+
35963598
set_new_dnode(&dn, inode, NULL, NULL, 0);
35973599
ret = f2fs_get_dnode_of_data(&dn, page_idx, LOOKUP_NODE);
35983600
if (ret) {
3601+
f2fs_unlock_op(sbi);
35993602
if (ret == -ENOENT) {
36003603
page_idx = f2fs_get_next_page_offset(&dn,
36013604
page_idx);
@@ -3613,6 +3616,8 @@ static int f2fs_release_compress_blocks(struct file *filp, unsigned long arg)
36133616

36143617
f2fs_put_dnode(&dn);
36153618

3619+
f2fs_unlock_op(sbi);
3620+
36163621
if (ret < 0)
36173622
break;
36183623

@@ -3765,9 +3770,12 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg)
37653770
struct dnode_of_data dn;
37663771
pgoff_t end_offset, count;
37673772

3773+
f2fs_lock_op(sbi);
3774+
37683775
set_new_dnode(&dn, inode, NULL, NULL, 0);
37693776
ret = f2fs_get_dnode_of_data(&dn, page_idx, LOOKUP_NODE);
37703777
if (ret) {
3778+
f2fs_unlock_op(sbi);
37713779
if (ret == -ENOENT) {
37723780
page_idx = f2fs_get_next_page_offset(&dn,
37733781
page_idx);
@@ -3785,6 +3793,8 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg)
37853793

37863794
f2fs_put_dnode(&dn);
37873795

3796+
f2fs_unlock_op(sbi);
3797+
37883798
if (ret < 0)
37893799
break;
37903800

0 commit comments

Comments
 (0)