diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c index a4b7e4bc32d4..ab2f3ef997a7 100644 --- a/fs/ext4/inline.c +++ b/fs/ext4/inline.c @@ -232,6 +232,10 @@ static void ext4_write_inline_data(struct inode *inode, struct ext4_iloc *iloc, return; BUG_ON(!EXT4_I(inode)->i_inline_off); + if (pos + len > EXT4_I(inode)->i_inline_size) + ext4_warning(inode->i_sb, "inode #%lu: pos %llu, len %u, " + "i_inline_size %u", inode->i_ino, + pos, len, EXT4_I(inode)->i_inline_size); BUG_ON(pos + len > EXT4_I(inode)->i_inline_size); raw_inode = ext4_raw_inode(iloc); @@ -687,6 +691,10 @@ int ext4_try_to_write_inline_data(struct address_space *mapping, } ret = ext4_prepare_inline_data(handle, inode, pos + len); + ext4_warning(inode->i_sb, + "inode #%lu: pos %llu len %u " + "prepare_inline_data returns %d", + inode->i_ino, pos, len, ret); if (ret && ret != -ENOSPC) goto out; @@ -749,6 +757,8 @@ int ext4_write_inline_data_end(struct inode *inode, loff_t pos, unsigned len, struct ext4_iloc iloc; int ret = 0, ret2; + ext4_warning(inode->i_sb, "inode #%lu: pos %llu len %u copied %u", + inode->i_ino, pos, len, copied); if (unlikely(copied < len) && !folio_test_uptodate(folio)) copied = 0; @@ -838,6 +848,12 @@ static int ext4_da_convert_inline_data_to_extent(struct address_space *mapping, int ret = 0, inline_size; struct folio *folio; + ext4_warning(inode->i_sb, "inode #%lu: inline_data %d, " + "may_inline_data %d, i_inline_size %u", + inode->i_ino, + ext4_test_inode_flag(inode, EXT4_INODE_INLINE_DATA), + ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA), + EXT4_I(inode)->i_inline_size); folio = __filemap_get_folio(mapping, 0, FGP_WRITEBEGIN, mapping_gfp_mask(mapping)); if (IS_ERR(folio)) @@ -913,6 +929,10 @@ int ext4_da_write_inline_data_begin(struct address_space *mapping, } ret = ext4_prepare_inline_data(handle, inode, pos + len); + ext4_warning(inode->i_sb, + "inode #%lu: pos %llu len %u " + "prepare_inline_data returns %d", + inode->i_ino, pos, len, ret); if (ret && ret != -ENOSPC) goto out_journal; @@ -1112,6 +1132,8 @@ static void ext4_restore_inline_data(handle_t *handle, struct inode *inode, { int ret; + ext4_warning(inode->i_sb, "inode #%lu: inline_size %d", + inode->i_ino, inline_size); ret = ext4_create_inline_data(handle, inode, inline_size); if (ret) { ext4_msg(inode->i_sb, KERN_EMERG, @@ -1119,6 +1141,8 @@ static void ext4_restore_inline_data(handle_t *handle, struct inode *inode, inode->i_ino, ret); return; } + ext4_warning(inode->i_sb, "calling ext4_write_inline_data: ino %lu", + inode->i_ino); ext4_write_inline_data(inode, iloc, buf, 0, inline_size); ext4_set_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); } @@ -1178,6 +1202,8 @@ static int ext4_convert_inline_data_nolock(handle_t *handle, struct ext4_map_blocks map; int inline_size; + ext4_warning(inode->i_sb, "inode #%lu", inode->i_ino); + inline_size = ext4_get_inline_size(inode); buf = kmalloc(inline_size, GFP_NOFS); if (!buf) { @@ -2006,6 +2032,7 @@ int ext4_convert_inline_data(struct inode *inode) handle_t *handle; struct ext4_iloc iloc; + ext4_warning(inode->i_sb, "inode #%lu", inode->i_ino); if (!ext4_has_inline_data(inode)) { ext4_clear_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA); return 0; diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 43be684dabcb..9e5c250e56a8 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -1117,6 +1117,17 @@ static int ext4_write_begin(struct file *file, struct address_space *mapping, if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) return -EIO; + if (ext4_has_inline_data(inode) || + ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { + ext4_warning(inode->i_sb, + "inode #%lu: pos %llu, len %u, " + "has_inline_data %d, " + "may_inline_data %d i_inline_size %u", + inode->i_ino, pos, len, + ext4_has_inline_data(inode), + ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA), + EXT4_I(inode)->i_inline_size); + } trace_ext4_write_begin(inode, pos, len); /* * Reserve one block more for addition to orphan list in case @@ -1269,6 +1280,17 @@ static int ext4_write_end(struct file *file, trace_ext4_write_end(inode, pos, len, copied); + if (ext4_has_inline_data(inode) || + ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { + ext4_warning(inode->i_sb, + "inode #%lu: pos %llu, len %u, " + "has_inline_data %d, " + "may_inline_data %d i_inline_size %u", + inode->i_ino, pos, len, + ext4_has_inline_data(inode), + ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA), + EXT4_I(inode)->i_inline_size); + } 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, @@ -1379,6 +1401,17 @@ static int ext4_journalled_write_end(struct file *file, BUG_ON(!ext4_handle_valid(handle)); + if (ext4_has_inline_data(inode) || + ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { + ext4_warning(inode->i_sb, + "inode #%lu: pos %llu, len %u, " + "has_inline_data %d, " + "may_inline_data %d i_inline_size %u", + inode->i_ino, pos, len, + ext4_has_inline_data(inode), + ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA), + EXT4_I(inode)->i_inline_size); + } if (ext4_has_inline_data(inode)) return ext4_write_inline_data_end(inode, pos, len, copied, folio); @@ -2860,10 +2893,24 @@ static int ext4_da_write_begin(struct file *file, struct address_space *mapping, if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) return -EIO; + if (ext4_has_inline_data(inode) || + ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { + ext4_warning(inode->i_sb, + "inode #%lu: pos %llu, len %u, " + "has_inline_data %d, " + "may_inline_data %d i_inline_size %u", + inode->i_ino, pos, len, + ext4_has_inline_data(inode), + ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA), + EXT4_I(inode)->i_inline_size); + } index = pos >> PAGE_SHIFT; if (ext4_nonda_switch(inode->i_sb) || ext4_verity_in_progress(inode)) { *fsdata = (void *)FALL_BACK_TO_NONDELALLOC; + ext4_warning(inode->i_sb, "falling back to write_begin: " + "ino %lu, pos %llu len %u", + inode->i_ino, pos, len); return ext4_write_begin(file, mapping, pos, len, pagep, fsdata); } @@ -2871,6 +2918,9 @@ static int ext4_da_write_begin(struct file *file, struct address_space *mapping, trace_ext4_da_write_begin(inode, pos, len); if (ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { + ext4_warning(inode->i_sb, "calling ext4_da_write_inline_data_begin: " + "ino %lu, pos %llu len %u", + inode->i_ino, pos, len); ret = ext4_da_write_inline_data_begin(mapping, inode, pos, len, pagep, fsdata); if (ret < 0) @@ -2948,6 +2998,17 @@ static int ext4_da_write_end(struct file *file, int write_mode = (int)(unsigned long)fsdata; struct folio *folio = page_folio(page); + if (ext4_has_inline_data(inode) || + ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA)) { + ext4_warning(inode->i_sb, + "inode #%lu: pos %llu, len %u, " + "has_inline_data %d, " + "may_inline_data %d i_inline_size %u", + inode->i_ino, pos, len, + ext4_has_inline_data(inode), + ext4_test_inode_state(inode, EXT4_STATE_MAY_INLINE_DATA), + EXT4_I(inode)->i_inline_size); + } if (write_mode == FALL_BACK_TO_NONDELALLOC) return ext4_write_end(file, mapping, pos, len, copied, &folio->page, fsdata);