aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
authorEric Whitney <enwlinux@gmail.com>2015-04-03 00:17:31 -0400
committerTheodore Ts'o <tytso@mit.edu>2015-04-03 00:17:31 -0400
commit9d21c9fa2cc24e2a195a79c27b6550e1a96051a4 (patch)
treeed314e29ce48935af0aa4d81632092ff7b3b8073 /fs/ext4
parent94426f4b9648154dc5a6760b59e6953e640ab3b1 (diff)
ext4: don't release reserved space for previously allocated cluster
When xfstests' auto group is run on a bigalloc filesystem with a 4.0-rc3 kernel, e2fsck failures and kernel warnings occur for some tests. e2fsck reports incorrect iblocks values, and the warnings indicate that the space reserved for delayed allocation is being overdrawn at allocation time. Some of these errors occur because the reserved space is incorrectly decreased by one cluster when ext4_ext_map_blocks satisfies an allocation request by mapping an unused portion of a previously allocated cluster. Because a cluster's worth of reserved space was already released when it was first allocated, it should not be released again. This patch appears to correct the e2fsck failure reported for generic/232 and the kernel warnings produced by ext4/001, generic/009, and generic/033. Failures and warnings for some other tests remain to be addressed. Signed-off-by: Eric Whitney <enwlinux@gmail.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/extents.c14
1 files changed, 1 insertions, 13 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index e5fafa7324c8..74580ea3ab55 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -4529,19 +4529,7 @@ got_allocated_blocks:
4529 */ 4529 */
4530 reserved_clusters = get_reserved_cluster_alloc(inode, 4530 reserved_clusters = get_reserved_cluster_alloc(inode,
4531 map->m_lblk, allocated); 4531 map->m_lblk, allocated);
4532 if (map_from_cluster) { 4532 if (!map_from_cluster) {
4533 if (reserved_clusters) {
4534 /*
4535 * We have clusters reserved for this range.
4536 * But since we are not doing actual allocation
4537 * and are simply using blocks from previously
4538 * allocated cluster, we should release the
4539 * reservation and not claim quota.
4540 */
4541 ext4_da_update_reserve_space(inode,
4542 reserved_clusters, 0);
4543 }
4544 } else {
4545 BUG_ON(allocated_clusters < reserved_clusters); 4533 BUG_ON(allocated_clusters < reserved_clusters);
4546 if (reserved_clusters < allocated_clusters) { 4534 if (reserved_clusters < allocated_clusters) {
4547 struct ext4_inode_info *ei = EXT4_I(inode); 4535 struct ext4_inode_info *ei = EXT4_I(inode);