diff options
| -rw-r--r-- | fs/ext4/inode.c | 22 | ||||
| -rw-r--r-- | include/trace/events/ext4.h | 10 |
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 | */ |
| 1266 | static int ext4_da_reserve_space(struct inode *inode, ext4_lblk_t lblock) | 1266 | static 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 | ||
| 1187 | TRACE_EVENT(ext4_da_reserve_space, | 1187 | TRACE_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 | ||
