mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +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;
 | 
						dst_rsv = &fs_info->delayed_block_rsv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1);
 | 
						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);
 | 
						ret = btrfs_block_rsv_migrate(src_rsv, dst_rsv, num_bytes, 1);
 | 
				
			||||||
	if (!ret) {
 | 
						if (!ret) {
 | 
				
			||||||
		trace_btrfs_space_reservation(fs_info, "delayed_item",
 | 
							trace_btrfs_space_reservation(fs_info, "delayed_item",
 | 
				
			||||||
| 
						 | 
					@ -577,7 +583,10 @@ static void btrfs_delayed_item_release_metadata(struct btrfs_root *root,
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rsv = &fs_info->delayed_block_rsv;
 | 
						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",
 | 
						trace_btrfs_space_reservation(fs_info, "delayed_item",
 | 
				
			||||||
				      item->key.objectid, item->bytes_reserved,
 | 
									      item->key.objectid, item->bytes_reserved,
 | 
				
			||||||
				      0);
 | 
									      0);
 | 
				
			||||||
| 
						 | 
					@ -602,9 +611,6 @@ static int btrfs_delayed_inode_reserve_metadata(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1);
 | 
						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
 | 
						 * btrfs_dirty_inode will update the inode under btrfs_join_transaction
 | 
				
			||||||
	 * which doesn't reserve space for speed.  This is a problem since we
 | 
						 * 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 &&
 | 
						if (!src_rsv || (!trans->bytes_reserved &&
 | 
				
			||||||
			 src_rsv->type != BTRFS_BLOCK_RSV_DELALLOC)) {
 | 
								 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,
 | 
							ret = btrfs_block_rsv_add(root, dst_rsv, num_bytes,
 | 
				
			||||||
					  BTRFS_RESERVE_NO_FLUSH);
 | 
										  BTRFS_RESERVE_NO_FLUSH);
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
| 
						 | 
					@ -634,6 +644,8 @@ static int btrfs_delayed_inode_reserve_metadata(
 | 
				
			||||||
						      "delayed_inode",
 | 
											      "delayed_inode",
 | 
				
			||||||
						      btrfs_ino(inode),
 | 
											      btrfs_ino(inode),
 | 
				
			||||||
						      num_bytes, 1);
 | 
											      num_bytes, 1);
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								btrfs_qgroup_free_meta_prealloc(root, fs_info->nodesize);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return ret;
 | 
							return ret;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue