|
@@ -80,6 +80,36 @@ static void ext4_destroy_lazyinit_thread(void);
|
|
|
static void ext4_unregister_li_request(struct super_block *sb);
|
|
|
static void ext4_clear_request_list(void);
|
|
|
|
|
|
+/*
|
|
|
+ * Lock ordering
|
|
|
+ *
|
|
|
+ * Note the difference between i_mmap_sem (EXT4_I(inode)->i_mmap_sem) and
|
|
|
+ * i_mmap_rwsem (inode->i_mmap_rwsem)!
|
|
|
+ *
|
|
|
+ * page fault path:
|
|
|
+ * mmap_sem -> sb_start_pagefault -> i_mmap_sem (r) -> transaction start ->
|
|
|
+ * page lock -> i_data_sem (rw)
|
|
|
+ *
|
|
|
+ * buffered write path:
|
|
|
+ * sb_start_write -> i_mutex -> mmap_sem
|
|
|
+ * sb_start_write -> i_mutex -> transaction start -> page lock ->
|
|
|
+ * i_data_sem (rw)
|
|
|
+ *
|
|
|
+ * truncate:
|
|
|
+ * sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (w) -> i_mmap_sem (w) ->
|
|
|
+ * i_mmap_rwsem (w) -> page lock
|
|
|
+ * sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (w) -> i_mmap_sem (w) ->
|
|
|
+ * transaction start -> i_data_sem (rw)
|
|
|
+ *
|
|
|
+ * direct IO:
|
|
|
+ * sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (r) -> mmap_sem
|
|
|
+ * sb_start_write -> i_mutex -> EXT4_STATE_DIOREAD_LOCK (r) ->
|
|
|
+ * transaction start -> i_data_sem (rw)
|
|
|
+ *
|
|
|
+ * writepages:
|
|
|
+ * transaction start -> page lock(s) -> i_data_sem (rw)
|
|
|
+ */
|
|
|
+
|
|
|
#if !defined(CONFIG_EXT2_FS) && !defined(CONFIG_EXT2_FS_MODULE) && defined(CONFIG_EXT4_USE_FOR_EXT2)
|
|
|
static struct file_system_type ext2_fs_type = {
|
|
|
.owner = THIS_MODULE,
|