diff options
-rw-r--r-- | fs/ext4/balloc.c | 3 | ||||
-rw-r--r-- | fs/ext4/bitmap.c | 12 | ||||
-rw-r--r-- | fs/ext4/ext4.h | 26 | ||||
-rw-r--r-- | fs/ext4/ext4_jbd2.c | 8 | ||||
-rw-r--r-- | fs/ext4/ext4_jbd2.h | 25 | ||||
-rw-r--r-- | fs/ext4/extents.c | 51 | ||||
-rw-r--r-- | fs/ext4/file.c | 121 | ||||
-rw-r--r-- | fs/ext4/ialloc.c | 5 | ||||
-rw-r--r-- | fs/ext4/inode.c | 126 | ||||
-rw-r--r-- | fs/ext4/mballoc.c | 26 | ||||
-rw-r--r-- | fs/ext4/namei.c | 15 | ||||
-rw-r--r-- | fs/ext4/resize.c | 7 | ||||
-rw-r--r-- | fs/ext4/super.c | 323 | ||||
-rw-r--r-- | fs/ext4/xattr.c | 11 |
14 files changed, 563 insertions, 196 deletions
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index cee7812cc3cf..d23b31ca9d7a 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c | |||
@@ -609,7 +609,8 @@ ext4_fsblk_t ext4_count_free_clusters(struct super_block *sb) | |||
609 | if (bitmap_bh == NULL) | 609 | if (bitmap_bh == NULL) |
610 | continue; | 610 | continue; |
611 | 611 | ||
612 | x = ext4_count_free(bitmap_bh, sb->s_blocksize); | 612 | x = ext4_count_free(bitmap_bh->b_data, |
613 | EXT4_BLOCKS_PER_GROUP(sb) / 8); | ||
613 | printk(KERN_DEBUG "group %u: stored = %d, counted = %u\n", | 614 | printk(KERN_DEBUG "group %u: stored = %d, counted = %u\n", |
614 | i, ext4_free_group_clusters(sb, gdp), x); | 615 | i, ext4_free_group_clusters(sb, gdp), x); |
615 | bitmap_count += x; | 616 | bitmap_count += x; |
diff --git a/fs/ext4/bitmap.c b/fs/ext4/bitmap.c index b319721da26a..a94b9c63ee5c 100644 --- a/fs/ext4/bitmap.c +++ b/fs/ext4/bitmap.c | |||
@@ -11,24 +11,18 @@ | |||
11 | #include <linux/jbd2.h> | 11 | #include <linux/jbd2.h> |
12 | #include "ext4.h" | 12 | #include "ext4.h" |
13 | 13 | ||
14 | #ifdef EXT4FS_DEBUG | ||
15 | |||
16 | static const int nibblemap[] = {4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0}; | 14 | static const int nibblemap[] = {4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0}; |
17 | 15 | ||
18 | unsigned int ext4_count_free(struct buffer_head *map, unsigned int numchars) | 16 | unsigned int ext4_count_free(char *bitmap, unsigned int numchars) |
19 | { | 17 | { |
20 | unsigned int i, sum = 0; | 18 | unsigned int i, sum = 0; |
21 | 19 | ||
22 | if (!map) | ||
23 | return 0; | ||
24 | for (i = 0; i < numchars; i++) | 20 | for (i = 0; i < numchars; i++) |
25 | sum += nibblemap[map->b_data[i] & 0xf] + | 21 | sum += nibblemap[bitmap[i] & 0xf] + |
26 | nibblemap[(map->b_data[i] >> 4) & 0xf]; | 22 | nibblemap[(bitmap[i] >> 4) & 0xf]; |
27 | return sum; | 23 | return sum; |
28 | } | 24 | } |
29 | 25 | ||
30 | #endif /* EXT4FS_DEBUG */ | ||
31 | |||
32 | int ext4_inode_bitmap_csum_verify(struct super_block *sb, ext4_group_t group, | 26 | int ext4_inode_bitmap_csum_verify(struct super_block *sb, ext4_group_t group, |
33 | struct ext4_group_desc *gdp, | 27 | struct ext4_group_desc *gdp, |
34 | struct buffer_head *bh, int sz) | 28 | struct buffer_head *bh, int sz) |
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index cfc4e01b3c83..c3411d4ce2da 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -571,6 +571,8 @@ enum { | |||
571 | #define EXT4_GET_BLOCKS_NO_NORMALIZE 0x0040 | 571 | #define EXT4_GET_BLOCKS_NO_NORMALIZE 0x0040 |
572 | /* Request will not result in inode size update (user for fallocate) */ | 572 | /* Request will not result in inode size update (user for fallocate) */ |
573 | #define EXT4_GET_BLOCKS_KEEP_SIZE 0x0080 | 573 | #define EXT4_GET_BLOCKS_KEEP_SIZE 0x0080 |
574 | /* Do not take i_data_sem locking in ext4_map_blocks */ | ||
575 | #define EXT4_GET_BLOCKS_NO_LOCK 0x0100 | ||
574 | 576 | ||
575 | /* | 577 | /* |
576 | * Flags used by ext4_free_blocks | 578 | * Flags used by ext4_free_blocks |
@@ -1161,8 +1163,7 @@ struct ext4_sb_info { | |||
1161 | unsigned long s_desc_per_block; /* Number of group descriptors per block */ | 1163 | unsigned long s_desc_per_block; /* Number of group descriptors per block */ |
1162 | ext4_group_t s_groups_count; /* Number of groups in the fs */ | 1164 | ext4_group_t s_groups_count; /* Number of groups in the fs */ |
1163 | ext4_group_t s_blockfile_groups;/* Groups acceptable for non-extent files */ | 1165 | ext4_group_t s_blockfile_groups;/* Groups acceptable for non-extent files */ |
1164 | unsigned long s_overhead_last; /* Last calculated overhead */ | 1166 | unsigned long s_overhead; /* # of fs overhead clusters */ |
1165 | unsigned long s_blocks_last; /* Last seen block count */ | ||
1166 | unsigned int s_cluster_ratio; /* Number of blocks per cluster */ | 1167 | unsigned int s_cluster_ratio; /* Number of blocks per cluster */ |
1167 | unsigned int s_cluster_bits; /* log2 of s_cluster_ratio */ | 1168 | unsigned int s_cluster_bits; /* log2 of s_cluster_ratio */ |
1168 | loff_t s_bitmap_maxbytes; /* max bytes for bitmap files */ | 1169 | loff_t s_bitmap_maxbytes; /* max bytes for bitmap files */ |
@@ -1314,6 +1315,8 @@ static inline struct timespec ext4_current_time(struct inode *inode) | |||
1314 | static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino) | 1315 | static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino) |
1315 | { | 1316 | { |
1316 | return ino == EXT4_ROOT_INO || | 1317 | return ino == EXT4_ROOT_INO || |
1318 | ino == EXT4_USR_QUOTA_INO || | ||
1319 | ino == EXT4_GRP_QUOTA_INO || | ||
1317 | ino == EXT4_JOURNAL_INO || | 1320 | ino == EXT4_JOURNAL_INO || |
1318 | ino == EXT4_RESIZE_INO || | 1321 | ino == EXT4_RESIZE_INO || |
1319 | (ino >= EXT4_FIRST_INO(sb) && | 1322 | (ino >= EXT4_FIRST_INO(sb) && |
@@ -1496,7 +1499,8 @@ static inline void ext4_clear_state_flags(struct ext4_inode_info *ei) | |||
1496 | EXT4_FEATURE_RO_COMPAT_BTREE_DIR |\ | 1499 | EXT4_FEATURE_RO_COMPAT_BTREE_DIR |\ |
1497 | EXT4_FEATURE_RO_COMPAT_HUGE_FILE |\ | 1500 | EXT4_FEATURE_RO_COMPAT_HUGE_FILE |\ |
1498 | EXT4_FEATURE_RO_COMPAT_BIGALLOC |\ | 1501 | EXT4_FEATURE_RO_COMPAT_BIGALLOC |\ |
1499 | EXT4_FEATURE_RO_COMPAT_METADATA_CSUM) | 1502 | EXT4_FEATURE_RO_COMPAT_METADATA_CSUM|\ |
1503 | EXT4_FEATURE_RO_COMPAT_QUOTA) | ||
1500 | 1504 | ||
1501 | /* | 1505 | /* |
1502 | * Default values for user and/or group using reserved blocks | 1506 | * Default values for user and/or group using reserved blocks |
@@ -1663,10 +1667,12 @@ static inline u32 ext4_chksum(struct ext4_sb_info *sbi, u32 crc, | |||
1663 | { | 1667 | { |
1664 | struct { | 1668 | struct { |
1665 | struct shash_desc shash; | 1669 | struct shash_desc shash; |
1666 | char ctx[crypto_shash_descsize(sbi->s_chksum_driver)]; | 1670 | char ctx[4]; |
1667 | } desc; | 1671 | } desc; |
1668 | int err; | 1672 | int err; |
1669 | 1673 | ||
1674 | BUG_ON(crypto_shash_descsize(sbi->s_chksum_driver)!=sizeof(desc.ctx)); | ||
1675 | |||
1670 | desc.shash.tfm = sbi->s_chksum_driver; | 1676 | desc.shash.tfm = sbi->s_chksum_driver; |
1671 | desc.shash.flags = 0; | 1677 | desc.shash.flags = 0; |
1672 | *(u32 *)desc.ctx = crc; | 1678 | *(u32 *)desc.ctx = crc; |
@@ -1852,7 +1858,7 @@ struct mmpd_data { | |||
1852 | # define NORET_AND noreturn, | 1858 | # define NORET_AND noreturn, |
1853 | 1859 | ||
1854 | /* bitmap.c */ | 1860 | /* bitmap.c */ |
1855 | extern unsigned int ext4_count_free(struct buffer_head *, unsigned); | 1861 | extern unsigned int ext4_count_free(char *bitmap, unsigned numchars); |
1856 | void ext4_inode_bitmap_csum_set(struct super_block *sb, ext4_group_t group, | 1862 | void ext4_inode_bitmap_csum_set(struct super_block *sb, ext4_group_t group, |
1857 | struct ext4_group_desc *gdp, | 1863 | struct ext4_group_desc *gdp, |
1858 | struct buffer_head *bh, int sz); | 1864 | struct buffer_head *bh, int sz); |
@@ -2037,6 +2043,7 @@ extern int ext4_group_extend(struct super_block *sb, | |||
2037 | extern int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count); | 2043 | extern int ext4_resize_fs(struct super_block *sb, ext4_fsblk_t n_blocks_count); |
2038 | 2044 | ||
2039 | /* super.c */ | 2045 | /* super.c */ |
2046 | extern int ext4_calculate_overhead(struct super_block *sb); | ||
2040 | extern int ext4_superblock_csum_verify(struct super_block *sb, | 2047 | extern int ext4_superblock_csum_verify(struct super_block *sb, |
2041 | struct ext4_super_block *es); | 2048 | struct ext4_super_block *es); |
2042 | extern void ext4_superblock_csum_set(struct super_block *sb, | 2049 | extern void ext4_superblock_csum_set(struct super_block *sb, |
@@ -2321,15 +2328,6 @@ static inline void ext4_unlock_group(struct super_block *sb, | |||
2321 | spin_unlock(ext4_group_lock_ptr(sb, group)); | 2328 | spin_unlock(ext4_group_lock_ptr(sb, group)); |
2322 | } | 2329 | } |
2323 | 2330 | ||
2324 | static inline void ext4_mark_super_dirty(struct super_block *sb) | ||
2325 | { | ||
2326 | struct ext4_super_block *es = EXT4_SB(sb)->s_es; | ||
2327 | |||
2328 | ext4_superblock_csum_set(sb, es); | ||
2329 | if (EXT4_SB(sb)->s_journal == NULL) | ||
2330 | sb->s_dirt =1; | ||
2331 | } | ||
2332 | |||
2333 | /* | 2331 | /* |
2334 | * Block validity checking | 2332 | * Block validity checking |
2335 | */ | 2333 | */ |
diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c index 90f7c2e84db1..bfa65b49d424 100644 --- a/fs/ext4/ext4_jbd2.c +++ b/fs/ext4/ext4_jbd2.c | |||
@@ -138,8 +138,7 @@ int __ext4_handle_dirty_metadata(const char *where, unsigned int line, | |||
138 | } | 138 | } |
139 | 139 | ||
140 | int __ext4_handle_dirty_super(const char *where, unsigned int line, | 140 | int __ext4_handle_dirty_super(const char *where, unsigned int line, |
141 | handle_t *handle, struct super_block *sb, | 141 | handle_t *handle, struct super_block *sb) |
142 | int now) | ||
143 | { | 142 | { |
144 | struct buffer_head *bh = EXT4_SB(sb)->s_sbh; | 143 | struct buffer_head *bh = EXT4_SB(sb)->s_sbh; |
145 | int err = 0; | 144 | int err = 0; |
@@ -151,11 +150,10 @@ int __ext4_handle_dirty_super(const char *where, unsigned int line, | |||
151 | if (err) | 150 | if (err) |
152 | ext4_journal_abort_handle(where, line, __func__, | 151 | ext4_journal_abort_handle(where, line, __func__, |
153 | bh, handle, err); | 152 | bh, handle, err); |
154 | } else if (now) { | 153 | } else { |
155 | ext4_superblock_csum_set(sb, | 154 | ext4_superblock_csum_set(sb, |
156 | (struct ext4_super_block *)bh->b_data); | 155 | (struct ext4_super_block *)bh->b_data); |
157 | mark_buffer_dirty(bh); | 156 | mark_buffer_dirty(bh); |
158 | } else | 157 | } |
159 | sb->s_dirt = 1; | ||
160 | return err; | 158 | return err; |
161 | } | 159 | } |
diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h index f440e8f1841f..56d258c18303 100644 --- a/fs/ext4/ext4_jbd2.h +++ b/fs/ext4/ext4_jbd2.h | |||
@@ -87,14 +87,20 @@ | |||
87 | #ifdef CONFIG_QUOTA | 87 | #ifdef CONFIG_QUOTA |
88 | /* Amount of blocks needed for quota update - we know that the structure was | 88 | /* Amount of blocks needed for quota update - we know that the structure was |
89 | * allocated so we need to update only data block */ | 89 | * allocated so we need to update only data block */ |
90 | #define EXT4_QUOTA_TRANS_BLOCKS(sb) (test_opt(sb, QUOTA) ? 1 : 0) | 90 | #define EXT4_QUOTA_TRANS_BLOCKS(sb) ((test_opt(sb, QUOTA) ||\ |
91 | EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) ?\ | ||
92 | 1 : 0) | ||
91 | /* Amount of blocks needed for quota insert/delete - we do some block writes | 93 | /* Amount of blocks needed for quota insert/delete - we do some block writes |
92 | * but inode, sb and group updates are done only once */ | 94 | * but inode, sb and group updates are done only once */ |
93 | #define EXT4_QUOTA_INIT_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_INIT_ALLOC*\ | 95 | #define EXT4_QUOTA_INIT_BLOCKS(sb) ((test_opt(sb, QUOTA) ||\ |
94 | (EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)+3+DQUOT_INIT_REWRITE) : 0) | 96 | EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) ?\ |
95 | 97 | (DQUOT_INIT_ALLOC*(EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)\ | |
96 | #define EXT4_QUOTA_DEL_BLOCKS(sb) (test_opt(sb, QUOTA) ? (DQUOT_DEL_ALLOC*\ | 98 | +3+DQUOT_INIT_REWRITE) : 0) |
97 | (EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)+3+DQUOT_DEL_REWRITE) : 0) | 99 | |
100 | #define EXT4_QUOTA_DEL_BLOCKS(sb) ((test_opt(sb, QUOTA) ||\ | ||
101 | EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) ?\ | ||
102 | (DQUOT_DEL_ALLOC*(EXT4_SINGLEDATA_TRANS_BLOCKS(sb)-3)\ | ||
103 | +3+DQUOT_DEL_REWRITE) : 0) | ||
98 | #else | 104 | #else |
99 | #define EXT4_QUOTA_TRANS_BLOCKS(sb) 0 | 105 | #define EXT4_QUOTA_TRANS_BLOCKS(sb) 0 |
100 | #define EXT4_QUOTA_INIT_BLOCKS(sb) 0 | 106 | #define EXT4_QUOTA_INIT_BLOCKS(sb) 0 |
@@ -213,8 +219,7 @@ int __ext4_handle_dirty_metadata(const char *where, unsigned int line, | |||
213 | struct buffer_head *bh); | 219 | struct buffer_head *bh); |
214 | 220 | ||
215 | int __ext4_handle_dirty_super(const char *where, unsigned int line, | 221 | int __ext4_handle_dirty_super(const char *where, unsigned int line, |
216 | handle_t *handle, struct super_block *sb, | 222 | handle_t *handle, struct super_block *sb); |
217 | int now); | ||
218 | 223 | ||
219 | #define ext4_journal_get_write_access(handle, bh) \ | 224 | #define ext4_journal_get_write_access(handle, bh) \ |
220 | __ext4_journal_get_write_access(__func__, __LINE__, (handle), (bh)) | 225 | __ext4_journal_get_write_access(__func__, __LINE__, (handle), (bh)) |
@@ -226,10 +231,8 @@ int __ext4_handle_dirty_super(const char *where, unsigned int line, | |||
226 | #define ext4_handle_dirty_metadata(handle, inode, bh) \ | 231 | #define ext4_handle_dirty_metadata(handle, inode, bh) \ |
227 | __ext4_handle_dirty_metadata(__func__, __LINE__, (handle), (inode), \ | 232 | __ext4_handle_dirty_metadata(__func__, __LINE__, (handle), (inode), \ |
228 | (bh)) | 233 | (bh)) |
229 | #define ext4_handle_dirty_super_now(handle, sb) \ | ||
230 | __ext4_handle_dirty_super(__func__, __LINE__, (handle), (sb), 1) | ||
231 | #define ext4_handle_dirty_super(handle, sb) \ | 234 | #define ext4_handle_dirty_super(handle, sb) \ |
232 | __ext4_handle_dirty_super(__func__, __LINE__, (handle), (sb), 0) | 235 | __ext4_handle_dirty_super(__func__, __LINE__, (handle), (sb)) |
233 | 236 | ||
234 | handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks); | 237 | handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks); |
235 | int __ext4_journal_stop(const char *where, unsigned int line, handle_t *handle); | 238 | int __ext4_journal_stop(const char *where, unsigned int line, handle_t *handle); |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 91341ec6e06a..cd0c7ed06772 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -1891,11 +1891,10 @@ has_space: | |||
1891 | nearex->ee_len = newext->ee_len; | 1891 | nearex->ee_len = newext->ee_len; |
1892 | 1892 | ||
1893 | merge: | 1893 | merge: |
1894 | /* try to merge extents to the right */ | 1894 | /* try to merge extents */ |
1895 | if (!(flag & EXT4_GET_BLOCKS_PRE_IO)) | 1895 | if (!(flag & EXT4_GET_BLOCKS_PRE_IO)) |
1896 | ext4_ext_try_to_merge(inode, path, nearex); | 1896 | ext4_ext_try_to_merge(inode, path, nearex); |
1897 | 1897 | ||
1898 | /* try to merge extents to the left */ | ||
1899 | 1898 | ||
1900 | /* time to correct all indexes above */ | 1899 | /* time to correct all indexes above */ |
1901 | err = ext4_ext_correct_indexes(handle, inode, path); | 1900 | err = ext4_ext_correct_indexes(handle, inode, path); |
@@ -2570,10 +2569,10 @@ static int ext4_ext_remove_space(struct inode *inode, ext4_lblk_t start, | |||
2570 | { | 2569 | { |
2571 | struct super_block *sb = inode->i_sb; | 2570 | struct super_block *sb = inode->i_sb; |
2572 | int depth = ext_depth(inode); | 2571 | int depth = ext_depth(inode); |
2573 | struct ext4_ext_path *path; | 2572 | struct ext4_ext_path *path = NULL; |
2574 | ext4_fsblk_t partial_cluster = 0; | 2573 | ext4_fsblk_t partial_cluster = 0; |
2575 | handle_t *handle; | 2574 | handle_t *handle; |
2576 | int i, err; | 2575 | int i = 0, err; |
2577 | 2576 | ||
2578 | ext_debug("truncate since %u to %u\n", start, end); | 2577 | ext_debug("truncate since %u to %u\n", start, end); |
2579 | 2578 | ||
@@ -2606,8 +2605,12 @@ again: | |||
2606 | } | 2605 | } |
2607 | depth = ext_depth(inode); | 2606 | depth = ext_depth(inode); |
2608 | ex = path[depth].p_ext; | 2607 | ex = path[depth].p_ext; |
2609 | if (!ex) | 2608 | if (!ex) { |
2609 | ext4_ext_drop_refs(path); | ||
2610 | kfree(path); | ||
2611 | path = NULL; | ||
2610 | goto cont; | 2612 | goto cont; |
2613 | } | ||
2611 | 2614 | ||
2612 | ee_block = le32_to_cpu(ex->ee_block); | 2615 | ee_block = le32_to_cpu(ex->ee_block); |
2613 | 2616 | ||
@@ -2637,8 +2640,6 @@ again: | |||
2637 | if (err < 0) | 2640 | if (err < 0) |
2638 | goto out; | 2641 | goto out; |
2639 | } | 2642 | } |
2640 | ext4_ext_drop_refs(path); | ||
2641 | kfree(path); | ||
2642 | } | 2643 | } |
2643 | cont: | 2644 | cont: |
2644 | 2645 | ||
@@ -2647,19 +2648,27 @@ cont: | |||
2647 | * after i_size and walking into the tree depth-wise. | 2648 | * after i_size and walking into the tree depth-wise. |
2648 | */ | 2649 | */ |
2649 | depth = ext_depth(inode); | 2650 | depth = ext_depth(inode); |
2650 | path = kzalloc(sizeof(struct ext4_ext_path) * (depth + 1), GFP_NOFS); | 2651 | if (path) { |
2651 | if (path == NULL) { | 2652 | int k = i = depth; |
2652 | ext4_journal_stop(handle); | 2653 | while (--k > 0) |
2653 | return -ENOMEM; | 2654 | path[k].p_block = |
2654 | } | 2655 | le16_to_cpu(path[k].p_hdr->eh_entries)+1; |
2655 | path[0].p_depth = depth; | 2656 | } else { |
2656 | path[0].p_hdr = ext_inode_hdr(inode); | 2657 | path = kzalloc(sizeof(struct ext4_ext_path) * (depth + 1), |
2658 | GFP_NOFS); | ||
2659 | if (path == NULL) { | ||
2660 | ext4_journal_stop(handle); | ||
2661 | return -ENOMEM; | ||
2662 | } | ||
2663 | path[0].p_depth = depth; | ||
2664 | path[0].p_hdr = ext_inode_hdr(inode); | ||
2657 | 2665 | ||
2658 | if (ext4_ext_check(inode, path[0].p_hdr, depth)) { | 2666 | if (ext4_ext_check(inode, path[0].p_hdr, depth)) { |
2659 | err = -EIO; | 2667 | err = -EIO; |
2660 | goto out; | 2668 | goto out; |
2669 | } | ||
2661 | } | 2670 | } |
2662 | i = err = 0; | 2671 | err = 0; |
2663 | 2672 | ||
2664 | while (i >= 0 && err == 0) { | 2673 | while (i >= 0 && err == 0) { |
2665 | if (i == depth) { | 2674 | if (i == depth) { |
@@ -2773,8 +2782,10 @@ cont: | |||
2773 | out: | 2782 | out: |
2774 | ext4_ext_drop_refs(path); | 2783 | ext4_ext_drop_refs(path); |
2775 | kfree(path); | 2784 | kfree(path); |
2776 | if (err == -EAGAIN) | 2785 | if (err == -EAGAIN) { |
2786 | path = NULL; | ||
2777 | goto again; | 2787 | goto again; |
2788 | } | ||
2778 | ext4_journal_stop(handle); | 2789 | ext4_journal_stop(handle); |
2779 | 2790 | ||
2780 | return err; | 2791 | return err; |
@@ -4420,6 +4431,8 @@ retry: | |||
4420 | ext4_falloc_update_inode(inode, mode, new_size, | 4431 | ext4_falloc_update_inode(inode, mode, new_size, |
4421 | (map.m_flags & EXT4_MAP_NEW)); | 4432 | (map.m_flags & EXT4_MAP_NEW)); |
4422 | ext4_mark_inode_dirty(handle, inode); | 4433 | ext4_mark_inode_dirty(handle, inode); |
4434 | if ((file->f_flags & O_SYNC) && ret >= max_blocks) | ||
4435 | ext4_handle_sync(handle); | ||
4423 | ret2 = ext4_journal_stop(handle); | 4436 | ret2 = ext4_journal_stop(handle); |
4424 | if (ret2) | 4437 | if (ret2) |
4425 | break; | 4438 | break; |
diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 782eecb57e43..3b0e3bdaabfc 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c | |||
@@ -90,11 +90,91 @@ ext4_unaligned_aio(struct inode *inode, const struct iovec *iov, | |||
90 | } | 90 | } |
91 | 91 | ||
92 | static ssize_t | 92 | static ssize_t |
93 | ext4_file_dio_write(struct kiocb *iocb, const struct iovec *iov, | ||
94 | unsigned long nr_segs, loff_t pos) | ||
95 | { | ||
96 | struct file *file = iocb->ki_filp; | ||
97 | struct inode *inode = file->f_mapping->host; | ||
98 | struct blk_plug plug; | ||
99 | int unaligned_aio = 0; | ||
100 | ssize_t ret; | ||
101 | int overwrite = 0; | ||
102 | size_t length = iov_length(iov, nr_segs); | ||
103 | |||
104 | if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS) && | ||
105 | !is_sync_kiocb(iocb)) | ||
106 | unaligned_aio = ext4_unaligned_aio(inode, iov, nr_segs, pos); | ||
107 | |||
108 | /* Unaligned direct AIO must be serialized; see comment above */ | ||
109 | if (unaligned_aio) { | ||
110 | static unsigned long unaligned_warn_time; | ||
111 | |||
112 | /* Warn about this once per day */ | ||
113 | if (printk_timed_ratelimit(&unaligned_warn_time, 60*60*24*HZ)) | ||
114 | ext4_msg(inode->i_sb, KERN_WARNING, | ||
115 | "Unaligned AIO/DIO on inode %ld by %s; " | ||
116 | "performance will be poor.", | ||
117 | inode->i_ino, current->comm); | ||
118 | mutex_lock(ext4_aio_mutex(inode)); | ||
119 | ext4_aiodio_wait(inode); | ||
120 | } | ||
121 | |||
122 | BUG_ON(iocb->ki_pos != pos); | ||
123 | |||
124 | mutex_lock(&inode->i_mutex); | ||
125 | blk_start_plug(&plug); | ||
126 | |||
127 | iocb->private = &overwrite; | ||
128 | |||
129 | /* check whether we do a DIO overwrite or not */ | ||
130 | if (ext4_should_dioread_nolock(inode) && !unaligned_aio && | ||
131 | !file->f_mapping->nrpages && pos + length <= i_size_read(inode)) { | ||
132 | struct ext4_map_blocks map; | ||
133 | unsigned int blkbits = inode->i_blkbits; | ||
134 | int err, len; | ||
135 | |||
136 | map.m_lblk = pos >> blkbits; | ||
137 | map.m_len = (EXT4_BLOCK_ALIGN(pos + length, blkbits) >> blkbits) | ||
138 | - map.m_lblk; | ||
139 | len = map.m_len; | ||
140 | |||
141 | err = ext4_map_blocks(NULL, inode, &map, 0); | ||
142 | /* | ||
143 | * 'err==len' means that all of blocks has been preallocated no | ||
144 | * matter they are initialized or not. For excluding | ||
145 | * uninitialized extents, we need to check m_flags. There are | ||
146 | * two conditions that indicate for initialized extents. | ||
147 | * 1) If we hit extent cache, EXT4_MAP_MAPPED flag is returned; | ||
148 | * 2) If we do a real lookup, non-flags are returned. | ||
149 | * So we should check these two conditions. | ||
150 | */ | ||
151 | if (err == len && (map.m_flags & EXT4_MAP_MAPPED)) | ||
152 | overwrite = 1; | ||
153 | } | ||
154 | |||
155 | ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); | ||
156 | mutex_unlock(&inode->i_mutex); | ||
157 | |||
158 | if (ret > 0 || ret == -EIOCBQUEUED) { | ||
159 | ssize_t err; | ||
160 | |||
161 | err = generic_write_sync(file, pos, ret); | ||
162 | if (err < 0 && ret > 0) | ||
163 | ret = err; | ||
164 | } | ||
165 | blk_finish_plug(&plug); | ||
166 | |||
167 | if (unaligned_aio) | ||
168 | mutex_unlock(ext4_aio_mutex(inode)); | ||
169 | |||
170 | return ret; | ||
171 | } | ||
172 | |||
173 | static ssize_t | ||
93 | ext4_file_write(struct kiocb *iocb, const struct iovec *iov, | 174 | ext4_file_write(struct kiocb *iocb, const struct iovec *iov, |
94 | unsigned long nr_segs, loff_t pos) | 175 | unsigned long nr_segs, loff_t pos) |
95 | { | 176 | { |
96 | struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; | 177 | struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; |
97 | int unaligned_aio = 0; | ||
98 | ssize_t ret; | 178 | ssize_t ret; |
99 | 179 | ||
100 | /* | 180 | /* |
@@ -114,29 +194,12 @@ ext4_file_write(struct kiocb *iocb, const struct iovec *iov, | |||
114 | nr_segs = iov_shorten((struct iovec *)iov, nr_segs, | 194 | nr_segs = iov_shorten((struct iovec *)iov, nr_segs, |
115 | sbi->s_bitmap_maxbytes - pos); | 195 | sbi->s_bitmap_maxbytes - pos); |
116 | } | 196 | } |
117 | } else if (unlikely((iocb->ki_filp->f_flags & O_DIRECT) && | ||
118 | !is_sync_kiocb(iocb))) { | ||
119 | unaligned_aio = ext4_unaligned_aio(inode, iov, nr_segs, pos); | ||
120 | } | 197 | } |
121 | 198 | ||
122 | /* Unaligned direct AIO must be serialized; see comment above */ | 199 | if (unlikely(iocb->ki_filp->f_flags & O_DIRECT)) |
123 | if (unaligned_aio) { | 200 | ret = ext4_file_dio_write(iocb, iov, nr_segs, pos); |
124 | static unsigned long unaligned_warn_time; | 201 | else |
125 | 202 | ret = generic_file_aio_write(iocb, iov, nr_segs, pos); | |
126 | /* Warn about this once per day */ | ||
127 | if (printk_timed_ratelimit(&unaligned_warn_time, 60*60*24*HZ)) | ||
128 | ext4_msg(inode->i_sb, KERN_WARNING, | ||
129 | "Unaligned AIO/DIO on inode %ld by %s; " | ||
130 | "performance will be poor.", | ||
131 | inode->i_ino, current->comm); | ||
132 | mutex_lock(ext4_aio_mutex(inode)); | ||
133 | ext4_aiodio_wait(inode); | ||
134 | } | ||
135 | |||
136 | ret = generic_file_aio_write(iocb, iov, nr_segs, pos); | ||
137 | |||
138 | if (unaligned_aio) | ||
139 | mutex_unlock(ext4_aio_mutex(inode)); | ||
140 | 203 | ||
141 | return ret; | 204 | return ret; |
142 | } | 205 | } |
@@ -181,9 +244,21 @@ static int ext4_file_open(struct inode * inode, struct file * filp) | |||
181 | path.dentry = mnt->mnt_root; | 244 | path.dentry = mnt->mnt_root; |
182 | cp = d_path(&path, buf, sizeof(buf)); | 245 | cp = d_path(&path, buf, sizeof(buf)); |
183 | if (!IS_ERR(cp)) { | 246 | if (!IS_ERR(cp)) { |
247 | handle_t *handle; | ||
248 | int err; | ||
249 | |||
250 | handle = ext4_journal_start_sb(sb, 1); | ||
251 | if (IS_ERR(handle)) | ||
252 | return PTR_ERR(handle); | ||
253 | err = ext4_journal_get_write_access(handle, sbi->s_sbh); | ||
254 | if (err) { | ||
255 | ext4_journal_stop(handle); | ||
256 | return err; | ||
257 | } | ||
184 | strlcpy(sbi->s_es->s_last_mounted, cp, | 258 | strlcpy(sbi->s_es->s_last_mounted, cp, |
185 | sizeof(sbi->s_es->s_last_mounted)); | 259 | sizeof(sbi->s_es->s_last_mounted)); |
186 | ext4_mark_super_dirty(sb); | 260 | ext4_handle_dirty_super(handle, sb); |
261 | ext4_journal_stop(handle); | ||
187 | } | 262 | } |
188 | } | 263 | } |
189 | /* | 264 | /* |
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index d48e8b14928c..26154b81b836 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c | |||
@@ -315,7 +315,6 @@ out: | |||
315 | err = ext4_handle_dirty_metadata(handle, NULL, bitmap_bh); | 315 | err = ext4_handle_dirty_metadata(handle, NULL, bitmap_bh); |
316 | if (!fatal) | 316 | if (!fatal) |
317 | fatal = err; | 317 | fatal = err; |
318 | ext4_mark_super_dirty(sb); | ||
319 | } else | 318 | } else |
320 | ext4_error(sb, "bit already cleared for inode %lu", ino); | 319 | ext4_error(sb, "bit already cleared for inode %lu", ino); |
321 | 320 | ||
@@ -830,7 +829,6 @@ got: | |||
830 | percpu_counter_dec(&sbi->s_freeinodes_counter); | 829 | percpu_counter_dec(&sbi->s_freeinodes_counter); |
831 | if (S_ISDIR(mode)) | 830 | if (S_ISDIR(mode)) |
832 | percpu_counter_inc(&sbi->s_dirs_counter); | 831 | percpu_counter_inc(&sbi->s_dirs_counter); |
833 | ext4_mark_super_dirty(sb); | ||
834 | 832 | ||
835 | if (sbi->s_log_groups_per_flex) { | 833 | if (sbi->s_log_groups_per_flex) { |
836 | flex_group = ext4_flex_group(sbi, group); | 834 | flex_group = ext4_flex_group(sbi, group); |
@@ -1054,7 +1052,8 @@ unsigned long ext4_count_free_inodes(struct super_block *sb) | |||
1054 | if (!bitmap_bh) | 1052 | if (!bitmap_bh) |
1055 | continue; | 1053 | continue; |
1056 | 1054 | ||
1057 | x = ext4_count_free(bitmap_bh, EXT4_INODES_PER_GROUP(sb) / 8); | 1055 | x = ext4_count_free(bitmap_bh->b_data, |
1056 | EXT4_INODES_PER_GROUP(sb) / 8); | ||
1058 | printk(KERN_DEBUG "group %lu: stored = %d, counted = %lu\n", | 1057 | printk(KERN_DEBUG "group %lu: stored = %d, counted = %lu\n", |
1059 | (unsigned long) i, ext4_free_inodes_count(sb, gdp), x); | 1058 | (unsigned long) i, ext4_free_inodes_count(sb, gdp), x); |
1060 | bitmap_count += x; | 1059 | bitmap_count += x; |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 02bc8cbe7281..89b59cb7f9b8 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -346,6 +346,15 @@ void ext4_da_update_reserve_space(struct inode *inode, | |||
346 | used = ei->i_reserved_data_blocks; | 346 | used = ei->i_reserved_data_blocks; |
347 | } | 347 | } |
348 | 348 | ||
349 | if (unlikely(ei->i_allocated_meta_blocks > ei->i_reserved_meta_blocks)) { | ||
350 | ext4_msg(inode->i_sb, KERN_NOTICE, "%s: ino %lu, allocated %d " | ||
351 | "with only %d reserved metadata blocks\n", __func__, | ||
352 | inode->i_ino, ei->i_allocated_meta_blocks, | ||
353 | ei->i_reserved_meta_blocks); | ||
354 | WARN_ON(1); | ||
355 | ei->i_allocated_meta_blocks = ei->i_reserved_meta_blocks; | ||
356 | } | ||
357 | |||
349 | /* Update per-inode reservations */ | 358 | /* Update per-inode reservations */ |
350 | ei->i_reserved_data_blocks -= used; | 359 | ei->i_reserved_data_blocks -= used; |
351 | ei->i_reserved_meta_blocks -= ei->i_allocated_meta_blocks; | 360 | ei->i_reserved_meta_blocks -= ei->i_allocated_meta_blocks; |
@@ -544,7 +553,8 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode, | |||
544 | * Try to see if we can get the block without requesting a new | 553 | * Try to see if we can get the block without requesting a new |
545 | * file system block. | 554 | * file system block. |
546 | */ | 555 | */ |
547 | down_read((&EXT4_I(inode)->i_data_sem)); | 556 | if (!(flags & EXT4_GET_BLOCKS_NO_LOCK)) |
557 | down_read((&EXT4_I(inode)->i_data_sem)); | ||
548 | if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { | 558 | if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)) { |
549 | retval = ext4_ext_map_blocks(handle, inode, map, flags & | 559 | retval = ext4_ext_map_blocks(handle, inode, map, flags & |
550 | EXT4_GET_BLOCKS_KEEP_SIZE); | 560 | EXT4_GET_BLOCKS_KEEP_SIZE); |
@@ -552,7 +562,8 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode, | |||
552 | retval = ext4_ind_map_blocks(handle, inode, map, flags & | 562 | retval = ext4_ind_map_blocks(handle, inode, map, flags & |
553 | EXT4_GET_BLOCKS_KEEP_SIZE); | 563 | EXT4_GET_BLOCKS_KEEP_SIZE); |
554 | } | 564 | } |
555 | up_read((&EXT4_I(inode)->i_data_sem)); | 565 | if (!(flags & EXT4_GET_BLOCKS_NO_LOCK)) |
566 | up_read((&EXT4_I(inode)->i_data_sem)); | ||
556 | 567 | ||
557 | if (retval > 0 && map->m_flags & EXT4_MAP_MAPPED) { | 568 | if (retval > 0 && map->m_flags & EXT4_MAP_MAPPED) { |
558 | int ret = check_block_validity(inode, map); | 569 | int ret = check_block_validity(inode, map); |
@@ -1171,6 +1182,17 @@ static int ext4_da_reserve_space(struct inode *inode, ext4_lblk_t lblock) | |||
1171 | struct ext4_inode_info *ei = EXT4_I(inode); | 1182 | struct ext4_inode_info *ei = EXT4_I(inode); |
1172 | unsigned int md_needed; | 1183 | unsigned int md_needed; |
1173 | int ret; | 1184 | int ret; |
1185 | ext4_lblk_t save_last_lblock; | ||
1186 | int save_len; | ||
1187 | |||
1188 | /* | ||
1189 | * We will charge metadata quota at writeout time; this saves | ||
1190 | * us from metadata over-estimation, though we may go over by | ||
1191 | * a small amount in the end. Here we just reserve for data. | ||
1192 | */ | ||
1193 | ret = dquot_reserve_block(inode, EXT4_C2B(sbi, 1)); | ||
1194 | if (ret) | ||
1195 | return ret; | ||
1174 | 1196 | ||
1175 | /* | 1197 | /* |
1176 | * recalculate the amount of metadata blocks to reserve | 1198 | * recalculate the amount of metadata blocks to reserve |
@@ -1179,32 +1201,31 @@ static int ext4_da_reserve_space(struct inode *inode, ext4_lblk_t lblock) | |||
1179 | */ | 1201 | */ |
1180 | repeat: | 1202 | repeat: |
1181 | spin_lock(&ei->i_block_reservation_lock); | 1203 | spin_lock(&ei->i_block_reservation_lock); |
1204 | /* | ||
1205 | * ext4_calc_metadata_amount() has side effects, which we have | ||
1206 | * to be prepared undo if we fail to claim space. | ||
1207 | */ | ||
1208 | save_len = ei->i_da_metadata_calc_len; | ||
1209 | save_last_lblock = ei->i_da_metadata_calc_last_lblock; | ||
1182 | md_needed = EXT4_NUM_B2C(sbi, | 1210 | md_needed = EXT4_NUM_B2C(sbi, |
1183 | ext4_calc_metadata_amount(inode, lblock)); | 1211 | ext4_calc_metadata_amount(inode, lblock)); |
1184 | trace_ext4_da_reserve_space(inode, md_needed); | 1212 | trace_ext4_da_reserve_space(inode, md_needed); |
1185 | spin_unlock(&ei->i_block_reservation_lock); | ||
1186 | 1213 | ||
1187 | /* | 1214 | /* |
1188 | * We will charge metadata quota at writeout time; this saves | ||
1189 | * us from metadata over-estimation, though we may go over by | ||
1190 | * a small amount in the end. Here we just reserve for data. | ||
1191 | */ | ||
1192 | ret = dquot_reserve_block(inode, EXT4_C2B(sbi, 1)); | ||
1193 | if (ret) | ||
1194 | return ret; | ||
1195 | /* | ||
1196 | * We do still charge estimated metadata to the sb though; | 1215 | * We do still charge estimated metadata to the sb though; |
1197 | * we cannot afford to run out of free blocks. | 1216 | * we cannot afford to run out of free blocks. |
1198 | */ | 1217 | */ |
1199 | if (ext4_claim_free_clusters(sbi, md_needed + 1, 0)) { | 1218 | if (ext4_claim_free_clusters(sbi, md_needed + 1, 0)) { |
1200 | dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1)); | 1219 | ei->i_da_metadata_calc_len = save_len; |
1220 | ei->i_da_metadata_calc_last_lblock = save_last_lblock; | ||
1221 | spin_unlock(&ei->i_block_reservation_lock); | ||
1201 | if (ext4_should_retry_alloc(inode->i_sb, &retries)) { | 1222 | if (ext4_should_retry_alloc(inode->i_sb, &retries)) { |
1202 | yield(); | 1223 | yield(); |
1203 | goto repeat; | 1224 | goto repeat; |
1204 | } | 1225 | } |
1226 | dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1)); | ||
1205 | return -ENOSPC; | 1227 | return -ENOSPC; |
1206 | } | 1228 | } |
1207 | spin_lock(&ei->i_block_reservation_lock); | ||
1208 | ei->i_reserved_data_blocks++; | 1229 | ei->i_reserved_data_blocks++; |
1209 | ei->i_reserved_meta_blocks += md_needed; | 1230 | ei->i_reserved_meta_blocks += md_needed; |
1210 | spin_unlock(&ei->i_block_reservation_lock); | 1231 | spin_unlock(&ei->i_block_reservation_lock); |
@@ -2818,6 +2839,32 @@ static int ext4_get_block_write(struct inode *inode, sector_t iblock, | |||
2818 | EXT4_GET_BLOCKS_IO_CREATE_EXT); | 2839 | EXT4_GET_BLOCKS_IO_CREATE_EXT); |
2819 | } | 2840 | } |
2820 | 2841 | ||
2842 | static int ext4_get_block_write_nolock(struct inode *inode, sector_t iblock, | ||
2843 | struct buffer_head *bh_result, int flags) | ||
2844 | { | ||
2845 | handle_t *handle = ext4_journal_current_handle(); | ||
2846 | struct ext4_map_blocks map; | ||
2847 | int ret = 0; | ||
2848 | |||
2849 | ext4_debug("ext4_get_block_write_nolock: inode %lu, flag %d\n", | ||
2850 | inode->i_ino, flags); | ||
2851 | |||
2852 | flags = EXT4_GET_BLOCKS_NO_LOCK; | ||
2853 | |||
2854 | map.m_lblk = iblock; | ||
2855 | map.m_len = bh_result->b_size >> inode->i_blkbits; | ||
2856 | |||
2857 | ret = ext4_map_blocks(handle, inode, &map, flags); | ||
2858 | if (ret > 0) { | ||
2859 | map_bh(bh_result, inode->i_sb, map.m_pblk); | ||
2860 | bh_result->b_state = (bh_result->b_state & ~EXT4_MAP_FLAGS) | | ||
2861 | map.m_flags; | ||
2862 | bh_result->b_size = inode->i_sb->s_blocksize * map.m_len; | ||
2863 | ret = 0; | ||
2864 | } | ||
2865 | return ret; | ||
2866 | } | ||
2867 | |||
2821 | static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, | 2868 | static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, |
2822 | ssize_t size, void *private, int ret, | 2869 | ssize_t size, void *private, int ret, |
2823 | bool is_async) | 2870 | bool is_async) |
@@ -2966,6 +3013,18 @@ static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb, | |||
2966 | 3013 | ||
2967 | loff_t final_size = offset + count; | 3014 | loff_t final_size = offset + count; |
2968 | if (rw == WRITE && final_size <= inode->i_size) { | 3015 | if (rw == WRITE && final_size <= inode->i_size) { |
3016 | int overwrite = 0; | ||
3017 | |||
3018 | BUG_ON(iocb->private == NULL); | ||
3019 | |||
3020 | /* If we do a overwrite dio, i_mutex locking can be released */ | ||
3021 | overwrite = *((int *)iocb->private); | ||
3022 | |||
3023 | if (overwrite) { | ||
3024 | down_read(&EXT4_I(inode)->i_data_sem); | ||
3025 | mutex_unlock(&inode->i_mutex); | ||
3026 | } | ||
3027 | |||
2969 | /* | 3028 | /* |
2970 | * We could direct write to holes and fallocate. | 3029 | * We could direct write to holes and fallocate. |
2971 | * | 3030 | * |
@@ -2991,8 +3050,10 @@ static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb, | |||
2991 | if (!is_sync_kiocb(iocb)) { | 3050 | if (!is_sync_kiocb(iocb)) { |
2992 | ext4_io_end_t *io_end = | 3051 | ext4_io_end_t *io_end = |
2993 | ext4_init_io_end(inode, GFP_NOFS); | 3052 | ext4_init_io_end(inode, GFP_NOFS); |
2994 | if (!io_end) | 3053 | if (!io_end) { |
2995 | return -ENOMEM; | 3054 | ret = -ENOMEM; |
3055 | goto retake_lock; | ||
3056 | } | ||
2996 | io_end->flag |= EXT4_IO_END_DIRECT; | 3057 | io_end->flag |= EXT4_IO_END_DIRECT; |
2997 | iocb->private = io_end; | 3058 | iocb->private = io_end; |
2998 | /* | 3059 | /* |
@@ -3005,13 +3066,22 @@ static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb, | |||
3005 | EXT4_I(inode)->cur_aio_dio = iocb->private; | 3066 | EXT4_I(inode)->cur_aio_dio = iocb->private; |
3006 | } | 3067 | } |
3007 | 3068 | ||
3008 | ret = __blockdev_direct_IO(rw, iocb, inode, | 3069 | if (overwrite) |
3009 | inode->i_sb->s_bdev, iov, | 3070 | ret = __blockdev_direct_IO(rw, iocb, inode, |
3010 | offset, nr_segs, | 3071 | inode->i_sb->s_bdev, iov, |
3011 | ext4_get_block_write, | 3072 | offset, nr_segs, |
3012 | ext4_end_io_dio, | 3073 | ext4_get_block_write_nolock, |
3013 | NULL, | 3074 | ext4_end_io_dio, |
3014 | DIO_LOCKING); | 3075 | NULL, |
3076 | 0); | ||
3077 | else | ||
3078 | ret = __blockdev_direct_IO(rw, iocb, inode, | ||
3079 | inode->i_sb->s_bdev, iov, | ||
3080 | offset, nr_segs, | ||
3081 | ext4_get_block_write, | ||
3082 | ext4_end_io_dio, | ||
3083 | NULL, | ||
3084 | DIO_LOCKING); | ||
3015 | if (iocb->private) | 3085 | if (iocb->private) |
3016 | EXT4_I(inode)->cur_aio_dio = NULL; | 3086 | EXT4_I(inode)->cur_aio_dio = NULL; |
3017 | /* | 3087 | /* |
@@ -3031,7 +3101,7 @@ static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb, | |||
3031 | if (ret != -EIOCBQUEUED && ret <= 0 && iocb->private) { | 3101 | if (ret != -EIOCBQUEUED && ret <= 0 && iocb->private) { |
3032 | ext4_free_io_end(iocb->private); | 3102 | ext4_free_io_end(iocb->private); |
3033 | iocb->private = NULL; | 3103 | iocb->private = NULL; |
3034 | } else if (ret > 0 && ext4_test_inode_state(inode, | 3104 | } else if (ret > 0 && !overwrite && ext4_test_inode_state(inode, |
3035 | EXT4_STATE_DIO_UNWRITTEN)) { | 3105 | EXT4_STATE_DIO_UNWRITTEN)) { |
3036 | int err; | 3106 | int err; |
3037 | /* | 3107 | /* |
@@ -3044,6 +3114,14 @@ static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb, | |||
3044 | ret = err; | 3114 | ret = err; |
3045 | ext4_clear_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN); | 3115 | ext4_clear_inode_state(inode, EXT4_STATE_DIO_UNWRITTEN); |
3046 | } | 3116 | } |
3117 | |||
3118 | retake_lock: | ||
3119 | /* take i_mutex locking again if we do a ovewrite dio */ | ||
3120 | if (overwrite) { | ||
3121 | up_read(&EXT4_I(inode)->i_data_sem); | ||
3122 | mutex_lock(&inode->i_mutex); | ||
3123 | } | ||
3124 | |||
3047 | return ret; | 3125 | return ret; |
3048 | } | 3126 | } |
3049 | 3127 | ||
@@ -4034,7 +4112,7 @@ static int ext4_do_update_inode(handle_t *handle, | |||
4034 | EXT4_SET_RO_COMPAT_FEATURE(sb, | 4112 | EXT4_SET_RO_COMPAT_FEATURE(sb, |
4035 | EXT4_FEATURE_RO_COMPAT_LARGE_FILE); | 4113 | EXT4_FEATURE_RO_COMPAT_LARGE_FILE); |
4036 | ext4_handle_sync(handle); | 4114 | ext4_handle_sync(handle); |
4037 | err = ext4_handle_dirty_super_now(handle, sb); | 4115 | err = ext4_handle_dirty_super(handle, sb); |
4038 | } | 4116 | } |
4039 | } | 4117 | } |
4040 | raw_inode->i_generation = cpu_to_le32(inode->i_generation); | 4118 | raw_inode->i_generation = cpu_to_le32(inode->i_generation); |
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 1cd6994fc446..8eae94771c45 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
@@ -969,7 +969,6 @@ static int ext4_mb_get_buddy_page_lock(struct super_block *sb, | |||
969 | 969 | ||
970 | block++; | 970 | block++; |
971 | pnum = block / blocks_per_page; | 971 | pnum = block / blocks_per_page; |
972 | poff = block % blocks_per_page; | ||
973 | page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS); | 972 | page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS); |
974 | if (!page) | 973 | if (!page) |
975 | return -EIO; | 974 | return -EIO; |
@@ -2077,8 +2076,9 @@ static int ext4_mb_seq_groups_show(struct seq_file *seq, void *v) | |||
2077 | struct super_block *sb = seq->private; | 2076 | struct super_block *sb = seq->private; |
2078 | ext4_group_t group = (ext4_group_t) ((unsigned long) v); | 2077 | ext4_group_t group = (ext4_group_t) ((unsigned long) v); |
2079 | int i; | 2078 | int i; |
2080 | int err; | 2079 | int err, buddy_loaded = 0; |
2081 | struct ext4_buddy e4b; | 2080 | struct ext4_buddy e4b; |
2081 | struct ext4_group_info *grinfo; | ||
2082 | struct sg { | 2082 | struct sg { |
2083 | struct ext4_group_info info; | 2083 | struct ext4_group_info info; |
2084 | ext4_grpblk_t counters[16]; | 2084 | ext4_grpblk_t counters[16]; |
@@ -2095,15 +2095,21 @@ static int ext4_mb_seq_groups_show(struct seq_file *seq, void *v) | |||
2095 | 2095 | ||
2096 | i = (sb->s_blocksize_bits + 2) * sizeof(sg.info.bb_counters[0]) + | 2096 | i = (sb->s_blocksize_bits + 2) * sizeof(sg.info.bb_counters[0]) + |
2097 | sizeof(struct ext4_group_info); | 2097 | sizeof(struct ext4_group_info); |
2098 | err = ext4_mb_load_buddy(sb, group, &e4b); | 2098 | grinfo = ext4_get_group_info(sb, group); |
2099 | if (err) { | 2099 | /* Load the group info in memory only if not already loaded. */ |
2100 | seq_printf(seq, "#%-5u: I/O error\n", group); | 2100 | if (unlikely(EXT4_MB_GRP_NEED_INIT(grinfo))) { |
2101 | return 0; | 2101 | err = ext4_mb_load_buddy(sb, group, &e4b); |
2102 | if (err) { | ||
2103 | seq_printf(seq, "#%-5u: I/O error\n", group); | ||
2104 | return 0; | ||
2105 | } | ||
2106 | buddy_loaded = 1; | ||
2102 | } | 2107 | } |
2103 | ext4_lock_group(sb, group); | 2108 | |
2104 | memcpy(&sg, ext4_get_group_info(sb, group), i); | 2109 | memcpy(&sg, ext4_get_group_info(sb, group), i); |
2105 | ext4_unlock_group(sb, group); | 2110 | |
2106 | ext4_mb_unload_buddy(&e4b); | 2111 | if (buddy_loaded) |
2112 | ext4_mb_unload_buddy(&e4b); | ||
2107 | 2113 | ||
2108 | seq_printf(seq, "#%-5u: %-5u %-5u %-5u [", group, sg.info.bb_free, | 2114 | seq_printf(seq, "#%-5u: %-5u %-5u %-5u [", group, sg.info.bb_free, |
2109 | sg.info.bb_fragments, sg.info.bb_first_free); | 2115 | sg.info.bb_fragments, sg.info.bb_first_free); |
@@ -2825,7 +2831,6 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac, | |||
2825 | err = ext4_handle_dirty_metadata(handle, NULL, gdp_bh); | 2831 | err = ext4_handle_dirty_metadata(handle, NULL, gdp_bh); |
2826 | 2832 | ||
2827 | out_err: | 2833 | out_err: |
2828 | ext4_mark_super_dirty(sb); | ||
2829 | brelse(bitmap_bh); | 2834 | brelse(bitmap_bh); |
2830 | return err; | 2835 | return err; |
2831 | } | 2836 | } |
@@ -4694,7 +4699,6 @@ do_more: | |||
4694 | put_bh(bitmap_bh); | 4699 | put_bh(bitmap_bh); |
4695 | goto do_more; | 4700 | goto do_more; |
4696 | } | 4701 | } |
4697 | ext4_mark_super_dirty(sb); | ||
4698 | error_return: | 4702 | error_return: |
4699 | brelse(bitmap_bh); | 4703 | brelse(bitmap_bh); |
4700 | ext4_std_error(sb, err); | 4704 | ext4_std_error(sb, err); |
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index d0d3f0e87f99..2a42cc04466f 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
@@ -2397,7 +2397,7 @@ int ext4_orphan_add(handle_t *handle, struct inode *inode) | |||
2397 | /* Insert this inode at the head of the on-disk orphan list... */ | 2397 | /* Insert this inode at the head of the on-disk orphan list... */ |
2398 | NEXT_ORPHAN(inode) = le32_to_cpu(EXT4_SB(sb)->s_es->s_last_orphan); | 2398 | NEXT_ORPHAN(inode) = le32_to_cpu(EXT4_SB(sb)->s_es->s_last_orphan); |
2399 | EXT4_SB(sb)->s_es->s_last_orphan = cpu_to_le32(inode->i_ino); | 2399 | EXT4_SB(sb)->s_es->s_last_orphan = cpu_to_le32(inode->i_ino); |
2400 | err = ext4_handle_dirty_super_now(handle, sb); | 2400 | err = ext4_handle_dirty_super(handle, sb); |
2401 | rc = ext4_mark_iloc_dirty(handle, inode, &iloc); | 2401 | rc = ext4_mark_iloc_dirty(handle, inode, &iloc); |
2402 | if (!err) | 2402 | if (!err) |
2403 | err = rc; | 2403 | err = rc; |
@@ -2470,7 +2470,7 @@ int ext4_orphan_del(handle_t *handle, struct inode *inode) | |||
2470 | if (err) | 2470 | if (err) |
2471 | goto out_brelse; | 2471 | goto out_brelse; |
2472 | sbi->s_es->s_last_orphan = cpu_to_le32(ino_next); | 2472 | sbi->s_es->s_last_orphan = cpu_to_le32(ino_next); |
2473 | err = ext4_handle_dirty_super_now(handle, inode->i_sb); | 2473 | err = ext4_handle_dirty_super(handle, inode->i_sb); |
2474 | } else { | 2474 | } else { |
2475 | struct ext4_iloc iloc2; | 2475 | struct ext4_iloc iloc2; |
2476 | struct inode *i_prev = | 2476 | struct inode *i_prev = |
@@ -2918,8 +2918,15 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
2918 | PARENT_INO(dir_bh->b_data, new_dir->i_sb->s_blocksize) = | 2918 | PARENT_INO(dir_bh->b_data, new_dir->i_sb->s_blocksize) = |
2919 | cpu_to_le32(new_dir->i_ino); | 2919 | cpu_to_le32(new_dir->i_ino); |
2920 | BUFFER_TRACE(dir_bh, "call ext4_handle_dirty_metadata"); | 2920 | BUFFER_TRACE(dir_bh, "call ext4_handle_dirty_metadata"); |
2921 | retval = ext4_handle_dirty_dirent_node(handle, old_inode, | 2921 | if (is_dx(old_inode)) { |
2922 | dir_bh); | 2922 | retval = ext4_handle_dirty_dx_node(handle, |
2923 | old_inode, | ||
2924 | dir_bh); | ||
2925 | } else { | ||
2926 | retval = ext4_handle_dirty_dirent_node(handle, | ||
2927 | old_inode, | ||
2928 | dir_bh); | ||
2929 | } | ||
2923 | if (retval) { | 2930 | if (retval) { |
2924 | ext4_std_error(old_dir->i_sb, retval); | 2931 | ext4_std_error(old_dir->i_sb, retval); |
2925 | goto end_rename; | 2932 | goto end_rename; |
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index 7ea6cbb44121..41f6ef68e2e1 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
@@ -798,7 +798,7 @@ static int add_new_gdb(handle_t *handle, struct inode *inode, | |||
798 | ext4_kvfree(o_group_desc); | 798 | ext4_kvfree(o_group_desc); |
799 | 799 | ||
800 | le16_add_cpu(&es->s_reserved_gdt_blocks, -1); | 800 | le16_add_cpu(&es->s_reserved_gdt_blocks, -1); |
801 | err = ext4_handle_dirty_super_now(handle, sb); | 801 | err = ext4_handle_dirty_super(handle, sb); |
802 | if (err) | 802 | if (err) |
803 | ext4_std_error(sb, err); | 803 | ext4_std_error(sb, err); |
804 | 804 | ||
@@ -1272,6 +1272,11 @@ static void ext4_update_super(struct super_block *sb, | |||
1272 | &sbi->s_flex_groups[flex_group].free_inodes); | 1272 | &sbi->s_flex_groups[flex_group].free_inodes); |
1273 | } | 1273 | } |
1274 | 1274 | ||
1275 | /* | ||
1276 | * Update the fs overhead information | ||
1277 | */ | ||
1278 | ext4_calculate_overhead(sb); | ||
1279 | |||
1275 | if (test_opt(sb, DEBUG)) | 1280 | if (test_opt(sb, DEBUG)) |
1276 | printk(KERN_DEBUG "EXT4-fs: added group %u:" | 1281 | printk(KERN_DEBUG "EXT4-fs: added group %u:" |
1277 | "%llu blocks(%llu free %llu reserved)\n", flex_gd->count, | 1282 | "%llu blocks(%llu free %llu reserved)\n", flex_gd->count, |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index d8759401ecae..2d51cd9af225 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -74,7 +74,6 @@ static const char *ext4_decode_error(struct super_block *sb, int errno, | |||
74 | static int ext4_remount(struct super_block *sb, int *flags, char *data); | 74 | static int ext4_remount(struct super_block *sb, int *flags, char *data); |
75 | static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf); | 75 | static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf); |
76 | static int ext4_unfreeze(struct super_block *sb); | 76 | static int ext4_unfreeze(struct super_block *sb); |
77 | static void ext4_write_super(struct super_block *sb); | ||
78 | static int ext4_freeze(struct super_block *sb); | 77 | static int ext4_freeze(struct super_block *sb); |
79 | static struct dentry *ext4_mount(struct file_system_type *fs_type, int flags, | 78 | static struct dentry *ext4_mount(struct file_system_type *fs_type, int flags, |
80 | const char *dev_name, void *data); | 79 | const char *dev_name, void *data); |
@@ -896,7 +895,7 @@ static void ext4_put_super(struct super_block *sb) | |||
896 | EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); | 895 | EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); |
897 | es->s_state = cpu_to_le16(sbi->s_mount_state); | 896 | es->s_state = cpu_to_le16(sbi->s_mount_state); |
898 | } | 897 | } |
899 | if (sb->s_dirt || !(sb->s_flags & MS_RDONLY)) | 898 | if (!(sb->s_flags & MS_RDONLY)) |
900 | ext4_commit_super(sb, 1); | 899 | ext4_commit_super(sb, 1); |
901 | 900 | ||
902 | if (sbi->s_proc) { | 901 | if (sbi->s_proc) { |
@@ -1137,12 +1136,18 @@ static int ext4_mark_dquot_dirty(struct dquot *dquot); | |||
1137 | static int ext4_write_info(struct super_block *sb, int type); | 1136 | static int ext4_write_info(struct super_block *sb, int type); |
1138 | static int ext4_quota_on(struct super_block *sb, int type, int format_id, | 1137 | static int ext4_quota_on(struct super_block *sb, int type, int format_id, |
1139 | struct path *path); | 1138 | struct path *path); |
1139 | static int ext4_quota_on_sysfile(struct super_block *sb, int type, | ||
1140 | int format_id); | ||
1140 | static int ext4_quota_off(struct super_block *sb, int type); | 1141 | static int ext4_quota_off(struct super_block *sb, int type); |
1142 | static int ext4_quota_off_sysfile(struct super_block *sb, int type); | ||
1141 | static int ext4_quota_on_mount(struct super_block *sb, int type); | 1143 | static int ext4_quota_on_mount(struct super_block *sb, int type); |
1142 | static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data, | 1144 | static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data, |
1143 | size_t len, loff_t off); | 1145 | size_t len, loff_t off); |
1144 | static ssize_t ext4_quota_write(struct super_block *sb, int type, | 1146 | static ssize_t ext4_quota_write(struct super_block *sb, int type, |
1145 | const char *data, size_t len, loff_t off); | 1147 | const char *data, size_t len, loff_t off); |
1148 | static int ext4_quota_enable(struct super_block *sb, int type, int format_id, | ||
1149 | unsigned int flags); | ||
1150 | static int ext4_enable_quotas(struct super_block *sb); | ||
1146 | 1151 | ||
1147 | static const struct dquot_operations ext4_quota_operations = { | 1152 | static const struct dquot_operations ext4_quota_operations = { |
1148 | .get_reserved_space = ext4_get_reserved_space, | 1153 | .get_reserved_space = ext4_get_reserved_space, |
@@ -1164,6 +1169,16 @@ static const struct quotactl_ops ext4_qctl_operations = { | |||
1164 | .get_dqblk = dquot_get_dqblk, | 1169 | .get_dqblk = dquot_get_dqblk, |
1165 | .set_dqblk = dquot_set_dqblk | 1170 | .set_dqblk = dquot_set_dqblk |
1166 | }; | 1171 | }; |
1172 | |||
1173 | static const struct quotactl_ops ext4_qctl_sysfile_operations = { | ||
1174 | .quota_on_meta = ext4_quota_on_sysfile, | ||
1175 | .quota_off = ext4_quota_off_sysfile, | ||
1176 | .quota_sync = dquot_quota_sync, | ||
1177 | .get_info = dquot_get_dqinfo, | ||
1178 | .set_info = dquot_set_dqinfo, | ||
1179 | .get_dqblk = dquot_get_dqblk, | ||
1180 | .set_dqblk = dquot_set_dqblk | ||
1181 | }; | ||
1167 | #endif | 1182 | #endif |
1168 | 1183 | ||
1169 | static const struct super_operations ext4_sops = { | 1184 | static const struct super_operations ext4_sops = { |
@@ -1194,7 +1209,6 @@ static const struct super_operations ext4_nojournal_sops = { | |||
1194 | .dirty_inode = ext4_dirty_inode, | 1209 | .dirty_inode = ext4_dirty_inode, |
1195 | .drop_inode = ext4_drop_inode, | 1210 | .drop_inode = ext4_drop_inode, |
1196 | .evict_inode = ext4_evict_inode, | 1211 | .evict_inode = ext4_evict_inode, |
1197 | .write_super = ext4_write_super, | ||
1198 | .put_super = ext4_put_super, | 1212 | .put_super = ext4_put_super, |
1199 | .statfs = ext4_statfs, | 1213 | .statfs = ext4_statfs, |
1200 | .remount_fs = ext4_remount, | 1214 | .remount_fs = ext4_remount, |
@@ -2661,6 +2675,16 @@ static int ext4_feature_set_ok(struct super_block *sb, int readonly) | |||
2661 | "extents feature\n"); | 2675 | "extents feature\n"); |
2662 | return 0; | 2676 | return 0; |
2663 | } | 2677 | } |
2678 | |||
2679 | #ifndef CONFIG_QUOTA | ||
2680 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA) && | ||
2681 | !readonly) { | ||
2682 | ext4_msg(sb, KERN_ERR, | ||
2683 | "Filesystem with quota feature cannot be mounted RDWR " | ||
2684 | "without CONFIG_QUOTA"); | ||
2685 | return 0; | ||
2686 | } | ||
2687 | #endif /* CONFIG_QUOTA */ | ||
2664 | return 1; | 2688 | return 1; |
2665 | } | 2689 | } |
2666 | 2690 | ||
@@ -3085,6 +3109,114 @@ static int set_journal_csum_feature_set(struct super_block *sb) | |||
3085 | return ret; | 3109 | return ret; |
3086 | } | 3110 | } |
3087 | 3111 | ||
3112 | /* | ||
3113 | * Note: calculating the overhead so we can be compatible with | ||
3114 | * historical BSD practice is quite difficult in the face of | ||
3115 | * clusters/bigalloc. This is because multiple metadata blocks from | ||
3116 | * different block group can end up in the same allocation cluster. | ||
3117 | * Calculating the exact overhead in the face of clustered allocation | ||
3118 | * requires either O(all block bitmaps) in memory or O(number of block | ||
3119 | * groups**2) in time. We will still calculate the superblock for | ||
3120 | * older file systems --- and if we come across with a bigalloc file | ||
3121 | * system with zero in s_overhead_clusters the estimate will be close to | ||
3122 | * correct especially for very large cluster sizes --- but for newer | ||
3123 | * file systems, it's better to calculate this figure once at mkfs | ||
3124 | * time, and store it in the superblock. If the superblock value is | ||
3125 | * present (even for non-bigalloc file systems), we will use it. | ||
3126 | */ | ||
3127 | static int count_overhead(struct super_block *sb, ext4_group_t grp, | ||
3128 | char *buf) | ||
3129 | { | ||
3130 | struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
3131 | struct ext4_group_desc *gdp; | ||
3132 | ext4_fsblk_t first_block, last_block, b; | ||
3133 | ext4_group_t i, ngroups = ext4_get_groups_count(sb); | ||
3134 | int s, j, count = 0; | ||
3135 | |||
3136 | first_block = le32_to_cpu(sbi->s_es->s_first_data_block) + | ||
3137 | (grp * EXT4_BLOCKS_PER_GROUP(sb)); | ||
3138 | last_block = first_block + EXT4_BLOCKS_PER_GROUP(sb) - 1; | ||
3139 | for (i = 0; i < ngroups; i++) { | ||
3140 | gdp = ext4_get_group_desc(sb, i, NULL); | ||
3141 | b = ext4_block_bitmap(sb, gdp); | ||
3142 | if (b >= first_block && b <= last_block) { | ||
3143 | ext4_set_bit(EXT4_B2C(sbi, b - first_block), buf); | ||
3144 | count++; | ||
3145 | } | ||
3146 | b = ext4_inode_bitmap(sb, gdp); | ||
3147 | if (b >= first_block && b <= last_block) { | ||
3148 | ext4_set_bit(EXT4_B2C(sbi, b - first_block), buf); | ||
3149 | count++; | ||
3150 | } | ||
3151 | b = ext4_inode_table(sb, gdp); | ||
3152 | if (b >= first_block && b + sbi->s_itb_per_group <= last_block) | ||
3153 | for (j = 0; j < sbi->s_itb_per_group; j++, b++) { | ||
3154 | int c = EXT4_B2C(sbi, b - first_block); | ||
3155 | ext4_set_bit(c, buf); | ||
3156 | count++; | ||
3157 | } | ||
3158 | if (i != grp) | ||
3159 | continue; | ||
3160 | s = 0; | ||
3161 | if (ext4_bg_has_super(sb, grp)) { | ||
3162 | ext4_set_bit(s++, buf); | ||
3163 | count++; | ||
3164 | } | ||
3165 | for (j = ext4_bg_num_gdb(sb, grp); j > 0; j--) { | ||
3166 | ext4_set_bit(EXT4_B2C(sbi, s++), buf); | ||
3167 | count++; | ||
3168 | } | ||
3169 | } | ||
3170 | if (!count) | ||
3171 | return 0; | ||
3172 | return EXT4_CLUSTERS_PER_GROUP(sb) - | ||
3173 | ext4_count_free(buf, EXT4_CLUSTERS_PER_GROUP(sb) / 8); | ||
3174 | } | ||
3175 | |||
3176 | /* | ||
3177 | * Compute the overhead and stash it in sbi->s_overhead | ||
3178 | */ | ||
3179 | int ext4_calculate_overhead(struct super_block *sb) | ||
3180 | { | ||
3181 | struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
3182 | struct ext4_super_block *es = sbi->s_es; | ||
3183 | ext4_group_t i, ngroups = ext4_get_groups_count(sb); | ||
3184 | ext4_fsblk_t overhead = 0; | ||
3185 | char *buf = (char *) get_zeroed_page(GFP_KERNEL); | ||
3186 | |||
3187 | memset(buf, 0, PAGE_SIZE); | ||
3188 | if (!buf) | ||
3189 | return -ENOMEM; | ||
3190 | |||
3191 | /* | ||
3192 | * Compute the overhead (FS structures). This is constant | ||
3193 | * for a given filesystem unless the number of block groups | ||
3194 | * changes so we cache the previous value until it does. | ||
3195 | */ | ||
3196 | |||
3197 | /* | ||
3198 | * All of the blocks before first_data_block are overhead | ||
3199 | */ | ||
3200 | overhead = EXT4_B2C(sbi, le32_to_cpu(es->s_first_data_block)); | ||
3201 | |||
3202 | /* | ||
3203 | * Add the overhead found in each block group | ||
3204 | */ | ||
3205 | for (i = 0; i < ngroups; i++) { | ||
3206 | int blks; | ||
3207 | |||
3208 | blks = count_overhead(sb, i, buf); | ||
3209 | overhead += blks; | ||
3210 | if (blks) | ||
3211 | memset(buf, 0, PAGE_SIZE); | ||
3212 | cond_resched(); | ||
3213 | } | ||
3214 | sbi->s_overhead = overhead; | ||
3215 | smp_wmb(); | ||
3216 | free_page((unsigned long) buf); | ||
3217 | return 0; | ||
3218 | } | ||
3219 | |||
3088 | static int ext4_fill_super(struct super_block *sb, void *data, int silent) | 3220 | static int ext4_fill_super(struct super_block *sb, void *data, int silent) |
3089 | { | 3221 | { |
3090 | char *orig_data = kstrdup(data, GFP_KERNEL); | 3222 | char *orig_data = kstrdup(data, GFP_KERNEL); |
@@ -3640,6 +3772,11 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3640 | #ifdef CONFIG_QUOTA | 3772 | #ifdef CONFIG_QUOTA |
3641 | sb->s_qcop = &ext4_qctl_operations; | 3773 | sb->s_qcop = &ext4_qctl_operations; |
3642 | sb->dq_op = &ext4_quota_operations; | 3774 | sb->dq_op = &ext4_quota_operations; |
3775 | |||
3776 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) { | ||
3777 | /* Use qctl operations for hidden quota files. */ | ||
3778 | sb->s_qcop = &ext4_qctl_sysfile_operations; | ||
3779 | } | ||
3643 | #endif | 3780 | #endif |
3644 | memcpy(sb->s_uuid, es->s_uuid, sizeof(es->s_uuid)); | 3781 | memcpy(sb->s_uuid, es->s_uuid, sizeof(es->s_uuid)); |
3645 | 3782 | ||
@@ -3735,6 +3872,18 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3735 | 3872 | ||
3736 | no_journal: | 3873 | no_journal: |
3737 | /* | 3874 | /* |
3875 | * Get the # of file system overhead blocks from the | ||
3876 | * superblock if present. | ||
3877 | */ | ||
3878 | if (es->s_overhead_clusters) | ||
3879 | sbi->s_overhead = le32_to_cpu(es->s_overhead_clusters); | ||
3880 | else { | ||
3881 | ret = ext4_calculate_overhead(sb); | ||
3882 | if (ret) | ||
3883 | goto failed_mount_wq; | ||
3884 | } | ||
3885 | |||
3886 | /* | ||
3738 | * The maximum number of concurrent works can be high and | 3887 | * The maximum number of concurrent works can be high and |
3739 | * concurrency isn't really necessary. Limit it to 1. | 3888 | * concurrency isn't really necessary. Limit it to 1. |
3740 | */ | 3889 | */ |
@@ -3840,6 +3989,16 @@ no_journal: | |||
3840 | } else | 3989 | } else |
3841 | descr = "out journal"; | 3990 | descr = "out journal"; |
3842 | 3991 | ||
3992 | #ifdef CONFIG_QUOTA | ||
3993 | /* Enable quota usage during mount. */ | ||
3994 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA) && | ||
3995 | !(sb->s_flags & MS_RDONLY)) { | ||
3996 | ret = ext4_enable_quotas(sb); | ||
3997 | if (ret) | ||
3998 | goto failed_mount7; | ||
3999 | } | ||
4000 | #endif /* CONFIG_QUOTA */ | ||
4001 | |||
3843 | ext4_msg(sb, KERN_INFO, "mounted filesystem with%s. " | 4002 | ext4_msg(sb, KERN_INFO, "mounted filesystem with%s. " |
3844 | "Opts: %s%s%s", descr, sbi->s_es->s_mount_opts, | 4003 | "Opts: %s%s%s", descr, sbi->s_es->s_mount_opts, |
3845 | *sbi->s_es->s_mount_opts ? "; " : "", orig_data); | 4004 | *sbi->s_es->s_mount_opts ? "; " : "", orig_data); |
@@ -4203,7 +4362,6 @@ static int ext4_commit_super(struct super_block *sb, int sync) | |||
4203 | es->s_free_inodes_count = | 4362 | es->s_free_inodes_count = |
4204 | cpu_to_le32(percpu_counter_sum_positive( | 4363 | cpu_to_le32(percpu_counter_sum_positive( |
4205 | &EXT4_SB(sb)->s_freeinodes_counter)); | 4364 | &EXT4_SB(sb)->s_freeinodes_counter)); |
4206 | sb->s_dirt = 0; | ||
4207 | BUFFER_TRACE(sbh, "marking dirty"); | 4365 | BUFFER_TRACE(sbh, "marking dirty"); |
4208 | ext4_superblock_csum_set(sb, es); | 4366 | ext4_superblock_csum_set(sb, es); |
4209 | mark_buffer_dirty(sbh); | 4367 | mark_buffer_dirty(sbh); |
@@ -4310,13 +4468,6 @@ int ext4_force_commit(struct super_block *sb) | |||
4310 | return ret; | 4468 | return ret; |
4311 | } | 4469 | } |
4312 | 4470 | ||
4313 | static void ext4_write_super(struct super_block *sb) | ||
4314 | { | ||
4315 | lock_super(sb); | ||
4316 | ext4_commit_super(sb, 1); | ||
4317 | unlock_super(sb); | ||
4318 | } | ||
4319 | |||
4320 | static int ext4_sync_fs(struct super_block *sb, int wait) | 4471 | static int ext4_sync_fs(struct super_block *sb, int wait) |
4321 | { | 4472 | { |
4322 | int ret = 0; | 4473 | int ret = 0; |
@@ -4567,16 +4718,26 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
4567 | if (sbi->s_journal == NULL) | 4718 | if (sbi->s_journal == NULL) |
4568 | ext4_commit_super(sb, 1); | 4719 | ext4_commit_super(sb, 1); |
4569 | 4720 | ||
4721 | unlock_super(sb); | ||
4570 | #ifdef CONFIG_QUOTA | 4722 | #ifdef CONFIG_QUOTA |
4571 | /* Release old quota file names */ | 4723 | /* Release old quota file names */ |
4572 | for (i = 0; i < MAXQUOTAS; i++) | 4724 | for (i = 0; i < MAXQUOTAS; i++) |
4573 | if (old_opts.s_qf_names[i] && | 4725 | if (old_opts.s_qf_names[i] && |
4574 | old_opts.s_qf_names[i] != sbi->s_qf_names[i]) | 4726 | old_opts.s_qf_names[i] != sbi->s_qf_names[i]) |
4575 | kfree(old_opts.s_qf_names[i]); | 4727 | kfree(old_opts.s_qf_names[i]); |
4728 | if (enable_quota) { | ||
4729 | if (sb_any_quota_suspended(sb)) | ||
4730 | dquot_resume(sb, -1); | ||
4731 | else if (EXT4_HAS_RO_COMPAT_FEATURE(sb, | ||
4732 | EXT4_FEATURE_RO_COMPAT_QUOTA)) { | ||
4733 | err = ext4_enable_quotas(sb); | ||
4734 | if (err) { | ||
4735 | lock_super(sb); | ||
4736 | goto restore_opts; | ||
4737 | } | ||
4738 | } | ||
4739 | } | ||
4576 | #endif | 4740 | #endif |
4577 | unlock_super(sb); | ||
4578 | if (enable_quota) | ||
4579 | dquot_resume(sb, -1); | ||
4580 | 4741 | ||
4581 | ext4_msg(sb, KERN_INFO, "re-mounted. Opts: %s", orig_data); | 4742 | ext4_msg(sb, KERN_INFO, "re-mounted. Opts: %s", orig_data); |
4582 | kfree(orig_data); | 4743 | kfree(orig_data); |
@@ -4605,67 +4766,21 @@ restore_opts: | |||
4605 | return err; | 4766 | return err; |
4606 | } | 4767 | } |
4607 | 4768 | ||
4608 | /* | ||
4609 | * Note: calculating the overhead so we can be compatible with | ||
4610 | * historical BSD practice is quite difficult in the face of | ||
4611 | * clusters/bigalloc. This is because multiple metadata blocks from | ||
4612 | * different block group can end up in the same allocation cluster. | ||
4613 | * Calculating the exact overhead in the face of clustered allocation | ||
4614 | * requires either O(all block bitmaps) in memory or O(number of block | ||
4615 | * groups**2) in time. We will still calculate the superblock for | ||
4616 | * older file systems --- and if we come across with a bigalloc file | ||
4617 | * system with zero in s_overhead_clusters the estimate will be close to | ||
4618 | * correct especially for very large cluster sizes --- but for newer | ||
4619 | * file systems, it's better to calculate this figure once at mkfs | ||
4620 | * time, and store it in the superblock. If the superblock value is | ||
4621 | * present (even for non-bigalloc file systems), we will use it. | ||
4622 | */ | ||
4623 | static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf) | 4769 | static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf) |
4624 | { | 4770 | { |
4625 | struct super_block *sb = dentry->d_sb; | 4771 | struct super_block *sb = dentry->d_sb; |
4626 | struct ext4_sb_info *sbi = EXT4_SB(sb); | 4772 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
4627 | struct ext4_super_block *es = sbi->s_es; | 4773 | struct ext4_super_block *es = sbi->s_es; |
4628 | struct ext4_group_desc *gdp; | 4774 | ext4_fsblk_t overhead = 0; |
4629 | u64 fsid; | 4775 | u64 fsid; |
4630 | s64 bfree; | 4776 | s64 bfree; |
4631 | 4777 | ||
4632 | if (test_opt(sb, MINIX_DF)) { | 4778 | if (!test_opt(sb, MINIX_DF)) |
4633 | sbi->s_overhead_last = 0; | 4779 | overhead = sbi->s_overhead; |
4634 | } else if (es->s_overhead_clusters) { | ||
4635 | sbi->s_overhead_last = le32_to_cpu(es->s_overhead_clusters); | ||
4636 | } else if (sbi->s_blocks_last != ext4_blocks_count(es)) { | ||
4637 | ext4_group_t i, ngroups = ext4_get_groups_count(sb); | ||
4638 | ext4_fsblk_t overhead = 0; | ||
4639 | |||
4640 | /* | ||
4641 | * Compute the overhead (FS structures). This is constant | ||
4642 | * for a given filesystem unless the number of block groups | ||
4643 | * changes so we cache the previous value until it does. | ||
4644 | */ | ||
4645 | |||
4646 | /* | ||
4647 | * All of the blocks before first_data_block are | ||
4648 | * overhead | ||
4649 | */ | ||
4650 | overhead = EXT4_B2C(sbi, le32_to_cpu(es->s_first_data_block)); | ||
4651 | |||
4652 | /* | ||
4653 | * Add the overhead found in each block group | ||
4654 | */ | ||
4655 | for (i = 0; i < ngroups; i++) { | ||
4656 | gdp = ext4_get_group_desc(sb, i, NULL); | ||
4657 | overhead += ext4_num_overhead_clusters(sb, i, gdp); | ||
4658 | cond_resched(); | ||
4659 | } | ||
4660 | sbi->s_overhead_last = overhead; | ||
4661 | smp_wmb(); | ||
4662 | sbi->s_blocks_last = ext4_blocks_count(es); | ||
4663 | } | ||
4664 | 4780 | ||
4665 | buf->f_type = EXT4_SUPER_MAGIC; | 4781 | buf->f_type = EXT4_SUPER_MAGIC; |
4666 | buf->f_bsize = sb->s_blocksize; | 4782 | buf->f_bsize = sb->s_blocksize; |
4667 | buf->f_blocks = (ext4_blocks_count(es) - | 4783 | buf->f_blocks = ext4_blocks_count(es) - EXT4_C2B(sbi, sbi->s_overhead); |
4668 | EXT4_C2B(sbi, sbi->s_overhead_last)); | ||
4669 | bfree = percpu_counter_sum_positive(&sbi->s_freeclusters_counter) - | 4784 | bfree = percpu_counter_sum_positive(&sbi->s_freeclusters_counter) - |
4670 | percpu_counter_sum_positive(&sbi->s_dirtyclusters_counter); | 4785 | percpu_counter_sum_positive(&sbi->s_dirtyclusters_counter); |
4671 | /* prevent underflow in case that few free space is available */ | 4786 | /* prevent underflow in case that few free space is available */ |
@@ -4835,6 +4950,74 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id, | |||
4835 | return dquot_quota_on(sb, type, format_id, path); | 4950 | return dquot_quota_on(sb, type, format_id, path); |
4836 | } | 4951 | } |
4837 | 4952 | ||
4953 | static int ext4_quota_enable(struct super_block *sb, int type, int format_id, | ||
4954 | unsigned int flags) | ||
4955 | { | ||
4956 | int err; | ||
4957 | struct inode *qf_inode; | ||
4958 | unsigned long qf_inums[MAXQUOTAS] = { | ||
4959 | le32_to_cpu(EXT4_SB(sb)->s_es->s_usr_quota_inum), | ||
4960 | le32_to_cpu(EXT4_SB(sb)->s_es->s_grp_quota_inum) | ||
4961 | }; | ||
4962 | |||
4963 | BUG_ON(!EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)); | ||
4964 | |||
4965 | if (!qf_inums[type]) | ||
4966 | return -EPERM; | ||
4967 | |||
4968 | qf_inode = ext4_iget(sb, qf_inums[type]); | ||
4969 | if (IS_ERR(qf_inode)) { | ||
4970 | ext4_error(sb, "Bad quota inode # %lu", qf_inums[type]); | ||
4971 | return PTR_ERR(qf_inode); | ||
4972 | } | ||
4973 | |||
4974 | err = dquot_enable(qf_inode, type, format_id, flags); | ||
4975 | iput(qf_inode); | ||
4976 | |||
4977 | return err; | ||
4978 | } | ||
4979 | |||
4980 | /* Enable usage tracking for all quota types. */ | ||
4981 | static int ext4_enable_quotas(struct super_block *sb) | ||
4982 | { | ||
4983 | int type, err = 0; | ||
4984 | unsigned long qf_inums[MAXQUOTAS] = { | ||
4985 | le32_to_cpu(EXT4_SB(sb)->s_es->s_usr_quota_inum), | ||
4986 | le32_to_cpu(EXT4_SB(sb)->s_es->s_grp_quota_inum) | ||
4987 | }; | ||
4988 | |||
4989 | sb_dqopt(sb)->flags |= DQUOT_QUOTA_SYS_FILE; | ||
4990 | for (type = 0; type < MAXQUOTAS; type++) { | ||
4991 | if (qf_inums[type]) { | ||
4992 | err = ext4_quota_enable(sb, type, QFMT_VFS_V1, | ||
4993 | DQUOT_USAGE_ENABLED); | ||
4994 | if (err) { | ||
4995 | ext4_warning(sb, | ||
4996 | "Failed to enable quota (type=%d) " | ||
4997 | "tracking. Please run e2fsck to fix.", | ||
4998 | type); | ||
4999 | return err; | ||
5000 | } | ||
5001 | } | ||
5002 | } | ||
5003 | return 0; | ||
5004 | } | ||
5005 | |||
5006 | /* | ||
5007 | * quota_on function that is used when QUOTA feature is set. | ||
5008 | */ | ||
5009 | static int ext4_quota_on_sysfile(struct super_block *sb, int type, | ||
5010 | int format_id) | ||
5011 | { | ||
5012 | if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) | ||
5013 | return -EINVAL; | ||
5014 | |||
5015 | /* | ||
5016 | * USAGE was enabled at mount time. Only need to enable LIMITS now. | ||
5017 | */ | ||
5018 | return ext4_quota_enable(sb, type, format_id, DQUOT_LIMITS_ENABLED); | ||
5019 | } | ||
5020 | |||
4838 | static int ext4_quota_off(struct super_block *sb, int type) | 5021 | static int ext4_quota_off(struct super_block *sb, int type) |
4839 | { | 5022 | { |
4840 | struct inode *inode = sb_dqopt(sb)->files[type]; | 5023 | struct inode *inode = sb_dqopt(sb)->files[type]; |
@@ -4861,6 +5044,18 @@ out: | |||
4861 | return dquot_quota_off(sb, type); | 5044 | return dquot_quota_off(sb, type); |
4862 | } | 5045 | } |
4863 | 5046 | ||
5047 | /* | ||
5048 | * quota_off function that is used when QUOTA feature is set. | ||
5049 | */ | ||
5050 | static int ext4_quota_off_sysfile(struct super_block *sb, int type) | ||
5051 | { | ||
5052 | if (!EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_QUOTA)) | ||
5053 | return -EINVAL; | ||
5054 | |||
5055 | /* Disable only the limits. */ | ||
5056 | return dquot_disable(sb, type, DQUOT_LIMITS_ENABLED); | ||
5057 | } | ||
5058 | |||
4864 | /* Read data from quotafile - avoid pagecache and such because we cannot afford | 5059 | /* Read data from quotafile - avoid pagecache and such because we cannot afford |
4865 | * acquiring the locks... As quota files are never truncated and quota code | 5060 | * acquiring the locks... As quota files are never truncated and quota code |
4866 | * itself serializes the operations (and no one else should touch the files) | 5061 | * itself serializes the operations (and no one else should touch the files) |
diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c index e56c9ed7d6e3..2cdb98d62980 100644 --- a/fs/ext4/xattr.c +++ b/fs/ext4/xattr.c | |||
@@ -127,19 +127,16 @@ static __le32 ext4_xattr_block_csum(struct inode *inode, | |||
127 | struct ext4_xattr_header *hdr) | 127 | struct ext4_xattr_header *hdr) |
128 | { | 128 | { |
129 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); | 129 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); |
130 | struct ext4_inode_info *ei = EXT4_I(inode); | ||
131 | __u32 csum, old; | 130 | __u32 csum, old; |
132 | 131 | ||
133 | old = hdr->h_checksum; | 132 | old = hdr->h_checksum; |
134 | hdr->h_checksum = 0; | 133 | hdr->h_checksum = 0; |
135 | if (le32_to_cpu(hdr->h_refcount) != 1) { | 134 | block_nr = cpu_to_le64(block_nr); |
136 | block_nr = cpu_to_le64(block_nr); | 135 | csum = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)&block_nr, |
137 | csum = ext4_chksum(sbi, sbi->s_csum_seed, (__u8 *)&block_nr, | 136 | sizeof(block_nr)); |
138 | sizeof(block_nr)); | ||
139 | } else | ||
140 | csum = ei->i_csum_seed; | ||
141 | csum = ext4_chksum(sbi, csum, (__u8 *)hdr, | 137 | csum = ext4_chksum(sbi, csum, (__u8 *)hdr, |
142 | EXT4_BLOCK_SIZE(inode->i_sb)); | 138 | EXT4_BLOCK_SIZE(inode->i_sb)); |
139 | |||
143 | hdr->h_checksum = old; | 140 | hdr->h_checksum = old; |
144 | return cpu_to_le32(csum); | 141 | return cpu_to_le32(csum); |
145 | } | 142 | } |