add patch fix-an-endianness-bug-in-ext4_encrypted_follow_link
[ext4-patch-queue.git] / document-lock-ordering
blob257390fa21facbe80b5c0ec228cc7a69e51e46ce
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>
10 ---
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
16 --- a/fs/ext4/super.c
17 +++ b/fs/ext4/super.c
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);
22 +/*
23 + * Lock ordering
24 + *
25 + * Note the difference between i_mmap_sem (EXT4_I(inode)->i_mmap_sem) and
26 + * i_mmap_rwsem (inode->i_mmap_rwsem)!
27 + *
28 + * page fault path:
29 + * mmap_sem -> sb_start_pagefault -> i_mmap_sem (r) -> transaction start ->
30 + *   page lock -> i_data_sem (rw)
31 + *
32 + * buffered write path:
33 + * sb_start_write -> i_mutex -> mmap_sem
34 + * sb_start_write -> i_mutex -> transaction start -> page lock ->
35 + *   i_data_sem (rw)
36 + *
37 + * truncate:
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)
42 + *
43 + * direct IO:
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)
47 + *
48 + * writepages:
49 + * transaction start -> page lock(s) -> i_data_sem (rw)
50 + */
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 = {
54         .owner          = THIS_MODULE,
55 -- 
56 2.1.4