linux/fs/ext4
Lukas Czerner 304e220f08 ext4: fix free clusters calculation in bigalloc filesystem
ext4_has_free_clusters() should tell us whether there is enough free
clusters to allocate, however number of free clusters in the file system
is converted to blocks using EXT4_C2B() which is not only wrong use of
the macro (we should have used EXT4_NUM_B2C) but it's also completely
wrong concept since everything else is in cluster units.

Moreover when calculating number of root clusters we should be using
macro EXT4_NUM_B2C() instead of EXT4_B2C() otherwise the result might be
off by one. However r_blocks_count should always be a multiple of the
cluster ratio so doing a plain bit shift should be enough here. We
avoid using EXT4_B2C() because it's confusing.

As a result of the first problem number of free clusters is much bigger
than it should have been and ext4_has_free_clusters() would return 1 even
if there is really not enough free clusters available.

Fix this by removing the EXT4_C2B() conversion of free clusters and
using bit shift when calculating number of root clusters. This bug
affects number of xfstests tests covering file system ENOSPC situation
handling. With this patch most of the ENOSPC problems with bigalloc file
system disappear, especially the errors caused by delayed allocation not
having enough space when the actual allocation is finally requested.

Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Cc: stable@vger.kernel.org
2013-02-22 15:27:52 -05:00
..
acl.c ext4: fix the number of credits needed for acl ops with inline data 2013-02-09 15:23:03 -05:00
acl.h fs: take the ACL checks to common code 2011-07-25 14:30:23 -04:00
balloc.c ext4: fix free clusters calculation in bigalloc filesystem 2013-02-22 15:27:52 -05:00
bitmap.c ext4: Checksum the block bitmap properly with bigalloc enabled 2012-10-22 00:34:32 -04:00
block_validity.c ext2/3/4: delete unneeded includes of module.h 2012-01-09 13:52:10 +01:00
dir.c ext4: release buffer when checksum failed 2013-01-28 21:23:24 -05:00
ext4_extents.h ext4: remove single extent cache 2013-02-18 00:31:07 -05:00
ext4_jbd2.c ext4: pass context information to jbd2__journal_start() 2013-02-08 21:59:22 -05:00
ext4_jbd2.h ext4: fix the number of credits needed for acl ops with inline data 2013-02-09 15:23:03 -05:00
ext4.h ext4: reclaim extents from extent status tree 2013-02-18 00:32:55 -05:00
extents_status.c ext4: no need to remove extent if len is 0 in ext4_es_remove_extent() 2013-02-22 15:27:47 -05:00
extents_status.h ext4: reclaim extents from extent status tree 2013-02-18 00:32:55 -05:00
extents.c ext4: remove single extent cache 2013-02-18 00:31:07 -05:00
file.c ext4: rename and improbe ext4_es_find_extent() 2013-02-18 00:27:26 -05:00
fsync.c ext4: fix an incorrect comment about i_mutex 2012-12-25 13:31:52 -05:00
hash.c ext4: reduce one "if" comparison in ext4_dirhash() 2013-02-01 22:33:21 -05:00
ialloc.c ext4: use KERN_WARNING for warning messages 2013-02-14 15:11:41 -05:00
indirect.c ext4: pass context information to jbd2__journal_start() 2013-02-08 21:59:22 -05:00
inline.c ext4: pass context information to jbd2__journal_start() 2013-02-08 21:59:22 -05:00
inode.c ext4: lookup block mapping in extent status tree 2013-02-18 00:29:59 -05:00
ioctl.c ext4: pass context information to jbd2__journal_start() 2013-02-08 21:59:22 -05:00
Kconfig ext4: fix configuration dependencies for ext4 ACLs and security labels 2013-01-06 23:38:44 -05:00
Makefile ext4: Remove CONFIG_EXT4_FS_XATTR 2012-12-10 16:30:43 -05:00
mballoc.c ext4: use module parameters instead of debugfs for mballoc_debug 2013-02-09 16:28:20 -05:00
mballoc.h ext4: use module parameters instead of debugfs for mballoc_debug 2013-02-09 16:28:20 -05:00
migrate.c ext4: fix the number of credits needed for ext4_ext_migrate() 2013-02-09 12:50:27 -05:00
mmp.c ext4: use unlikely to improve the efficiency of the kernel 2013-01-12 16:28:47 -05:00
move_extent.c ext4: remove single extent cache 2013-02-18 00:31:07 -05:00
namei.c ext4: use ERR_PTR() abstraction for ext4_append() 2013-02-15 03:35:57 -05:00
page-io.c ext4: fix possible use-after-free with AIO 2013-01-29 22:48:17 -05:00
resize.c ext4: pass context information to jbd2__journal_start() 2013-02-08 21:59:22 -05:00
super.c ext4: reclaim extents from extent status tree 2013-02-18 00:32:55 -05:00
symlink.c ext4: Remove CONFIG_EXT4_FS_XATTR 2012-12-10 16:30:43 -05:00
truncate.h ext4: move common truncate functions to header file 2011-06-27 19:16:04 -04:00
xattr_security.c Merge branch 'for_linus' into for_linus_merged 2012-01-10 11:54:07 -05:00
xattr_trusted.c ext2/3/4: delete unneeded includes of module.h 2012-01-09 13:52:10 +01:00
xattr_user.c ext2/3/4: delete unneeded includes of module.h 2012-01-09 13:52:10 +01:00
xattr.c ext4: fix xattr block allocation/release with bigalloc 2013-02-18 12:12:07 -05:00
xattr.h ext4: fix the number of credits needed for acl ops with inline data 2013-02-09 15:23:03 -05:00