1 ext4: document lock ordering
3 From: Jan Kara <jack@suse.com>
5 We have enough locks that it's probably worth documenting the lock
6 ordering rules we have in ext4.
8 Signed-off-by: Jan Kara <jack@suse.com>
9 Signed-off-by: Theodore Ts'o <tytso@mit.edu>
11 fs/ext4/super.c | 30 ++++++++++++++++++++++++++++++
12 1 file changed, 30 insertions(+)
14 diff --git a/fs/ext4/super.c b/fs/ext4/super.c
15 index 61fad9e33bb9..152f719a0c62 100644
18 @@ -85,6 +85,36 @@ static void ext4_unregister_li_request(struct super_block *sb);
19 static void ext4_clear_request_list(void);
20 static int ext4_reserve_clusters(struct ext4_sb_info *, ext4_fsblk_t);
25 + * Note the difference between i_mmap_sem (EXT4_I(inode)->i_mmap_sem) and
26 + * i_mmap_rwsem (inode->i_mmap_rwsem)!
29 + * mmap_sem -> sb_start_pagefault -> i_mmap_sem (r) -> transaction start ->
30 + * page lock -> i_data_sem (rw)
32 + * buffered write path:
33 + * sb_start_write -> i_mutex -> mmap_sem
34 + * sb_start_write -> i_mutex -> transaction start -> page lock ->
38 + * sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (w) -> i_mmap_sem (w) ->
39 + * i_mmap_rwsem (w) -> page lock
40 + * sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (w) -> i_mmap_sem (w) ->
41 + * transaction start -> i_data_sem (rw)
44 + * sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (r) -> mmap_sem
45 + * sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (r) ->
46 + * transaction start -> i_data_sem (rw)
49 + * transaction start -> page lock(s) -> i_data_sem (rw)
52 #if !defined(CONFIG_EXT2_FS) && !defined(CONFIG_EXT2_FS_MODULE) && defined(CONFIG_EXT4_USE_FOR_EXT2)
53 static struct file_system_type ext2_fs_type = {