Skip to content

Commit 2b6c82d

Browse files
committed
btrfs: use on-stack variable for block reserve in btrfs_replace_file_extents()
We can avoid potential memory allocation failure in btrfs_replace_file_extents() as the block reserve lifetime is limited to the scope of the function. This requires +48 bytes on stack. Signed-off-by: David Sterba <[email protected]>
1 parent 9b97758 commit 2b6c82d

File tree

1 file changed

+12
-17
lines changed

1 file changed

+12
-17
lines changed

fs/btrfs/file.c

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2341,7 +2341,7 @@ int btrfs_replace_file_extents(struct btrfs_inode *inode,
23412341
u64 min_size = btrfs_calc_insert_metadata_size(fs_info, 1);
23422342
u64 ino_size = round_up(inode->vfs_inode.i_size, fs_info->sectorsize);
23432343
struct btrfs_trans_handle *trans = NULL;
2344-
struct btrfs_block_rsv *rsv;
2344+
struct btrfs_block_rsv rsv;
23452345
unsigned int rsv_count;
23462346
u64 cur_offset;
23472347
u64 len = end - start;
@@ -2350,13 +2350,9 @@ int btrfs_replace_file_extents(struct btrfs_inode *inode,
23502350
if (end <= start)
23512351
return -EINVAL;
23522352

2353-
rsv = btrfs_alloc_block_rsv(fs_info, BTRFS_BLOCK_RSV_TEMP);
2354-
if (!rsv) {
2355-
ret = -ENOMEM;
2356-
goto out;
2357-
}
2358-
rsv->size = btrfs_calc_insert_metadata_size(fs_info, 1);
2359-
rsv->failfast = true;
2353+
btrfs_init_metadata_block_rsv(fs_info, &rsv, BTRFS_BLOCK_RSV_TEMP);
2354+
rsv.size = btrfs_calc_insert_metadata_size(fs_info, 1);
2355+
rsv.failfast = true;
23602356

23612357
/*
23622358
* 1 - update the inode
@@ -2373,14 +2369,14 @@ int btrfs_replace_file_extents(struct btrfs_inode *inode,
23732369
if (IS_ERR(trans)) {
23742370
ret = PTR_ERR(trans);
23752371
trans = NULL;
2376-
goto out_free;
2372+
goto out_release;
23772373
}
23782374

2379-
ret = btrfs_block_rsv_migrate(&fs_info->trans_block_rsv, rsv,
2375+
ret = btrfs_block_rsv_migrate(&fs_info->trans_block_rsv, &rsv,
23802376
min_size, false);
23812377
if (WARN_ON(ret))
23822378
goto out_trans;
2383-
trans->block_rsv = rsv;
2379+
trans->block_rsv = &rsv;
23842380

23852381
cur_offset = start;
23862382
drop_args.path = path;
@@ -2496,10 +2492,10 @@ int btrfs_replace_file_extents(struct btrfs_inode *inode,
24962492
}
24972493

24982494
ret = btrfs_block_rsv_migrate(&fs_info->trans_block_rsv,
2499-
rsv, min_size, false);
2495+
&rsv, min_size, false);
25002496
if (WARN_ON(ret))
25012497
break;
2502-
trans->block_rsv = rsv;
2498+
trans->block_rsv = &rsv;
25032499

25042500
cur_offset = drop_args.drop_end;
25052501
len = end - cur_offset;
@@ -2576,16 +2572,15 @@ int btrfs_replace_file_extents(struct btrfs_inode *inode,
25762572

25772573
out_trans:
25782574
if (!trans)
2579-
goto out_free;
2575+
goto out_release;
25802576

25812577
trans->block_rsv = &fs_info->trans_block_rsv;
25822578
if (ret)
25832579
btrfs_end_transaction(trans);
25842580
else
25852581
*trans_out = trans;
2586-
out_free:
2587-
btrfs_free_block_rsv(fs_info, rsv);
2588-
out:
2582+
out_release:
2583+
btrfs_block_rsv_release(fs_info, &rsv, (u64)-1, NULL);
25892584
return ret;
25902585
}
25912586

0 commit comments

Comments
 (0)