diff options
Diffstat (limited to 'fs/btrfs/props.c')
| -rw-r--r-- | fs/btrfs/props.c | 30 |
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; |
