mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	btrfs: delayed-inode: Remove wrong qgroup meta reservation calls
Commit4f5427ccce("btrfs: delayed-inode: Use new qgroup meta rsv for delayed inode and item") merged into mainline was not latest version submitted to the mail list in Dec 2017. Which lacks the following fixes: 1) Remove btrfs_qgroup_convert_reserved_meta() call in btrfs_delayed_item_release_metadata() 2) Remove btrfs_qgroup_reserve_meta_prealloc() call in btrfs_delayed_inode_reserve_metadata() Those fixes will resolve unexpected EDQUOT problems. Fixes:4f5427ccce("btrfs: delayed-inode: Use new qgroup meta rsv for delayed inode and item") Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
		
							parent
							
								
									ff6bc37eb7
								
							
						
					
					
						commit
						f218ea6c47
					
				
					 1 changed files with 16 additions and 4 deletions
				
			
		| 
						 | 
				
			
			@ -556,6 +556,12 @@ static int btrfs_delayed_item_reserve_metadata(struct btrfs_trans_handle *trans,
 | 
			
		|||
	dst_rsv = &fs_info->delayed_block_rsv;
 | 
			
		||||
 | 
			
		||||
	num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Here we migrate space rsv from transaction rsv, since have already
 | 
			
		||||
	 * reserved space when starting a transaction.  So no need to reserve
 | 
			
		||||
	 * qgroup space here.
 | 
			
		||||
	 */
 | 
			
		||||
	ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes, 1);
 | 
			
		||||
	if (!ret) {
 | 
			
		||||
		trace_btrfs_space_reservation(fs_info, "delayed_item",
 | 
			
		||||
| 
						 | 
				
			
			@ -577,7 +583,10 @@ static void btrfs_delayed_item_release_metadata(struct btrfs_root *root,
 | 
			
		|||
		return;
 | 
			
		||||
 | 
			
		||||
	rsv = &fs_info->delayed_block_rsv;
 | 
			
		||||
	btrfs_qgroup_convert_reserved_meta(root, item->bytes_reserved);
 | 
			
		||||
	/*
 | 
			
		||||
	 * Check btrfs_delayed_item_reserve_metadata() to see why we don't need
 | 
			
		||||
	 * to release/reserve qgroup space.
 | 
			
		||||
	 */
 | 
			
		||||
	trace_btrfs_space_reservation(fs_info, "delayed_item",
 | 
			
		||||
				      item->key.objectid, item->bytes_reserved,
 | 
			
		||||
				      0);
 | 
			
		||||
| 
						 | 
				
			
			@ -602,9 +611,6 @@ static int btrfs_delayed_inode_reserve_metadata(
 | 
			
		|||
 | 
			
		||||
	num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1);
 | 
			
		||||
 | 
			
		||||
	ret = btrfs_qgroup_reserve_meta_prealloc(root, num_bytes, true);
 | 
			
		||||
	if (ret < 0)
 | 
			
		||||
		return ret;
 | 
			
		||||
	/*
 | 
			
		||||
	 * btrfs_dirty_inode will update the inode under btrfs_join_transaction
 | 
			
		||||
	 * which doesn't reserve space for speed.  This is a problem since we
 | 
			
		||||
| 
						 | 
				
			
			@ -616,6 +622,10 @@ static int btrfs_delayed_inode_reserve_metadata(
 | 
			
		|||
	 */
 | 
			
		||||
	if (!src_rsv || (!trans->bytes_reserved &&
 | 
			
		||||
			 src_rsv->type != BTRFS_BLOCK_RSV_DELALLOC)) {
 | 
			
		||||
		ret = btrfs_qgroup_reserve_meta_prealloc(root,
 | 
			
		||||
				fs_info->nodesize, true);
 | 
			
		||||
		if (ret < 0)
 | 
			
		||||
			return ret;
 | 
			
		||||
		ret = btrfs_block_rsv_add(root, dst_rsv, num_bytes,
 | 
			
		||||
					  BTRFS_RESERVE_NO_FLUSH);
 | 
			
		||||
		/*
 | 
			
		||||
| 
						 | 
				
			
			@ -634,6 +644,8 @@ static int btrfs_delayed_inode_reserve_metadata(
 | 
			
		|||
						      "delayed_inode",
 | 
			
		||||
						      btrfs_ino(inode),
 | 
			
		||||
						      num_bytes, 1);
 | 
			
		||||
		} else {
 | 
			
		||||
			btrfs_qgroup_free_meta_prealloc(root, fs_info->nodesize);
 | 
			
		||||
		}
 | 
			
		||||
		return ret;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue