2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-19 02:34:01 +08:00
linux-next/fs/ext4
Jan Kara 822dbba334 ext4: fix warning in ext4_evict_inode()
The following race can lead to ext4_evict_inode() seeing i_ioend_count
> 0 and thus triggering a sanity check warning:

        CPU1                                    CPU2
ext4_end_bio()                          ext4_evict_inode()
  ext4_finish_bio()
    end_page_writeback();
                                          truncate_inode_pages()
                                            evict page
                                        WARN_ON(i_ioend_count > 0);
  ext4_put_io_end_defer()
    ext4_release_io_end()
      dec i_ioend_count

This is possible use-after-free bug since we decrement i_ioend_count in
possibly released inode.

Since i_ioend_count is used only for sanity checks one possible solution
would be to just remove it but for now I'd like to keep those sanity
checks to help debugging the new ext4 writeback code.

This patch changes ext4_end_bio() to call ext4_put_io_end_defer() before
ext4_finish_bio() in the shortcut case when unwritten extent conversion
isn't needed.  In that case we don't need the io_end so we are safe to
drop it early.

Reported-by: Guenter Roeck <linux@roeck-us.net>
Tested-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2013-07-10 21:31:04 -04:00
..
acl.c ext4: fix the number of credits needed for acl ops with inline data 2013-02-09 15:23:03 -05:00
acl.h fs: take the ACL checks to common code 2011-07-25 14:30:23 -04:00
balloc.c ext4: fix ext4_get_group_number() 2013-07-05 23:11:16 -04:00
bitmap.c ext4: Checksum the block bitmap properly with bigalloc enabled 2012-10-22 00:34:32 -04:00
block_validity.c ext2/3/4: delete unneeded includes of module.h 2012-01-09 13:52:10 +01:00
dir.c ext4: fix readdir error in the case of inline_data+dir_index 2013-04-19 17:53:09 -04:00
ext4_extents.h ext4: mext_insert_extents should update extent block checksum 2013-04-19 14:04:12 -04:00
ext4_jbd2.c ext4: provide wrappers for transaction reservation calls 2013-06-04 12:37:50 -04:00
ext4_jbd2.h ext4: use transaction reservation for extent conversion in ext4_end_io 2013-06-04 13:21:11 -04:00
ext4.h ext4: pass inode pointer instead of file pointer to punch hole 2013-07-01 08:12:38 -04:00
extents_status.c ext4: improve extent cache shrink mechanism to avoid to burn CPU time 2013-07-01 08:12:37 -04:00
extents_status.h ext4: improve extent cache shrink mechanism to avoid to burn CPU time 2013-07-01 08:12:37 -04:00
extents.c ext4: optimize starting extent in ext4_ext_rm_leaf() 2013-07-01 08:12:41 -04:00
file.c ext4: fix overflows in SEEK_HOLE, SEEK_DATA implementations 2013-05-31 19:37:56 -04:00
fsync.c ext4: Fix fsync error handling after filesystem abort 2013-06-12 22:38:04 -04:00
hash.c ext4: reduce one "if" comparison in ext4_dirhash() 2013-02-01 22:33:21 -05:00
ialloc.c ext4: provide wrappers for transaction reservation calls 2013-06-04 12:37:50 -04:00
indirect.c ext4: translate flag bits to strings in tracepoints 2013-07-01 08:12:40 -04:00
inline.c ext4: improve free space calculation for inline_data 2013-07-01 08:12:37 -04:00
inode.c ext4: silence warning in ext4_writepages() 2013-07-05 21:57:22 -04:00
ioctl.c ext4: fix usless declarations 2013-04-09 22:48:36 -04:00
Kconfig ext4: fix Kconfig documentation for CONFIG_EXT4_DEBUG 2013-04-21 20:32:03 -04:00
Makefile ext4: Remove CONFIG_EXT4_FS_XATTR 2012-12-10 16:30:43 -05:00
mballoc.c ext4: implement error handling of ext4_mb_new_preallocation() 2013-07-01 08:12:36 -04:00
mballoc.h ext4: use module parameters instead of debugfs for mballoc_debug 2013-02-09 16:28:20 -05:00
migrate.c ext4: do not convert to indirect with bigalloc enabled 2013-04-11 10:54:46 -04:00
mmp.c ext4: mark all metadata I/O with REQ_META 2013-04-20 15:46:17 -04:00
move_extent.c ext4: delete unused variables 2013-06-17 08:56:26 -04:00
namei.c ext3,ext4: don't mess with dir_file->f_pos in htree_dirblock_to_tree() 2013-07-01 08:12:38 -04:00
page-io.c ext4: fix warning in ext4_evict_inode() 2013-07-10 21:31:04 -04:00
resize.c ext4: fix corruption when online resizing a fs with 1K block size 2013-07-01 08:12:08 -04:00
super.c ext4: fix ext4_get_group_number() 2013-07-05 23:11:16 -04:00
symlink.c ext4: Remove CONFIG_EXT4_FS_XATTR 2012-12-10 16:30:43 -05:00
truncate.h ext4: move common truncate functions to header file 2011-06-27 19:16:04 -04:00
xattr_security.c Merge branch 'for_linus' into for_linus_merged 2012-01-10 11:54:07 -05:00
xattr_trusted.c ext2/3/4: delete unneeded includes of module.h 2012-01-09 13:52:10 +01:00
xattr_user.c ext2/3/4: delete unneeded includes of module.h 2012-01-09 13:52:10 +01:00
xattr.c ext4: fix miscellaneous big endian warnings 2013-04-09 23:59:55 -04:00
xattr.h ext4: reserve xattr index for Rich ACL support 2013-04-18 14:53:15 -04:00