Files
linux/fs
Akira Fujita fc04cb49a8 ext4: fix lock order problem in ext4_move_extents()
ext4_move_extents() checks the logical block contiguousness
of original file with ext4_find_extent() and mext_next_extent().
Therefore the extent which ext4_ext_path structure indicates
must not be changed between above functions.

But in current implementation, there is no i_data_sem protection
between ext4_ext_find_extent() and mext_next_extent().  So the extent
which ext4_ext_path structure indicates may be overwritten by
delalloc.  As a result, ext4_move_extents() will exchange wrong blocks
between original and donor files.  I change the place where
acquire/release i_data_sem to solve this problem.

Moreover, I changed move_extent_per_page() to start transaction first,
and then acquire i_data_sem.  Without this change, there is a
possibility of the deadlock between mmap() and ext4_move_extents():

* NOTE: "A", "B" and "C" mean different processes

A-1: ext4_ext_move_extents() acquires i_data_sem of two inodes.

B:   do_page_fault() starts the transaction (T),
     and then tries to acquire i_data_sem.
     But process "A" is already holding it, so it is kept waiting.

C:   While "A" and "B" running, kjournald2 tries to commit transaction (T)
     but it is under updating, so kjournald2 waits for it.

A-2: Call ext4_journal_start with holding i_data_sem,
     but transaction (T) is locked.

Signed-off-by: Akira Fujita <a-fujita@rs.jp.nec.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-11-23 07:24:43 -05:00
..
2009-11-02 08:43:45 -06:00
2009-06-11 21:36:14 -04:00
2009-10-01 16:11:16 -07:00
2009-07-12 12:22:34 -07:00
2009-10-04 15:05:10 -07:00
2009-09-23 07:39:28 -07:00
2009-09-30 12:19:44 -05:00
2009-06-17 00:36:36 -04:00
2009-07-12 12:22:34 -07:00
2009-11-04 10:24:52 +01:00
2009-07-12 12:22:34 -07:00
2009-09-23 18:13:10 -07:00
2009-10-20 18:02:33 -04:00
2009-09-23 07:39:30 -07:00
2009-09-24 08:41:47 -04:00
2009-06-17 00:36:37 -04:00
2009-06-18 13:03:46 -07:00
2009-09-24 08:41:47 -04:00
2009-09-24 07:21:01 -07:00
2009-09-24 07:21:03 -07:00
2009-06-18 13:03:41 -07:00
2009-09-24 07:21:01 -07:00
2009-09-24 07:47:27 -04:00
2009-10-22 08:11:44 +09:00
2009-10-04 15:05:10 -07:00
2009-04-20 23:02:52 -04:00
2009-09-23 07:39:29 -07:00