diff options
| -rw-r--r-- | fs/ext4/balloc.c | 1 | ||||
| -rw-r--r-- | fs/ext4/ext4.h | 1 | ||||
| -rw-r--r-- | fs/ext4/extents.c | 3 | ||||
| -rw-r--r-- | fs/ext4/inode.c | 128 | ||||
| -rw-r--r-- | fs/ext4/mballoc.c | 15 |
5 files changed, 7 insertions, 141 deletions
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index fca382037ddd..581ef40fbe90 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c | |||
| @@ -639,7 +639,6 @@ ext4_fsblk_t ext4_new_meta_blocks(handle_t *handle, struct inode *inode, | |||
| 639 | if (!(*errp) && | 639 | if (!(*errp) && |
| 640 | ext4_test_inode_state(inode, EXT4_STATE_DELALLOC_RESERVED)) { | 640 | ext4_test_inode_state(inode, EXT4_STATE_DELALLOC_RESERVED)) { |
| 641 | spin_lock(&EXT4_I(inode)->i_block_reservation_lock); | 641 | spin_lock(&EXT4_I(inode)->i_block_reservation_lock); |
| 642 | EXT4_I(inode)->i_allocated_meta_blocks += ar.len; | ||
| 643 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); | 642 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); |
| 644 | dquot_alloc_block_nofail(inode, | 643 | dquot_alloc_block_nofail(inode, |
| 645 | EXT4_C2B(EXT4_SB(inode->i_sb), ar.len)); | 644 | EXT4_C2B(EXT4_SB(inode->i_sb), ar.len)); |
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 7cc5a0e23688..d35c78c96184 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
| @@ -591,7 +591,6 @@ enum { | |||
| 591 | #define EXT4_FREE_BLOCKS_NO_QUOT_UPDATE 0x0008 | 591 | #define EXT4_FREE_BLOCKS_NO_QUOT_UPDATE 0x0008 |
| 592 | #define EXT4_FREE_BLOCKS_NOFREE_FIRST_CLUSTER 0x0010 | 592 | #define EXT4_FREE_BLOCKS_NOFREE_FIRST_CLUSTER 0x0010 |
| 593 | #define EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER 0x0020 | 593 | #define EXT4_FREE_BLOCKS_NOFREE_LAST_CLUSTER 0x0020 |
| 594 | #define EXT4_FREE_BLOCKS_RESERVE 0x0040 | ||
| 595 | 594 | ||
| 596 | /* | 595 | /* |
| 597 | * ioctl commands | 596 | * ioctl commands |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 4da228a0e6d0..b30172dd55eb 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
| @@ -1808,8 +1808,7 @@ static void ext4_ext_try_to_merge_up(handle_t *handle, | |||
| 1808 | 1808 | ||
| 1809 | brelse(path[1].p_bh); | 1809 | brelse(path[1].p_bh); |
| 1810 | ext4_free_blocks(handle, inode, NULL, blk, 1, | 1810 | ext4_free_blocks(handle, inode, NULL, blk, 1, |
| 1811 | EXT4_FREE_BLOCKS_METADATA | EXT4_FREE_BLOCKS_FORGET | | 1811 | EXT4_FREE_BLOCKS_METADATA | EXT4_FREE_BLOCKS_FORGET); |
| 1812 | EXT4_FREE_BLOCKS_RESERVE); | ||
| 1813 | } | 1812 | } |
| 1814 | 1813 | ||
| 1815 | /* | 1814 | /* |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 8a064734e6eb..027ee8c40470 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
| @@ -325,18 +325,6 @@ qsize_t *ext4_get_reserved_space(struct inode *inode) | |||
| 325 | #endif | 325 | #endif |
| 326 | 326 | ||
| 327 | /* | 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 | |||
| 339 | /* | ||
| 340 | * Called with i_data_sem down, which is important since we can call | 328 | * Called with i_data_sem down, which is important since we can call |
| 341 | * ext4_discard_preallocations() from here. | 329 | * ext4_discard_preallocations() from here. |
| 342 | */ | 330 | */ |
| @@ -357,35 +345,10 @@ void ext4_da_update_reserve_space(struct inode *inode, | |||
| 357 | used = ei->i_reserved_data_blocks; | 345 | used = ei->i_reserved_data_blocks; |
| 358 | } | 346 | } |
| 359 | 347 | ||
| 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 | |||
| 371 | /* Update per-inode reservations */ | 348 | /* Update per-inode reservations */ |
| 372 | ei->i_reserved_data_blocks -= used; | 349 | ei->i_reserved_data_blocks -= used; |
| 373 | ei->i_reserved_meta_blocks -= ei->i_allocated_meta_blocks; | 350 | percpu_counter_sub(&sbi->s_dirtyclusters_counter, used); |
| 374 | percpu_counter_sub(&sbi->s_dirtyclusters_counter, | ||
| 375 | used + ei->i_allocated_meta_blocks); | ||
| 376 | ei->i_allocated_meta_blocks = 0; | ||
| 377 | 351 | ||
| 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 | } | ||
| 389 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); | 352 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); |
| 390 | 353 | ||
| 391 | /* Update quota subsystem for data blocks */ | 354 | /* Update quota subsystem for data blocks */ |
| @@ -1222,49 +1185,6 @@ static int ext4_journalled_write_end(struct file *file, | |||
| 1222 | } | 1185 | } |
| 1223 | 1186 | ||
| 1224 | /* | 1187 | /* |
| 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 | |||
| 1267 | /* | ||
| 1268 | * Reserve a single cluster located at lblock | 1188 | * Reserve a single cluster located at lblock |
| 1269 | */ | 1189 | */ |
| 1270 | static int ext4_da_reserve_space(struct inode *inode, ext4_lblk_t lblock) | 1190 | static int ext4_da_reserve_space(struct inode *inode, ext4_lblk_t lblock) |
| @@ -1273,8 +1193,6 @@ static int ext4_da_reserve_space(struct inode *inode, ext4_lblk_t lblock) | |||
| 1273 | struct ext4_inode_info *ei = EXT4_I(inode); | 1193 | struct ext4_inode_info *ei = EXT4_I(inode); |
| 1274 | unsigned int md_needed; | 1194 | unsigned int md_needed; |
| 1275 | int ret; | 1195 | int ret; |
| 1276 | ext4_lblk_t save_last_lblock; | ||
| 1277 | int save_len; | ||
| 1278 | 1196 | ||
| 1279 | /* | 1197 | /* |
| 1280 | * We will charge metadata quota at writeout time; this saves | 1198 | * 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) | |||
| 1295 | * ext4_calc_metadata_amount() has side effects, which we have | 1213 | * ext4_calc_metadata_amount() has side effects, which we have |
| 1296 | * to be prepared undo if we fail to claim space. | 1214 | * to be prepared undo if we fail to claim space. |
| 1297 | */ | 1215 | */ |
| 1298 | save_len = ei->i_da_metadata_calc_len; | 1216 | md_needed = 0; |
| 1299 | save_last_lblock = ei->i_da_metadata_calc_last_lblock; | 1217 | trace_ext4_da_reserve_space(inode, 0); |
| 1300 | md_needed = EXT4_NUM_B2C(sbi, | ||
| 1301 | ext4_calc_metadata_amount(inode, lblock)); | ||
| 1302 | trace_ext4_da_reserve_space(inode, md_needed); | ||
| 1303 | 1218 | ||
| 1304 | /* | 1219 | if (ext4_claim_free_clusters(sbi, 1, 0)) { |
| 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; | ||
| 1311 | spin_unlock(&ei->i_block_reservation_lock); | 1220 | spin_unlock(&ei->i_block_reservation_lock); |
| 1312 | dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1)); | 1221 | dquot_release_reservation_block(inode, EXT4_C2B(sbi, 1)); |
| 1313 | return -ENOSPC; | 1222 | return -ENOSPC; |
| 1314 | } | 1223 | } |
| 1315 | ei->i_reserved_data_blocks++; | 1224 | ei->i_reserved_data_blocks++; |
| 1316 | ei->i_reserved_meta_blocks += md_needed; | ||
| 1317 | spin_unlock(&ei->i_block_reservation_lock); | 1225 | spin_unlock(&ei->i_block_reservation_lock); |
| 1318 | 1226 | ||
