diff options
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r-- | fs/ext4/inode.c | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index feaa82fe629d..a58812ef5ea3 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -2482,13 +2482,14 @@ static int ext4_da_write_end(struct file *file, | |||
2482 | int write_mode = (int)(unsigned long)fsdata; | 2482 | int write_mode = (int)(unsigned long)fsdata; |
2483 | 2483 | ||
2484 | if (write_mode == FALL_BACK_TO_NONDELALLOC) { | 2484 | if (write_mode == FALL_BACK_TO_NONDELALLOC) { |
2485 | if (ext4_should_order_data(inode)) { | 2485 | switch (ext4_inode_journal_mode(inode)) { |
2486 | case EXT4_INODE_ORDERED_DATA_MODE: | ||
2486 | return ext4_ordered_write_end(file, mapping, pos, | 2487 | return ext4_ordered_write_end(file, mapping, pos, |
2487 | len, copied, page, fsdata); | 2488 | len, copied, page, fsdata); |
2488 | } else if (ext4_should_writeback_data(inode)) { | 2489 | case EXT4_INODE_WRITEBACK_DATA_MODE: |
2489 | return ext4_writeback_write_end(file, mapping, pos, | 2490 | return ext4_writeback_write_end(file, mapping, pos, |
2490 | len, copied, page, fsdata); | 2491 | len, copied, page, fsdata); |
2491 | } else { | 2492 | default: |
2492 | BUG(); | 2493 | BUG(); |
2493 | } | 2494 | } |
2494 | } | 2495 | } |
@@ -3086,18 +3087,25 @@ static const struct address_space_operations ext4_da_aops = { | |||
3086 | 3087 | ||
3087 | void ext4_set_aops(struct inode *inode) | 3088 | void ext4_set_aops(struct inode *inode) |
3088 | { | 3089 | { |
3089 | if (ext4_should_order_data(inode) && | 3090 | switch (ext4_inode_journal_mode(inode)) { |
3090 | test_opt(inode->i_sb, DELALLOC)) | 3091 | case EXT4_INODE_ORDERED_DATA_MODE: |
3091 | inode->i_mapping->a_ops = &ext4_da_aops; | 3092 | if (test_opt(inode->i_sb, DELALLOC)) |
3092 | else if (ext4_should_order_data(inode)) | 3093 | inode->i_mapping->a_ops = &ext4_da_aops; |
3093 | inode->i_mapping->a_ops = &ext4_ordered_aops; | 3094 | else |
3094 | else if (ext4_should_writeback_data(inode) && | 3095 | inode->i_mapping->a_ops = &ext4_ordered_aops; |
3095 | test_opt(inode->i_sb, DELALLOC)) | 3096 | break; |
3096 | inode->i_mapping->a_ops = &ext4_da_aops; | 3097 | case EXT4_INODE_WRITEBACK_DATA_MODE: |
3097 | else if (ext4_should_writeback_data(inode)) | 3098 | if (test_opt(inode->i_sb, DELALLOC)) |
3098 | inode->i_mapping->a_ops = &ext4_writeback_aops; | 3099 | inode->i_mapping->a_ops = &ext4_da_aops; |
3099 | else | 3100 | else |
3101 | inode->i_mapping->a_ops = &ext4_writeback_aops; | ||
3102 | break; | ||
3103 | case EXT4_INODE_JOURNAL_DATA_MODE: | ||
3100 | inode->i_mapping->a_ops = &ext4_journalled_aops; | 3104 | inode->i_mapping->a_ops = &ext4_journalled_aops; |
3105 | break; | ||
3106 | default: | ||
3107 | BUG(); | ||
3108 | } | ||
3101 | } | 3109 | } |
3102 | 3110 | ||
3103 | 3111 | ||