[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20091110215338.GD13262@mit.edu>
Date: Tue, 10 Nov 2009 16:53:38 -0500
From: Theodore Tso <tytso@....edu>
To: Akira Fujita <a-fujita@...jp.nec.com>
Cc: ext4 development <linux-ext4@...r.kernel.org>
Subject: Re: [PATCH 2/4]ext4: Fix lock order problem in ext4_move_extents()
On Fri, Oct 30, 2009 at 04:41:56PM +0900, Akira Fujita wrote:
> ext4: Fix lock order problem in ext4_move_extents()
>
> From: Akira Fujita <a-fujita@...jp.nec.com>
Thanks, I've added this to the ext4 patch queue with the updated
commit description:
ext4: Fix lock order problem in ext4_move_extents()
From: Akira Fujita <a-fujita@...jp.nec.com>
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@...jp.nec.com>
Signed-off-by: "Theodore Ts'o" <tytso@....edu>
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists