Skip to content

Commit a55cc91

Browse files
committed
btrfs: use on-stack variable for block reserve in btrfs_truncate()
We can avoid potential memory allocation failure in btrfs_truncate() as the block reserve lifetime is limited to the scope of the function. This requires +48 bytes on stack. Signed-off-by: David Sterba <dsterba@suse.com>
1 parent dcec59e commit a55cc91

File tree

1 file changed

+10
-12
lines changed

1 file changed

+10
-12
lines changed

fs/btrfs/inode.c

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7606,7 +7606,7 @@ static int btrfs_truncate(struct btrfs_inode *inode, bool skip_writeback)
76067606
};
76077607
struct btrfs_root *root = inode->root;
76087608
struct btrfs_fs_info *fs_info = root->fs_info;
7609-
struct btrfs_block_rsv *rsv;
7609+
struct btrfs_block_rsv rsv;
76107610
int ret;
76117611
struct btrfs_trans_handle *trans;
76127612
u64 mask = fs_info->sectorsize - 1;
@@ -7648,11 +7648,9 @@ static int btrfs_truncate(struct btrfs_inode *inode, bool skip_writeback)
76487648
* 2) fs_info->trans_block_rsv - this will have 1 items worth left for
76497649
* updating the inode.
76507650
*/
7651-
rsv = btrfs_alloc_block_rsv(fs_info, BTRFS_BLOCK_RSV_TEMP);
7652-
if (!rsv)
7653-
return -ENOMEM;
7654-
rsv->size = min_size;
7655-
rsv->failfast = true;
7651+
btrfs_init_metadata_block_rsv(fs_info, &rsv, BTRFS_BLOCK_RSV_TEMP);
7652+
rsv.size = min_size;
7653+
rsv.failfast = true;
76567654

76577655
/*
76587656
* 1 for the truncate slack space
@@ -7665,7 +7663,7 @@ static int btrfs_truncate(struct btrfs_inode *inode, bool skip_writeback)
76657663
}
76667664

76677665
/* Migrate the slack space for the truncate to our reserve */
7668-
ret = btrfs_block_rsv_migrate(&fs_info->trans_block_rsv, rsv,
7666+
ret = btrfs_block_rsv_migrate(&fs_info->trans_block_rsv, &rsv,
76697667
min_size, false);
76707668
/*
76717669
* We have reserved 2 metadata units when we started the transaction and
@@ -7677,7 +7675,7 @@ static int btrfs_truncate(struct btrfs_inode *inode, bool skip_writeback)
76777675
goto out;
76787676
}
76797677

7680-
trans->block_rsv = rsv;
7678+
trans->block_rsv = &rsv;
76817679

76827680
while (1) {
76837681
struct extent_state *cached_state = NULL;
@@ -7720,9 +7718,9 @@ static int btrfs_truncate(struct btrfs_inode *inode, bool skip_writeback)
77207718
break;
77217719
}
77227720

7723-
btrfs_block_rsv_release(fs_info, rsv, -1, NULL);
7721+
btrfs_block_rsv_release(fs_info, &rsv, -1, NULL);
77247722
ret = btrfs_block_rsv_migrate(&fs_info->trans_block_rsv,
7725-
rsv, min_size, false);
7723+
&rsv, min_size, false);
77267724
/*
77277725
* We have reserved 2 metadata units when we started the
77287726
* transaction and min_size matches 1 unit, so this should never
@@ -7731,7 +7729,7 @@ static int btrfs_truncate(struct btrfs_inode *inode, bool skip_writeback)
77317729
if (WARN_ON(ret))
77327730
break;
77337731

7734-
trans->block_rsv = rsv;
7732+
trans->block_rsv = &rsv;
77357733
}
77367734

77377735
/*
@@ -7770,7 +7768,7 @@ static int btrfs_truncate(struct btrfs_inode *inode, bool skip_writeback)
77707768
btrfs_btree_balance_dirty(fs_info);
77717769
}
77727770
out:
7773-
btrfs_free_block_rsv(fs_info, rsv);
7771+
btrfs_block_rsv_release(fs_info, &rsv, (u64)-1, NULL);
77747772
/*
77757773
* So if we truncate and then write and fsync we normally would just
77767774
* write the extents that changed, which is a problem if we need to

0 commit comments

Comments
 (0)