android_kernel_google_msm/fs/btrfs
Miao Xie 9e622d6bea Btrfs: fix enospc error caused by wrong checks of the chunk
When we did sysbench test for inline files, enospc error happened easily though
there was lots of free disk space which could be allocated for new chunks.

Reproduce steps:
 # mkfs.btrfs -b $((2 * 1024 * 1024 * 1024)) <test partition>
 # mount <test partition> /mnt
 # ulimit -n 102400
 # cd /mnt
 # sysbench --num-threads=1 --test=fileio --file-num=81920 \
 > --file-total-size=80M --file-block-size=1K --file-io-mode=sync \
 > --file-test-mode=seqwr prepare
 # sysbench --num-threads=1 --test=fileio --file-num=81920 \
 > --file-total-size=80M --file-block-size=1K --file-io-mode=sync \
 > --file-test-mode=seqwr run
 <soon later, BUG_ON() was triggered by enospc error>

The reason of this bug is:
Now, we can reserve space which is larger than the free space in the chunks if
we have enough free disk space which can be used for new chunks. By this way,
the space allocator should allocate a new chunk by force if there is no free
space in the free space cache. But there are two wrong checks which break this
operation.

One is
	if (ret == -ENOSPC && num_bytes > min_alloc_size)
in btrfs_reserve_extent(), it is wrong, we should try to allocate a new chunk
even we fail to allocate free space by minimum allocable size.

The other is
	if (space_info->force_alloc)
		force = space_info->force_alloc;
in do_chunk_alloc(). It makes the allocator ignore CHUNK_ALLOC_FORCE If someone
sets ->force_alloc to CHUNK_ALLOC_LIMITED, and makes the enospc error happen.

Fix these two wrong checks. Especially the second one, we fix it by changing
the value of CHUNK_ALLOC_LIMITED and CHUNK_ALLOC_FORCE, and make
CHUNK_ALLOC_FORCE greater than CHUNK_ALLOC_LIMITED since CHUNK_ALLOC_FORCE has
higher priority. And if the value which is passed in by the caller is greater
than ->force_alloc, use the passed value.

Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
2012-01-26 15:01:12 -05:00
..
acl.c Btrfs: fix return value of btrfs_get_acl() 2011-10-20 18:10:47 +02:00
async-thread.c Btrfs: fix worker lock misuse in find_worker 2011-12-23 07:53:00 -05:00
async-thread.h Btrfs: fix num_workers_starting bug and other bugs in async thread 2011-12-15 11:04:21 -05:00
backref.c Btrfs: fix uninit warning in backref.c 2012-01-26 15:01:11 -05:00
backref.h Btrfs: added btrfs_find_all_roots() 2012-01-04 16:26:38 +01:00
btrfs_inode.h Btrfs: add a delalloc mutex to inodes for delalloc reservations 2012-01-16 15:29:43 -05:00
check-integrity.c Btrfs: fix warning for 32-bit build of fs/btrfs/check-integrity.c 2012-01-26 15:01:11 -05:00
check-integrity.h Btrfs: add optional integrity check code 2011-12-21 19:14:09 +01:00
compat.h
compression.c btrfs: separate superblock items out of fs_info 2011-11-06 03:04:01 -05:00
compression.h
ctree.c Btrfs: mark delayed refs as for cow 2011-12-22 16:22:27 +01:00
ctree.h Merge branch 'integrity-check-patch-v2' of git://btrfs.giantdisaster.de/git/btrfs into integration 2012-01-16 15:27:58 -05:00
delayed-inode.c Btrfs: space leak tracepoints 2012-01-16 15:29:43 -05:00
delayed-inode.h
delayed-ref.c Btrfs: add waitqueue instead of doing busy waiting for more delayed refs 2012-01-04 16:12:48 +01:00
delayed-ref.h Btrfs: add waitqueue instead of doing busy waiting for more delayed refs 2012-01-04 16:12:48 +01:00
dir-item.c
disk-io.c Merge branch 'integrity-check-patch-v2' of git://btrfs.giantdisaster.de/git/btrfs into integration 2012-01-16 15:27:58 -05:00
disk-io.h Merge branch 'for-chris' of git://github.com/sensille/linux into integration 2011-11-06 03:05:08 -05:00
export.c
export.h
extent-tree.c Btrfs: fix enospc error caused by wrong checks of the chunk 2012-01-26 15:01:12 -05:00
extent_io.c Btrfs: Check for NULL page in extent_range_uptodate 2012-01-26 15:01:11 -05:00
extent_io.h Btrfs: add nested locking mode for paths 2012-01-04 16:12:29 +01:00
extent_map.c
extent_map.h
file-item.c btrfs: separate superblock items out of fs_info 2011-11-06 03:04:01 -05:00
file.c Btrfs: don't call btrfs_throttle in file write 2012-01-16 15:28:55 -05:00
free-space-cache.c Btrfs: use cluster->window_start when allocating from a cluster bitmap 2012-01-26 15:01:11 -05:00
free-space-cache.h
hash.h
inode-item.c
inode-map.c Btrfs: space leak tracepoints 2012-01-16 15:29:43 -05:00
inode-map.h
inode.c Btrfs: add a delalloc mutex to inodes for delalloc reservations 2012-01-16 15:29:43 -05:00
ioctl.c Btrfs: do not defrag a file partially 2012-01-26 15:01:12 -05:00
ioctl.h Btrfs: add balance progress reporting 2012-01-16 22:04:49 +02:00
Kconfig Btrfs: add config option to enable btrfs integrity check 2011-12-21 19:14:16 +01:00
locking.c Btrfs: add nested locking mode for paths 2012-01-04 16:12:29 +01:00
locking.h
lzo.c
Makefile Merge branch 'integrity-check-patch-v2' of git://btrfs.giantdisaster.de/git/btrfs into integration 2012-01-16 15:27:58 -05:00
ordered-data.c
ordered-data.h
orphan.c
print-tree.c btrfs: fix oops on failure path 2011-10-20 18:10:50 +02:00
print-tree.h
reada.c Btrfs: rename btrfs_bio multi -> bbio for consistency 2011-11-06 03:11:21 -05:00
relocation.c Btrfs: add a delalloc mutex to inodes for delalloc reservations 2012-01-16 15:29:43 -05:00
root-tree.c
scrub.c Merge branch 'integrity-check-patch-v2' of git://btrfs.giantdisaster.de/git/btrfs into integration 2012-01-16 15:27:58 -05:00
struct-funcs.c
super.c Merge branch 'integrity-check-patch-v2' of git://btrfs.giantdisaster.de/git/btrfs into integration 2012-01-16 15:27:58 -05:00
sysfs.c
transaction.c Btrfs: space leak tracepoints 2012-01-16 15:29:43 -05:00
transaction.h
tree-defrag.c
tree-log.c btrfs: Fix busyloops in transaction waiting code 2012-01-26 15:01:11 -05:00
tree-log.h
ulist.c Btrfs: generic data structure to build unique lists 2011-12-22 16:22:24 +01:00
ulist.h Btrfs: generic data structure to build unique lists 2011-12-22 16:22:24 +01:00
version.h
volumes.c Btrfs: use larger system chunks 2012-01-16 15:38:24 -05:00
volumes.h Merge branch 'for-chris' of git://repo.or.cz/linux-btrfs-devel into integration 2012-01-16 15:26:17 -05:00
xattr.c Btrfs: do not use btrfs_end_transaction_throttle everywhere 2012-01-16 15:28:54 -05:00
xattr.h
zlib.c