diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-05-11 14:44:27 +0200 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-05-11 14:44:31 +0200 | 
| commit | 41fb454ebe6024f5c1e3b3cbc0abc0da762e7b51 (patch) | |
| tree | 51c50bcb67a5039448ddfa1869d7948cab1217e9 /fs/btrfs/extent-tree.c | |
| parent | 19c1a6f5764d787113fa323ffb18be7991208f82 (diff) | |
| parent | 091bf7624d1c90cec9e578a18529f615213ff847 (diff) | |
Merge commit 'v2.6.30-rc5' into core/iommu
Merge reason: core/iommu was on an .30-rc1 base,
              update it to .30-rc5 to refresh.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'fs/btrfs/extent-tree.c')
| -rw-r--r-- | fs/btrfs/extent-tree.c | 49 | 
1 files changed, 41 insertions, 8 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 178df4c67de..e4966444811 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -1844,10 +1844,14 @@ again:  		printk(KERN_ERR "no space left, need %llu, %llu delalloc bytes"  		       ", %llu bytes_used, %llu bytes_reserved, "  		       "%llu bytes_pinned, %llu bytes_readonly, %llu may use" -		       "%llu total\n", bytes, data_sinfo->bytes_delalloc, -		       data_sinfo->bytes_used, data_sinfo->bytes_reserved, -		       data_sinfo->bytes_pinned, data_sinfo->bytes_readonly, -		       data_sinfo->bytes_may_use, data_sinfo->total_bytes); +		       "%llu total\n", (unsigned long long)bytes, +		       (unsigned long long)data_sinfo->bytes_delalloc, +		       (unsigned long long)data_sinfo->bytes_used, +		       (unsigned long long)data_sinfo->bytes_reserved, +		       (unsigned long long)data_sinfo->bytes_pinned, +		       (unsigned long long)data_sinfo->bytes_readonly, +		       (unsigned long long)data_sinfo->bytes_may_use, +		       (unsigned long long)data_sinfo->total_bytes);  		return -ENOSPC;  	}  	data_sinfo->bytes_may_use += bytes; @@ -1918,15 +1922,29 @@ void btrfs_delalloc_free_space(struct btrfs_root *root, struct inode *inode,  	spin_unlock(&info->lock);  } +static void force_metadata_allocation(struct btrfs_fs_info *info) +{ +	struct list_head *head = &info->space_info; +	struct btrfs_space_info *found; + +	rcu_read_lock(); +	list_for_each_entry_rcu(found, head, list) { +		if (found->flags & BTRFS_BLOCK_GROUP_METADATA) +			found->force_alloc = 1; +	} +	rcu_read_unlock(); +} +  static int do_chunk_alloc(struct btrfs_trans_handle *trans,  			  struct btrfs_root *extent_root, u64 alloc_bytes,  			  u64 flags, int force)  {  	struct btrfs_space_info *space_info; +	struct btrfs_fs_info *fs_info = extent_root->fs_info;  	u64 thresh;  	int ret = 0; -	mutex_lock(&extent_root->fs_info->chunk_mutex); +	mutex_lock(&fs_info->chunk_mutex);  	flags = btrfs_reduce_alloc_profile(extent_root, flags); @@ -1958,6 +1976,18 @@ static int do_chunk_alloc(struct btrfs_trans_handle *trans,  	}  	spin_unlock(&space_info->lock); +	/* +	 * if we're doing a data chunk, go ahead and make sure that +	 * we keep a reasonable number of metadata chunks allocated in the +	 * FS as well. +	 */ +	if (flags & BTRFS_BLOCK_GROUP_DATA) { +		fs_info->data_chunk_allocations++; +		if (!(fs_info->data_chunk_allocations % +		      fs_info->metadata_ratio)) +			force_metadata_allocation(fs_info); +	} +  	ret = btrfs_alloc_chunk(trans, extent_root, flags);  	if (ret)  		space_info->full = 1; @@ -2798,9 +2828,12 @@ static void dump_space_info(struct btrfs_space_info *info, u64 bytes)  				    info->bytes_pinned - info->bytes_reserved),  	       (info->full) ? "" : "not ");  	printk(KERN_INFO "space_info total=%llu, pinned=%llu, delalloc=%llu," -	       " may_use=%llu, used=%llu\n", info->total_bytes, -	       info->bytes_pinned, info->bytes_delalloc, info->bytes_may_use, -	       info->bytes_used); +	       " may_use=%llu, used=%llu\n", +	       (unsigned long long)info->total_bytes, +	       (unsigned long long)info->bytes_pinned, +	       (unsigned long long)info->bytes_delalloc, +	       (unsigned long long)info->bytes_may_use, +	       (unsigned long long)info->bytes_used);  	down_read(&info->groups_sem);  	list_for_each_entry(cache, &info->block_groups, list) {  | 
