|
@@ -2604,25 +2604,28 @@ static int reserve_metadata_space(struct btrfs_trans_handle *trans,
|
|
|
|
|
|
trans->block_rsv = rc->block_rsv;
|
|
trans->block_rsv = rc->block_rsv;
|
|
rc->reserved_bytes += num_bytes;
|
|
rc->reserved_bytes += num_bytes;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * We are under a transaction here so we can only do limited flushing.
|
|
|
|
+ * If we get an enospc just kick back -EAGAIN so we know to drop the
|
|
|
|
+ * transaction and try to refill when we can flush all the things.
|
|
|
|
+ */
|
|
ret = btrfs_block_rsv_refill(root, rc->block_rsv, num_bytes,
|
|
ret = btrfs_block_rsv_refill(root, rc->block_rsv, num_bytes,
|
|
- BTRFS_RESERVE_FLUSH_ALL);
|
|
|
|
|
|
+ BTRFS_RESERVE_FLUSH_LIMIT);
|
|
if (ret) {
|
|
if (ret) {
|
|
- if (ret == -EAGAIN) {
|
|
|
|
- tmp = rc->extent_root->nodesize *
|
|
|
|
- RELOCATION_RESERVED_NODES;
|
|
|
|
- while (tmp <= rc->reserved_bytes)
|
|
|
|
- tmp <<= 1;
|
|
|
|
- /*
|
|
|
|
- * only one thread can access block_rsv at this point,
|
|
|
|
- * so we don't need hold lock to protect block_rsv.
|
|
|
|
- * we expand more reservation size here to allow enough
|
|
|
|
- * space for relocation and we will return earlier in
|
|
|
|
- * enospc case.
|
|
|
|
- */
|
|
|
|
- rc->block_rsv->size = tmp + rc->extent_root->nodesize *
|
|
|
|
- RELOCATION_RESERVED_NODES;
|
|
|
|
- }
|
|
|
|
- return ret;
|
|
|
|
|
|
+ tmp = rc->extent_root->nodesize * RELOCATION_RESERVED_NODES;
|
|
|
|
+ while (tmp <= rc->reserved_bytes)
|
|
|
|
+ tmp <<= 1;
|
|
|
|
+ /*
|
|
|
|
+ * only one thread can access block_rsv at this point,
|
|
|
|
+ * so we don't need hold lock to protect block_rsv.
|
|
|
|
+ * we expand more reservation size here to allow enough
|
|
|
|
+ * space for relocation and we will return eailer in
|
|
|
|
+ * enospc case.
|
|
|
|
+ */
|
|
|
|
+ rc->block_rsv->size = tmp + rc->extent_root->nodesize *
|
|
|
|
+ RELOCATION_RESERVED_NODES;
|
|
|
|
+ return -EAGAIN;
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
return 0;
|