diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c index b5d172bf33187d672c9fbfb0750e12b220daa93d..6d868ede1d11d162238c8cb2ec5a1720f4dea81d 100644 --- a/fs/ext4/inline.c +++ b/fs/ext4/inline.c @@ -2022,6 +2022,18 @@ int ext4_convert_inline_data(struct inode *inode) if (!ext4_has_inline_data(inode)) { ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); return 0; + } else if (!ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { + /* + * Inode has inline data but EXT4_STATE_MAY_INLINE_DATA is + * cleared. This means we are in the middle of moving of + * inline data to delay allocated block. Just force writeout + * here to finish conversion. + */ + error = filemap_flush(inode->i_mapping); + if (error) + return error; + if (!ext4_has_inline_data(inode)) + return 0; } needed_blocks = ext4_writepage_trans_blocks(inode);