aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/ext4/inode.c22
-rw-r--r--include/trace/events/ext4.h10
2 files changed, 9 insertions, 23 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index e8a67b8ba90c..ae93f0bb9485 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -1261,13 +1261,12 @@ static int ext4_journalled_write_end(struct file *file,
1261} 1261}
1262 1262
1263/* 1263/*
1264 * Reserve a single cluster located at lblock 1264 * Reserve space for a single cluster
1265 */ 1265 */
1266static int ext4_da_reserve_space(struct inode *inode, ext4_lblk_t lblock) 1266static int ext4_da_reserve_space(struct inode *inode)
1267{ 1267{
1268 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); 1268 struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
1269 struct ext4_inode_info *ei = EXT4_I(inode); 1269 struct ext4_inode_info *ei = EXT4_I(inode);
1270 unsigned int md_needed;
1271 int ret; 1270 int ret;
1272 1271
1273 /* 1272 /*
@@ -1279,25 +1278,14 @@ static int ext4_da_reserve_space(struct inode *inode, ext4_lblk_t lblock)
1279 if (ret) 1278 if (ret)
1280 return ret; 1279 return ret;
1281 1280
1282 /*
1283 * recalculate the amount of metadata blocks to reserve
1284 * in order to allocate nrblocks
1285 * worse case is one extent per block
1286 */
1287 spin_lock(&ei->i_block_reservation_lock); 1281 spin_lock(&ei->i_block_reservation_lock);
1288 /*
1289 * ext4_calc_metadata_amount() has side effects, which we have
1290 * to be prepared undo if we fail to claim space.
1291 */
1292 md_needed = 0;
1293 trace_ext4_da_reserve_space(inode, 0);
1294
1295 if (ext4_claim_free_clusters(sbi, 1, 0)) { 1282 if (ext4_claim_free_clusters(sbi, 1, 0)) {
1296 spin_unlock(&ei->i_block_reservation_lock); 1283 spin_unlock(&ei->i_block_reservation_lock);
1297 dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1)); 1284 dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1));
1298 return -ENOSPC; 1285 return -ENOSPC;
1299 } 1286 }
1300 ei->i_reserved_data_blocks++; 1287 ei->i_reserved_data_blocks++;
1288 trace_ext4_da_reserve_space(inode);
1301 spin_unlock(&ei->i_block_reservation_lock); 1289 spin_unlock(&ei->i_block_reservation_lock);
1302 1290
1303 return 0; /* success */ 1291 return 0; /* success */
@@ -1566,9 +1554,9 @@ add_delayed:
1566 * then we don't need to reserve it again. However we still need 1554 * then we don't need to reserve it again. However we still need
1567 * to reserve metadata for every block we're going to write. 1555 * to reserve metadata for every block we're going to write.
1568 */ 1556 */
1569 if (EXT4_SB(inode->i_sb)->s_cluster_ratio <= 1 || 1557 if (EXT4_SB(inode->i_sb)->s_cluster_ratio == 1 ||
1570 !ext4_find_delalloc_cluster(inode, map->m_lblk)) { 1558 !ext4_find_delalloc_cluster(inode, map->m_lblk)) {
1571 ret = ext4_da_reserve_space(inode, iblock); 1559 ret = ext4_da_reserve_space(inode);
1572 if (ret) { 1560 if (ret) {
1573 /* not enough space to reserve */ 1561 /* not enough space to reserve */
1574 retval = ret; 1562 retval = ret;
diff --git a/include/trace/events/ext4.h b/include/trace/events/ext4.h
index 0faf5702a68a..594b4b29a224 100644
--- a/include/trace/events/ext4.h
+++ b/include/trace/events/ext4.h
@@ -1185,15 +1185,14 @@ TRACE_EVENT(ext4_da_update_reserve_space,
1185); 1185);
1186 1186
1187TRACE_EVENT(ext4_da_reserve_space, 1187TRACE_EVENT(ext4_da_reserve_space,
1188 TP_PROTO(struct inode *inode, int md_needed), 1188 TP_PROTO(struct inode *inode),
1189 1189
1190 TP_ARGS(inode, md_needed), 1190 TP_ARGS(inode),
1191 1191
1192 TP_STRUCT__entry( 1192 TP_STRUCT__entry(
1193 __field( dev_t, dev ) 1193 __field( dev_t, dev )
1194 __field( ino_t, ino ) 1194 __field( ino_t, ino )
1195 __field( __u64, i_blocks ) 1195 __field( __u64, i_blocks )
1196 __field( int, md_needed )
1197 __field( int, reserved_data_blocks ) 1196 __field( int, reserved_data_blocks )
1198 __field( int, reserved_meta_blocks ) 1197 __field( int, reserved_meta_blocks )
1199 __field( __u16, mode ) 1198 __field( __u16, mode )
@@ -1203,18 +1202,17 @@ TRACE_EVENT(ext4_da_reserve_space,
1203 __entry->dev = inode->i_sb->s_dev; 1202 __entry->dev = inode->i_sb->s_dev;
1204 __entry->ino = inode->i_ino; 1203 __entry->ino = inode->i_ino;
1205 __entry->i_blocks = inode->i_blocks; 1204 __entry->i_blocks = inode->i_blocks;
1206 __entry->md_needed = md_needed;
1207 __entry->reserved_data_blocks = EXT4_I(inode)->i_reserved_data_blocks; 1205 __entry->reserved_data_blocks = EXT4_I(inode)->i_reserved_data_blocks;
1208 __entry->reserved_meta_blocks = EXT4_I(inode)->i_reserved_meta_blocks; 1206 __entry->reserved_meta_blocks = EXT4_I(inode)->i_reserved_meta_blocks;
1209 __entry->mode = inode->i_mode; 1207 __entry->mode = inode->i_mode;
1210 ), 1208 ),
1211 1209
1212 TP_printk("dev %d,%d ino %lu mode 0%o i_blocks %llu md_needed %d " 1210 TP_printk("dev %d,%d ino %lu mode 0%o i_blocks %llu "
1213 "reserved_data_blocks %d reserved_meta_blocks %d", 1211 "reserved_data_blocks %d reserved_meta_blocks %d",
1214 MAJOR(__entry->dev), MINOR(__entry->dev), 1212 MAJOR(__entry->dev), MINOR(__entry->dev),
1215 (unsigned long) __entry->ino, 1213 (unsigned long) __entry->ino,
1216 __entry->mode, __entry->i_blocks, 1214 __entry->mode, __entry->i_blocks,
1217 __entry->md_needed, __entry->reserved_data_blocks, 1215 __entry->reserved_data_blocks,
1218 __entry->reserved_meta_blocks) 1216 __entry->reserved_meta_blocks)
1219); 1217);
1220 1218