ext4: fix a potential fiemap/page fault deadlock w/ inline_data
Theodore Ts'o
maintainerPATCH 1/1 ext4: fix a potential fiemap/page fault deadlock w/ inline_data
The ext4_inline_data_fiemap() function calls fiemap_fill_next_extent() while still holding the xattr semaphore. This is not necessary and it triggers a circular lockdep warning. This is because fiemap_fill_next_extent() could trigger a page fault when it writes into page which triggers a page fault. If that page is mmaped from the inline file in question, this could very well result in a deadlock.
This problem can be reproduced using generic/519 with a file system configuration which has the inline_data feature enabled.
Signed-off-by Theodore Ts'o <[email protected]>
--- fs/ext4/inline.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
fs/ext4/inline.c +3 -3
@@ -1890,12 +1890,12 @@ int ext4_inline_data_fiemap(struct inode *inode, physical += (char *)ext4_raw_inode (&iloc) - iloc.bh->b_data; physical += offsetof(struct ext4_inode , i_block); -if (physical) - error =fiemap_fill_next_extent (fieinfo, start, physical, - inline_len, flags);brelse (iloc.bh); out:up_read (&EXT4_I (inode)->xattr_sem); +if (physical) + error =fiemap_fill_next_extent (fieinfo, start, physical, + inline_len, flags);return (error <0 ? error :0 ); }
Signature · 1 line
2.19.1