diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index ce99807c5f5b..9a5347907685 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -1450,11 +1450,17 @@ static int ext4_write_end(const struct kiocb *iocb, trace_ext4_write_end(inode, pos, len, copied); + down_read(&EXT4_I(inode)->i_data_sem); + /* Serialize against inline data conversion (see ext4_convert_inline_data_nolock) */ if (ext4_has_inline_data(inode) && - ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) - return ext4_write_inline_data_end(inode, pos, len, copied, + ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { + ret = ext4_write_inline_data_end(inode, pos, len, copied, folio); + up_read(&EXT4_I(inode)->i_data_sem); + return ret; + } + up_read(&EXT4_I(inode)->i_data_sem); copied = block_write_end(pos, len, copied, folio); /* * it's important to update i_size while still holding folio lock: