linux/fs/ext4
Tao Ma cc483f102c ext4: Fix fencepost error in chosing choosing group vs file preallocation.
The ext4 multiblock allocator decides whether to use group or file
preallocation based on the file size.  When the file size reaches
s_mb_stream_request (default is 16 blocks), it changes to use a
file-specific preallocation. This is cool, but it has a tiny problem.

See a simple script:
mkfs.ext4 -b 1024 /dev/sda8 1000000
mount -t ext4 -o nodelalloc /dev/sda8 /mnt/ext4
for((i=0;i<5;i++))
do
cat /mnt/4096>>/mnt/ext4/a	#4096 is a file with 4096 characters.
cat /mnt/4096>>/mnt/ext4/b
done
debuge4fs -R 'stat a' /dev/sda8|grep BLOCKS -A 1

And you get
BLOCKS:
(0-14):8705-8719, (15):2356, (16-19):8465-8468

So there are 3 extents, a bit strange for the lonely 15th logical
block.  As we write to the 16 blocks, we choose file preallocation in
ext4_mb_group_or_file, but in ext4_mb_normalize_request, we meet with
the 16*1024 range, so no preallocation will be carried. file b then
reserves the space after '2356', so when when write 16, we start from
another part.

This patch just change the check in ext4_mb_group_or_file, so
that for the lonely 15 we will still use group preallocation.
After the patch, we will get:
debuge4fs -R 'stat a' /dev/sda8|grep BLOCKS -A 1
BLOCKS:
(0-15):8705-8720, (16-19):8465-8468

Looks more sane. Thanks.

Signed-off-by: Tao Ma <tao.ma@oracle.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2010-03-01 19:06:35 -05:00
..
acl.c sanitize xattr handler prototypes 2009-12-16 12:16:49 -05:00
acl.h ext[234]: move over to 'check_acl' permission model 2009-09-08 11:09:04 -07:00
balloc.c ext4: move __func__ into a macro for ext4_warning, ext4_error 2010-02-15 14:19:27 -05:00
bitmap.c ext4: Change unsigned long to unsigned int 2008-11-05 00:14:04 -05:00
block_validity.c ext4: remove unused #include <linux/version.h> 2009-12-14 09:24:20 -05:00
dir.c ext4: move __func__ into a macro for ext4_warning, ext4_error 2010-02-15 14:19:27 -05:00
ext4_extents.h ext4: Calculate metadata requirements more accurately 2010-01-01 02:41:30 -05:00
ext4_jbd2.c ext4: Fix BUG_ON at fs/buffer.c:652 in no journal mode 2010-02-16 15:06:29 -05:00
ext4_jbd2.h ext4: Wait for proper transaction commit on fsync 2009-12-08 23:51:10 -05:00
ext4.h ext4: Add flag to files with blocks intentionally past EOF 2010-02-24 09:52:53 -05:00
extents.c ext4: Add flag to files with blocks intentionally past EOF 2010-02-24 09:52:53 -05:00
file.c ext4: Use bitops to read/modify EXT4_I(inode)->i_state 2010-01-24 14:34:07 -05:00
fsync.c ext4, jbd2: Add barriers for file systems with exernal journals 2009-12-23 06:52:08 -05:00
hash.c ext4: Add support for non-native signed/unsigned htree hash algorithms 2008-10-28 13:21:44 -04:00
ialloc.c ext4: Fix BUG_ON at fs/buffer.c:652 in no journal mode 2010-02-16 15:06:29 -05:00
inode.c ext4: Add flag to files with blocks intentionally past EOF 2010-02-24 09:52:53 -05:00
ioctl.c ext4: Add flag to files with blocks intentionally past EOF 2010-02-24 09:52:53 -05:00
Kconfig ext4: Don't ask about supporting ext2/3 in ext4 if ext4 is not configured 2009-12-21 10:54:09 -05:00
Makefile ext4: online defrag -- Add EXT4_IOC_MOVE_EXT ioctl 2009-06-17 19:24:03 -04:00
mballoc.c ext4: Fix fencepost error in chosing choosing group vs file preallocation. 2010-03-01 19:06:35 -05:00
mballoc.h ext4: remove unused #include <linux/version.h> 2009-12-14 09:24:20 -05:00
migrate.c ext4: Use bitops to read/modify EXT4_I(inode)->i_state 2010-01-24 14:34:07 -05:00
move_extent.c ext4: move __func__ into a macro for ext4_warning, ext4_error 2010-02-15 14:19:27 -05:00
namei.c ext4: Fix BUG_ON at fs/buffer.c:652 in no journal mode 2010-02-16 15:06:29 -05:00
resize.c ext4: move __func__ into a macro for ext4_warning, ext4_error 2010-02-15 14:19:27 -05:00
super.c ext4: trivial quota cleanup 2010-03-01 23:28:41 -05:00
symlink.c ext4: Rename ext4dev to ext4 2008-10-10 20:02:48 -04:00
xattr_security.c sanitize xattr handler prototypes 2009-12-16 12:16:49 -05:00
xattr_trusted.c sanitize xattr handler prototypes 2009-12-16 12:16:49 -05:00
xattr_user.c sanitize xattr handler prototypes 2009-12-16 12:16:49 -05:00
xattr.c ext4: add missing error checking to ext4_expand_extra_isize_ea() 2010-02-15 14:26:16 -05:00
xattr.h ext4: Rename ext4dev to ext4 2008-10-10 20:02:48 -04:00