Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable: Btrfs: make sure the chunk allocator doesn't create zero length chunks Btrfs: fix data enospc check overflow
This commit is contained in:
		
				commit
				
					
						d6cf853d4d
					
				
			
		
					 2 changed files with 21 additions and 5 deletions
				
			
		| 
						 | 
					@ -3235,7 +3235,8 @@ int btrfs_check_data_free_space(struct btrfs_root *root, struct inode *inode,
 | 
				
			||||||
				u64 bytes)
 | 
									u64 bytes)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct btrfs_space_info *data_sinfo;
 | 
						struct btrfs_space_info *data_sinfo;
 | 
				
			||||||
	int ret = 0, committed = 0;
 | 
						u64 used;
 | 
				
			||||||
 | 
						int ret = 0, committed = 0, flushed = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* make sure bytes are sectorsize aligned */
 | 
						/* make sure bytes are sectorsize aligned */
 | 
				
			||||||
	bytes = (bytes + root->sectorsize - 1) & ~((u64)root->sectorsize - 1);
 | 
						bytes = (bytes + root->sectorsize - 1) & ~((u64)root->sectorsize - 1);
 | 
				
			||||||
| 
						 | 
					@ -3247,12 +3248,21 @@ int btrfs_check_data_free_space(struct btrfs_root *root, struct inode *inode,
 | 
				
			||||||
again:
 | 
					again:
 | 
				
			||||||
	/* make sure we have enough space to handle the data first */
 | 
						/* make sure we have enough space to handle the data first */
 | 
				
			||||||
	spin_lock(&data_sinfo->lock);
 | 
						spin_lock(&data_sinfo->lock);
 | 
				
			||||||
	if (data_sinfo->total_bytes - data_sinfo->bytes_used -
 | 
						used = data_sinfo->bytes_used + data_sinfo->bytes_delalloc +
 | 
				
			||||||
	    data_sinfo->bytes_delalloc - data_sinfo->bytes_reserved -
 | 
							data_sinfo->bytes_reserved + data_sinfo->bytes_pinned +
 | 
				
			||||||
	    data_sinfo->bytes_pinned - data_sinfo->bytes_readonly -
 | 
							data_sinfo->bytes_readonly + data_sinfo->bytes_may_use +
 | 
				
			||||||
	    data_sinfo->bytes_may_use - data_sinfo->bytes_super < bytes) {
 | 
							data_sinfo->bytes_super;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (used + bytes > data_sinfo->total_bytes) {
 | 
				
			||||||
		struct btrfs_trans_handle *trans;
 | 
							struct btrfs_trans_handle *trans;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!flushed) {
 | 
				
			||||||
 | 
								spin_unlock(&data_sinfo->lock);
 | 
				
			||||||
 | 
								flush_delalloc(root, data_sinfo);
 | 
				
			||||||
 | 
								flushed = 1;
 | 
				
			||||||
 | 
								goto again;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * if we don't have enough free bytes in this space then we need
 | 
							 * if we don't have enough free bytes in this space then we need
 | 
				
			||||||
		 * to alloc a new chunk.
 | 
							 * to alloc a new chunk.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2250,6 +2250,12 @@ again:
 | 
				
			||||||
	if (!looped)
 | 
						if (!looped)
 | 
				
			||||||
		calc_size = max_t(u64, min_stripe_size, calc_size);
 | 
							calc_size = max_t(u64, min_stripe_size, calc_size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * we're about to do_div by the stripe_len so lets make sure
 | 
				
			||||||
 | 
						 * we end up with something bigger than a stripe
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						calc_size = max_t(u64, calc_size, stripe_len * 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	do_div(calc_size, stripe_len);
 | 
						do_div(calc_size, stripe_len);
 | 
				
			||||||
	calc_size *= stripe_len;
 | 
						calc_size *= stripe_len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue