Skip to content

Commit 71d4f7d

Browse files
committed
ext4: remove metadata reservation checks
Commit 27dd438 ("ext4: introduce reserved space") reserves 2% of the file system space to make sure metadata allocations will always succeed. Given that, tracking the reservation of metadata blocks is no longer necessary. Signed-off-by: Theodore Ts'o <tytso@mit.edu>
1 parent d5e03cb commit 71d4f7d

File tree

5 files changed

+7
-141
lines changed

5 files changed

+7
-141
lines changed

fs/ext4/balloc.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,6 @@ ext4_fsblk_t ext4_new_meta_blocks(handle_t *handle, struct inode *inode,
639639
if (!(*errp) &&
640640
ext4_test_inode_state(inode, EXT4_STATE_DELALLOC_RESERVED)) {
641641
spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
642-
EXT4_I(inode)->i_allocated_meta_blocks += ar.len;
643642
spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
644643
dquot_alloc_block_nofail(inode,
645644
EXT4_C2B(EXT4_SB(inode->i_sb), ar.len));

fs/ext4/ext4.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -591,7 +591,6 @@ enum {
591591
#define EXT4_FREE_BLOCKS_NO_QUOT_UPDATE 0x0008
592592
#define EXT4_FREE_BLOCKS_NOFREE_FIRST_CLUSTER 0x0010
593593
#define EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER 0x0020
594-
#define EXT4_FREE_BLOCKS_RESERVE 0x0040
595594

596595
/*
597596
* ioctl commands

fs/ext4/extents.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1808,8 +1808,7 @@ static void ext4_ext_try_to_merge_up(handle_t *handle,
18081808

18091809
brelse(path[1].p_bh);
18101810
ext4_free_blocks(handle, inode, NULL, blk, 1,
1811-
EXT4_FREE_BLOCKS_METADATA | EXT4_FREE_BLOCKS_FORGET |
1812-
EXT4_FREE_BLOCKS_RESERVE);
1811+
EXT4_FREE_BLOCKS_METADATA | EXT4_FREE_BLOCKS_FORGET);
18131812
}
18141813

18151814
/*

fs/ext4/inode.c

Lines changed: 5 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -324,18 +324,6 @@ qsize_t *ext4_get_reserved_space(struct inode *inode)
324324
}
325325
#endif
326326

327-
/*
328-
* Calculate the number of metadata blocks need to reserve
329-
* to allocate a block located at @lblock
330-
*/
331-
static int ext4_calc_metadata_amount(struct inode *inode, ext4_lblk_t lblock)
332-
{
333-
if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
334-
return ext4_ext_calc_metadata_amount(inode, lblock);
335-
336-
return ext4_ind_calc_metadata_amount(inode, lblock);
337-
}
338-
339327
/*
340328
* Called with i_data_sem down, which is important since we can call
341329
* ext4_discard_preallocations() from here.
@@ -357,35 +345,10 @@ void ext4_da_update_reserve_space(struct inode *inode,
357345
used = ei->i_reserved_data_blocks;
358346
}
359347

360-
if (unlikely(ei->i_allocated_meta_blocks > ei->i_reserved_meta_blocks)) {
361-
ext4_warning(inode->i_sb, "ino %lu, allocated %d "
362-
"with only %d reserved metadata blocks "
363-
"(releasing %d blocks with reserved %d data blocks)",
364-
inode->i_ino, ei->i_allocated_meta_blocks,
365-
ei->i_reserved_meta_blocks, used,
366-
ei->i_reserved_data_blocks);
367-
WARN_ON(1);
368-
ei->i_allocated_meta_blocks = ei->i_reserved_meta_blocks;
369-
}
370-
371348
/* Update per-inode reservations */
372349
ei->i_reserved_data_blocks -= used;
373-
ei->i_reserved_meta_blocks -= ei->i_allocated_meta_blocks;
374-
percpu_counter_sub(&sbi->s_dirtyclusters_counter,
375-
used + ei->i_allocated_meta_blocks);
376-
ei->i_allocated_meta_blocks = 0;
350+
percpu_counter_sub(&sbi->s_dirtyclusters_counter, used);
377351

378-
if (ei->i_reserved_data_blocks == 0) {
379-
/*
380-
* We can release all of the reserved metadata blocks
381-
* only when we have written all of the delayed
382-
* allocation blocks.
383-
*/
384-
percpu_counter_sub(&sbi->s_dirtyclusters_counter,
385-
ei->i_reserved_meta_blocks);
386-
ei->i_reserved_meta_blocks = 0;
387-
ei->i_da_metadata_calc_len = 0;
388-
}
389352
spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
390353

391354
/* Update quota subsystem for data blocks */
@@ -1221,49 +1184,6 @@ static int ext4_journalled_write_end(struct file *file,
12211184
return ret ? ret : copied;
12221185
}
12231186

1224-
/*
1225-
* Reserve a metadata for a single block located at lblock
1226-
*/
1227-
static int ext4_da_reserve_metadata(struct inode *inode, ext4_lblk_t lblock)
1228-
{
1229-
struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
1230-
struct ext4_inode_info *ei = EXT4_I(inode);
1231-
unsigned int md_needed;
1232-
ext4_lblk_t save_last_lblock;
1233-
int save_len;
1234-
1235-
/*
1236-
* recalculate the amount of metadata blocks to reserve
1237-
* in order to allocate nrblocks
1238-
* worse case is one extent per block
1239-
*/
1240-
spin_lock(&ei->i_block_reservation_lock);
1241-
/*
1242-
* ext4_calc_metadata_amount() has side effects, which we have
1243-
* to be prepared undo if we fail to claim space.
1244-
*/
1245-
save_len = ei->i_da_metadata_calc_len;
1246-
save_last_lblock = ei->i_da_metadata_calc_last_lblock;
1247-
md_needed = EXT4_NUM_B2C(sbi,
1248-
ext4_calc_metadata_amount(inode, lblock));
1249-
trace_ext4_da_reserve_space(inode, md_needed);
1250-
1251-
/*
1252-
* We do still charge estimated metadata to the sb though;
1253-
* we cannot afford to run out of free blocks.
1254-
*/
1255-
if (ext4_claim_free_clusters(sbi, md_needed, 0)) {
1256-
ei->i_da_metadata_calc_len = save_len;
1257-
ei->i_da_metadata_calc_last_lblock = save_last_lblock;
1258-
spin_unlock(&ei->i_block_reservation_lock);
1259-
return -ENOSPC;
1260-
}
1261-
ei->i_reserved_meta_blocks += md_needed;
1262-
spin_unlock(&ei->i_block_reservation_lock);
1263-
1264-
return 0; /* success */
1265-
}
1266-
12671187
/*
12681188
* Reserve a single cluster located at lblock
12691189
*/
@@ -1273,8 +1193,6 @@ static int ext4_da_reserve_space(struct inode *inode, ext4_lblk_t lblock)
12731193
struct ext4_inode_info *ei = EXT4_I(inode);
12741194
unsigned int md_needed;
12751195
int ret;
1276-
ext4_lblk_t save_last_lblock;
1277-
int save_len;
12781196

12791197
/*
12801198
* We will charge metadata quota at writeout time; this saves
@@ -1295,25 +1213,15 @@ static int ext4_da_reserve_space(struct inode *inode, ext4_lblk_t lblock)
12951213
* ext4_calc_metadata_amount() has side effects, which we have
12961214
* to be prepared undo if we fail to claim space.
12971215
*/
1298-
save_len = ei->i_da_metadata_calc_len;
1299-
save_last_lblock = ei->i_da_metadata_calc_last_lblock;
1300-
md_needed = EXT4_NUM_B2C(sbi,
1301-
ext4_calc_metadata_amount(inode, lblock));
1302-
trace_ext4_da_reserve_space(inode, md_needed);
1216+
md_needed = 0;
1217+
trace_ext4_da_reserve_space(inode, 0);
13031218

1304-
/*
1305-
* We do still charge estimated metadata to the sb though;
1306-
* we cannot afford to run out of free blocks.
1307-
*/
1308-
if (ext4_claim_free_clusters(sbi, md_needed + 1, 0)) {
1309-
ei->i_da_metadata_calc_len = save_len;
1310-
ei->i_da_metadata_calc_last_lblock = save_last_lblock;
1219+
if (ext4_claim_free_clusters(sbi, 1, 0)) {
13111220
spin_unlock(&ei->i_block_reservation_lock);
13121221
dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1));
13131222
return -ENOSPC;
13141223
}
13151224
ei->i_reserved_data_blocks++;
1316-
ei->i_reserved_meta_blocks += md_needed;
13171225
spin_unlock(&ei->i_block_reservation_lock);
13181226

13191227
return 0; /* success */
@@ -1346,20 +1254,6 @@ static void ext4_da_release_space(struct inode *inode, int to_free)
13461254
}
13471255
ei->i_reserved_data_blocks -= to_free;
13481256

1349-
if (ei->i_reserved_data_blocks == 0) {
1350-
/*
1351-
* We can release all of the reserved metadata blocks
1352-
* only when we have written all of the delayed
1353-
* allocation blocks.
1354-
* Note that in case of bigalloc, i_reserved_meta_blocks,
1355-
* i_reserved_data_blocks, etc. refer to number of clusters.
1356-
*/
1357-
percpu_counter_sub(&sbi->s_dirtyclusters_counter,
1358-
ei->i_reserved_meta_blocks);
1359-
ei->i_reserved_meta_blocks = 0;
1360-
ei->i_da_metadata_calc_len = 0;
1361-
}
1362-
13631257
/* update fs dirty data blocks counter */
13641258
percpu_counter_sub(&sbi->s_dirtyclusters_counter, to_free);
13651259

@@ -1500,10 +1394,6 @@ static void ext4_print_free_blocks(struct inode *inode)
15001394
ext4_msg(sb, KERN_CRIT, "Block reservation details");
15011395
ext4_msg(sb, KERN_CRIT, "i_reserved_data_blocks=%u",
15021396
ei->i_reserved_data_blocks);
1503-
ext4_msg(sb, KERN_CRIT, "i_reserved_meta_blocks=%u",
1504-
ei->i_reserved_meta_blocks);
1505-
ext4_msg(sb, KERN_CRIT, "i_allocated_meta_blocks=%u",
1506-
ei->i_allocated_meta_blocks);
15071397
return;
15081398
}
15091399

