aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/props.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/props.c')
-rw-r--r--fs/btrfs/props.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c
index ca2716917e37..a9e2e66152ee 100644
--- a/fs/btrfs/props.c
+++ b/fs/btrfs/props.c
@@ -332,6 +332,7 @@ static int inherit_props(struct btrfs_trans_handle *trans,
332 struct btrfs_fs_info *fs_info = root->fs_info; 332 struct btrfs_fs_info *fs_info = root->fs_info;
333 int ret; 333 int ret;
334 int i; 334 int i;
335 bool need_reserve = false;
335 336
336 if (!test_bit(BTRFS_INODE_HAS_PROPS, 337 if (!test_bit(BTRFS_INODE_HAS_PROPS,
337 &BTRFS_I(parent)->runtime_flags)) 338 &BTRFS_I(parent)->runtime_flags))
@@ -357,11 +358,20 @@ static int inherit_props(struct btrfs_trans_handle *trans,
357 if (ret) 358 if (ret)
358 continue; 359 continue;
359 360
360 num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1); 361 /*
361 ret = btrfs_block_rsv_add(root, trans->block_rsv, 362 * Currently callers should be reserving 1 item for properties,
362 num_bytes, BTRFS_RESERVE_NO_FLUSH); 363 * since we only have 1 property that we currently support. If
363 if (ret) 364 * we add more in the future we need to try and reserve more
364 return ret; 365 * space for them. But we should also revisit how we do space
366 * reservations if we do add more properties in the future.
367 */
368 if (need_reserve) {
369 num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1);
370 ret = btrfs_block_rsv_add(root, trans->block_rsv,
371 num_bytes, BTRFS_RESERVE_NO_FLUSH);
372 if (ret)
373 return ret;
374 }
365 375
366 ret = btrfs_setxattr(trans, inode, h->xattr_name, value, 376 ret = btrfs_setxattr(trans, inode, h->xattr_name, value,
367 strlen(value), 0); 377 strlen(value), 0);
@@ -375,9 +385,13 @@ static int inherit_props(struct btrfs_trans_handle *trans,
375 &BTRFS_I(inode)->runtime_flags); 385 &BTRFS_I(inode)->runtime_flags);
376 } 386 }
377 387
378 btrfs_block_rsv_release(fs_info, trans->block_rsv, num_bytes); 388 if (need_reserve) {
379 if (ret) 389 btrfs_block_rsv_release(fs_info, trans->block_rsv,
380 return ret; 390 num_bytes);
391 if (ret)
392 return ret;
393 }
394 need_reserve = true;
381 } 395 }
382 396
383 return 0; 397 return 0;