diff options
Diffstat (limited to 'fs/ext2/inode.c')
-rw-r--r-- | fs/ext2/inode.c | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index a50d9db4b6e4..53dceb0c6593 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/mpage.h> | 33 | #include <linux/mpage.h> |
34 | #include "ext2.h" | 34 | #include "ext2.h" |
35 | #include "acl.h" | 35 | #include "acl.h" |
36 | #include "xip.h" | ||
36 | 37 | ||
37 | MODULE_AUTHOR("Remy Card and others"); | 38 | MODULE_AUTHOR("Remy Card and others"); |
38 | MODULE_DESCRIPTION("Second Extended Filesystem"); | 39 | MODULE_DESCRIPTION("Second Extended Filesystem"); |
@@ -594,6 +595,16 @@ out: | |||
594 | if (err) | 595 | if (err) |
595 | goto cleanup; | 596 | goto cleanup; |
596 | 597 | ||
598 | if (ext2_use_xip(inode->i_sb)) { | ||
599 | /* | ||
600 | * we need to clear the block | ||
601 | */ | ||
602 | err = ext2_clear_xip_target (inode, | ||
603 | le32_to_cpu(chain[depth-1].key)); | ||
604 | if (err) | ||
605 | goto cleanup; | ||
606 | } | ||
607 | |||
597 | if (ext2_splice_branch(inode, iblock, chain, partial, left) < 0) | 608 | if (ext2_splice_branch(inode, iblock, chain, partial, left) < 0) |
598 | goto changed; | 609 | goto changed; |
599 | 610 | ||
@@ -691,6 +702,11 @@ struct address_space_operations ext2_aops = { | |||
691 | .writepages = ext2_writepages, | 702 | .writepages = ext2_writepages, |
692 | }; | 703 | }; |
693 | 704 | ||
705 | struct address_space_operations ext2_aops_xip = { | ||
706 | .bmap = ext2_bmap, | ||
707 | .get_xip_page = ext2_get_xip_page, | ||
708 | }; | ||
709 | |||
694 | struct address_space_operations ext2_nobh_aops = { | 710 | struct address_space_operations ext2_nobh_aops = { |
695 | .readpage = ext2_readpage, | 711 | .readpage = ext2_readpage, |
696 | .readpages = ext2_readpages, | 712 | .readpages = ext2_readpages, |
@@ -910,7 +926,9 @@ void ext2_truncate (struct inode * inode) | |||
910 | iblock = (inode->i_size + blocksize-1) | 926 | iblock = (inode->i_size + blocksize-1) |
911 | >> EXT2_BLOCK_SIZE_BITS(inode->i_sb); | 927 | >> EXT2_BLOCK_SIZE_BITS(inode->i_sb); |
912 | 928 | ||
913 | if (test_opt(inode->i_sb, NOBH)) | 929 | if (mapping_is_xip(inode->i_mapping)) |
930 | xip_truncate_page(inode->i_mapping, inode->i_size); | ||
931 | else if (test_opt(inode->i_sb, NOBH)) | ||
914 | nobh_truncate_page(inode->i_mapping, inode->i_size); | 932 | nobh_truncate_page(inode->i_mapping, inode->i_size); |
915 | else | 933 | else |
916 | block_truncate_page(inode->i_mapping, | 934 | block_truncate_page(inode->i_mapping, |
@@ -1110,11 +1128,16 @@ void ext2_read_inode (struct inode * inode) | |||
1110 | 1128 | ||
1111 | if (S_ISREG(inode->i_mode)) { | 1129 | if (S_ISREG(inode->i_mode)) { |
1112 | inode->i_op = &ext2_file_inode_operations; | 1130 | inode->i_op = &ext2_file_inode_operations; |
1113 | inode->i_fop = &ext2_file_operations; | 1131 | if (ext2_use_xip(inode->i_sb)) { |
1114 | if (test_opt(inode->i_sb, NOBH)) | 1132 | inode->i_mapping->a_ops = &ext2_aops_xip; |
1133 | inode->i_fop = &ext2_xip_file_operations; | ||
1134 | } else if (test_opt(inode->i_sb, NOBH)) { | ||
1115 | inode->i_mapping->a_ops = &ext2_nobh_aops; | 1135 | inode->i_mapping->a_ops = &ext2_nobh_aops; |
1116 | else | 1136 | inode->i_fop = &ext2_file_operations; |
1137 | } else { | ||
1117 | inode->i_mapping->a_ops = &ext2_aops; | 1138 | inode->i_mapping->a_ops = &ext2_aops; |
1139 | inode->i_fop = &ext2_file_operations; | ||
1140 | } | ||
1118 | } else if (S_ISDIR(inode->i_mode)) { | 1141 | } else if (S_ISDIR(inode->i_mode)) { |
1119 | inode->i_op = &ext2_dir_inode_operations; | 1142 | inode->i_op = &ext2_dir_inode_operations; |
1120 | inode->i_fop = &ext2_dir_operations; | 1143 | inode->i_fop = &ext2_dir_operations; |