@@ -1620,13 +1510,6 @@ static int ext4_da_map_blocks(struct inode *inode, sector_t iblock,
16201510
retval = ret;
16211511
goto out_unlock;
16221512
}
1623-
} else {
1624-
ret = ext4_da_reserve_metadata(inode, iblock);
1625-
if (ret) {
1626-
/* not enough space to reserve */
1627-
retval = ret;
1628-
goto out_unlock;
1629-
}
16301513
}
16311514

16321515
ret = ext4_es_insert_extent(inode, map->m_lblk, map->m_len,
@@ -2843,8 +2726,7 @@ int ext4_alloc_da_blocks(struct inode *inode)
28432726
{
28442727
trace_ext4_alloc_da_blocks(inode);
28452728

2846-
if (!EXT4_I(inode)->i_reserved_data_blocks &&
2847-
!EXT4_I(inode)->i_reserved_meta_blocks)
2729+
if (!EXT4_I(inode)->i_reserved_data_blocks)
28482730
return 0;
28492731

28502732
/*

fs/ext4/mballoc.c

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4627,7 +4627,6 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,
46274627
struct buffer_head *gd_bh;
46284628
ext4_group_t block_group;
46294629
struct ext4_sb_info *sbi;
4630-
struct ext4_inode_info *ei = EXT4_I(inode);
46314630
struct ext4_buddy e4b;
46324631
unsigned int count_clusters;
46334632
int err = 0;
@@ -4838,19 +4837,7 @@ void ext4_free_blocks(handle_t *handle, struct inode *inode,
48384837
&sbi->s_flex_groups[flex_group].free_clusters);
48394838
}
48404839

4841-
if (flags & EXT4_FREE_BLOCKS_RESERVE && ei->i_reserved_data_blocks) {
4842-
percpu_counter_add(&sbi->s_dirtyclusters_counter,
4843-
count_clusters);
4844-
spin_lock(&ei->i_block_reservation_lock);
4845-
if (flags & EXT4_FREE_BLOCKS_METADATA)
4846-
ei->i_reserved_meta_blocks += count_clusters;
4847-
else
4848-
ei->i_reserved_data_blocks += count_clusters;
4849-
spin_unlock(&ei->i_block_reservation_lock);
4850-
if (!(flags & EXT4_FREE_BLOCKS_NO_QUOT_UPDATE))
4851-
dquot_reclaim_block(inode,
4852-
EXT4_C2B(sbi, count_clusters));
4853-
} else if (!(flags & EXT4_FREE_BLOCKS_NO_QUOT_UPDATE))
4840+
if (!(flags & EXT4_FREE_BLOCKS_NO_QUOT_UPDATE))
48544841
dquot_free_block(inode, EXT4_C2B(sbi, count_clusters));
48554842
percpu_counter_add(&sbi->s_freeclusters_counter, count_clusters);
48564843

0 commit comments

Comments
 (0)