Skip to content

Commit 0d66b23

Browse files
zhangyi089tytso
authored andcommitted
ext4: make ext4_da_reserve_space() reserve multi-clusters
Add 'nr_resv' parameter to ext4_da_reserve_space(), which indicates the number of clusters wants to reserve, make it reserve multiple clusters at a time. Signed-off-by: Zhang Yi <[email protected]> Reviewed-by: Jan Kara <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Theodore Ts'o <[email protected]>
1 parent 12eba99 commit 0d66b23

File tree

2 files changed

+15
-13
lines changed

2 files changed

+15
-13
lines changed

fs/ext4/inode.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,9 +1479,9 @@ static int ext4_journalled_write_end(struct file *file,
14791479
}
14801480

14811481
/*
1482-
* Reserve space for a single cluster
1482+
* Reserve space for 'nr_resv' clusters
14831483
*/
1484-
static int ext4_da_reserve_space(struct inode *inode)
1484+
static int ext4_da_reserve_space(struct inode *inode, int nr_resv)
14851485
{
14861486
struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
14871487
struct ext4_inode_info *ei = EXT4_I(inode);
@@ -1492,18 +1492,18 @@ static int ext4_da_reserve_space(struct inode *inode)
14921492
* us from metadata over-estimation, though we may go over by
14931493
* a small amount in the end. Here we just reserve for data.
14941494
*/
1495-
ret = dquot_reserve_block(inode, EXT4_C2B(sbi, 1));
1495+
ret = dquot_reserve_block(inode, EXT4_C2B(sbi, nr_resv));
14961496
if (ret)
14971497
return ret;
14981498

14991499
spin_lock(&ei->i_block_reservation_lock);
1500-
if (ext4_claim_free_clusters(sbi, 1, 0)) {
1500+
if (ext4_claim_free_clusters(sbi, nr_resv, 0)) {
15011501
spin_unlock(&ei->i_block_reservation_lock);
1502-
dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1));
1502+
dquot_release_reservation_block(inode, EXT4_C2B(sbi, nr_resv));
15031503
return -ENOSPC;
15041504
}
1505-
ei->i_reserved_data_blocks++;
1506-
trace_ext4_da_reserve_space(inode);
1505+
ei->i_reserved_data_blocks += nr_resv;
1506+
trace_ext4_da_reserve_space(inode, nr_resv);
15071507
spin_unlock(&ei->i_block_reservation_lock);
15081508

15091509
return 0; /* success */
@@ -1678,7 +1678,7 @@ static int ext4_insert_delayed_block(struct inode *inode, ext4_lblk_t lblk)
16781678
* extents status tree doesn't get a match.
16791679
*/
16801680
if (sbi->s_cluster_ratio == 1) {
1681-
ret = ext4_da_reserve_space(inode);
1681+
ret = ext4_da_reserve_space(inode, 1);
16821682
if (ret != 0) /* ENOSPC */
16831683
return ret;
16841684
} else { /* bigalloc */
@@ -1690,7 +1690,7 @@ static int ext4_insert_delayed_block(struct inode *inode, ext4_lblk_t lblk)
16901690
if (ret < 0)
16911691
return ret;
16921692
if (ret == 0) {
1693-
ret = ext4_da_reserve_space(inode);
1693+
ret = ext4_da_reserve_space(inode, 1);
16941694
if (ret != 0) /* ENOSPC */
16951695
return ret;
16961696
} else {

include/trace/events/ext4.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,14 +1246,15 @@ TRACE_EVENT(ext4_da_update_reserve_space,
12461246
);
12471247

12481248
TRACE_EVENT(ext4_da_reserve_space,
1249-
TP_PROTO(struct inode *inode),
1249+
TP_PROTO(struct inode *inode, int nr_resv),
12501250

1251-
TP_ARGS(inode),
1251+
TP_ARGS(inode, nr_resv),
12521252

12531253
TP_STRUCT__entry(
12541254
__field( dev_t, dev )
12551255
__field( ino_t, ino )
12561256
__field( __u64, i_blocks )
1257+
__field( int, reserve_blocks )
12571258
__field( int, reserved_data_blocks )
12581259
__field( __u16, mode )
12591260
),
@@ -1262,16 +1263,17 @@ TRACE_EVENT(ext4_da_reserve_space,
12621263
__entry->dev = inode->i_sb->s_dev;
12631264
__entry->ino = inode->i_ino;
12641265
__entry->i_blocks = inode->i_blocks;
1266+
__entry->reserve_blocks = nr_resv;
12651267
__entry->reserved_data_blocks = EXT4_I(inode)->i_reserved_data_blocks;
12661268
__entry->mode = inode->i_mode;
12671269
),
12681270

1269-
TP_printk("dev %d,%d ino %lu mode 0%o i_blocks %llu "
1271+
TP_printk("dev %d,%d ino %lu mode 0%o i_blocks %llu reserve_blocks %d"
12701272
"reserved_data_blocks %d",
12711273
MAJOR(__entry->dev), MINOR(__entry->dev),
12721274
(unsigned long) __entry->ino,
12731275
__entry->mode, __entry->i_blocks,
1274-
__entry->reserved_data_blocks)
1276+
__entry->reserve_blocks, __entry->reserved_data_blocks)
12751277
);
12761278

12771279
TRACE_EVENT(ext4_da_release_space,

0 commit comments

Comments
 (0)