Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'ext4_for_linus-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4

Pull ext4 updates from Ted Ts'o:
"Ext4 bug fixes and cleanups, plus some additional kunit tests"

* tag 'ext4_for_linus-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: (23 commits)
ext4: initialize sbi->s_freeclusters_counter and sbi->s_dirtyclusters_counter before use in kunit test
ext4: hold group lock in ext4 kunit test
ext4: alloc test super block from sget
ext4: kunit: use dynamic inode allocation
ext4: enable meta_bg only when new desc blocks are needed
ext4: remove unused parameter biop in ext4_issue_discard()
ext4: remove SLAB_MEM_SPREAD flag usage
ext4: verify s_clusters_per_group even without bigalloc
ext4: fix corruption during on-line resize
ext4: don't report EOPNOTSUPP errors from discard
ext4: drop duplicate ea_inode handling in ext4_xattr_block_set()
ext4: fold quota accounting into ext4_xattr_inode_lookup_create()
ext4: correct best extent lstart adjustment logic
ext4: forbid commit inconsistent quota data when errors=remount-ro
ext4: add a hint for block bitmap corrupt state in mb_groups
ext4: fix the comment of ext4_map_blocks()/ext4_ext_map_blocks()
ext4: improve error msg for ext4_mb_seq_groups_show
ext4: remove unused buddy_loaded in ext4_mb_seq_groups_show
ext4: Add unit test for ext4_mb_mark_diskspace_used
ext4: Add unit test for mb_free_blocks
...

+679 -108
+3 -3
fs/ext4/extents.c
··· 4111 4111 * 4112 4112 * Need to be called with 4113 4113 * down_read(&EXT4_I(inode)->i_data_sem) if not allocating file system block 4114 - * (ie, create is zero). Otherwise down_write(&EXT4_I(inode)->i_data_sem) 4114 + * (ie, flags is zero). Otherwise down_write(&EXT4_I(inode)->i_data_sem) 4115 4115 * 4116 4116 * return > 0, number of blocks already mapped/allocated 4117 - * if create == 0 and these are pre-allocated blocks 4117 + * if flags doesn't contain EXT4_GET_BLOCKS_CREATE and these are pre-allocated blocks 4118 4118 * buffer head is unmapped 4119 4119 * otherwise blocks are mapped 4120 4120 * ··· 4218 4218 4219 4219 /* 4220 4220 * requested block isn't allocated yet; 4221 - * we couldn't try to create block if create flag is zero 4221 + * we couldn't try to create block if flags doesn't contain EXT4_GET_BLOCKS_CREATE 4222 4222 */ 4223 4223 if ((flags & EXT4_GET_BLOCKS_CREATE) == 0) { 4224 4224 ext4_lblk_t len;
+5 -5
fs/ext4/inode.c
··· 465 465 * Otherwise, call with ext4_ind_map_blocks() to handle indirect mapping 466 466 * based files 467 467 * 468 - * On success, it returns the number of blocks being mapped or allocated. if 469 - * create==0 and the blocks are pre-allocated and unwritten, the resulting @map 470 - * is marked as unwritten. If the create == 1, it will mark @map as mapped. 468 + * On success, it returns the number of blocks being mapped or allocated. 469 + * If flags doesn't contain EXT4_GET_BLOCKS_CREATE the blocks are 470 + * pre-allocated and unwritten, the resulting @map is marked as unwritten. 471 + * If the flags contain EXT4_GET_BLOCKS_CREATE, it will mark @map as mapped. 471 472 * 472 473 * It returns 0 if plain look up failed (blocks have not been allocated), in 473 474 * that case, @map is returned as unmapped but we still do fill map->m_len to ··· 590 589 * Returns if the blocks have already allocated 591 590 * 592 591 * Note that if blocks have been preallocated 593 - * ext4_ext_get_block() returns the create = 0 594 - * with buffer head unmapped. 592 + * ext4_ext_map_blocks() returns with buffer head unmapped 595 593 */ 596 594 if (retval > 0 && map->m_flags & EXT4_MAP_MAPPED) 597 595 /*
+584 -17
fs/ext4/mballoc-test.c
··· 5 5 6 6 #include <kunit/test.h> 7 7 #include <kunit/static_stub.h> 8 + #include <linux/random.h> 8 9 9 10 #include "ext4.h" 10 11 ··· 21 20 }; 22 21 23 22 struct mbt_ext4_super_block { 24 - struct super_block sb; 23 + struct ext4_super_block es; 24 + struct ext4_sb_info sbi; 25 25 struct mbt_ctx mbt_ctx; 26 26 }; 27 27 28 - #define MBT_CTX(_sb) (&(container_of((_sb), struct mbt_ext4_super_block, sb)->mbt_ctx)) 28 + #define MBT_SB(_sb) (container_of((_sb)->s_fs_info, struct mbt_ext4_super_block, sbi)) 29 + #define MBT_CTX(_sb) (&MBT_SB(_sb)->mbt_ctx) 29 30 #define MBT_GRP_CTX(_sb, _group) (&MBT_CTX(_sb)->grp_ctx[_group]) 31 + 32 + static const struct super_operations mbt_sops = { 33 + }; 34 + 35 + static void mbt_kill_sb(struct super_block *sb) 36 + { 37 + generic_shutdown_super(sb); 38 + } 39 + 40 + static struct file_system_type mbt_fs_type = { 41 + .name = "mballoc test", 42 + .kill_sb = mbt_kill_sb, 43 + }; 44 + 45 + static int mbt_mb_init(struct super_block *sb) 46 + { 47 + ext4_fsblk_t block; 48 + int ret; 49 + 50 + /* needed by ext4_mb_init->bdev_nonrot(sb->s_bdev) */ 51 + sb->s_bdev = kzalloc(sizeof(*sb->s_bdev), GFP_KERNEL); 52 + if (sb->s_bdev == NULL) 53 + return -ENOMEM; 54 + 55 + sb->s_bdev->bd_queue = kzalloc(sizeof(struct request_queue), GFP_KERNEL); 56 + if (sb->s_bdev->bd_queue == NULL) { 57 + kfree(sb->s_bdev); 58 + return -ENOMEM; 59 + } 60 + 61 + /* 62 + * needed by ext4_mb_init->ext4_mb_init_backend-> sbi->s_buddy_cache = 63 + * new_inode(sb); 64 + */ 65 + INIT_LIST_HEAD(&sb->s_inodes); 66 + sb->s_op = &mbt_sops; 67 + 68 + ret = ext4_mb_init(sb); 69 + if (ret != 0) 70 + goto err_out; 71 + 72 + block = ext4_count_free_clusters(sb); 73 + ret = percpu_counter_init(&EXT4_SB(sb)->s_freeclusters_counter, block, 74 + GFP_KERNEL); 75 + if (ret != 0) 76 + goto err_mb_release; 77 + 78 + ret = percpu_counter_init(&EXT4_SB(sb)->s_dirtyclusters_counter, 0, 79 + GFP_KERNEL); 80 + if (ret != 0) 81 + goto err_freeclusters; 82 + 83 + return 0; 84 + 85 + err_freeclusters: 86 + percpu_counter_destroy(&EXT4_SB(sb)->s_freeclusters_counter); 87 + err_mb_release: 88 + ext4_mb_release(sb); 89 + err_out: 90 + kfree(sb->s_bdev->bd_queue); 91 + kfree(sb->s_bdev); 92 + return ret; 93 + } 94 + 95 + static void mbt_mb_release(struct super_block *sb) 96 + { 97 + percpu_counter_destroy(&EXT4_SB(sb)->s_dirtyclusters_counter); 98 + percpu_counter_destroy(&EXT4_SB(sb)->s_freeclusters_counter); 99 + ext4_mb_release(sb); 100 + kfree(sb->s_bdev->bd_queue); 101 + kfree(sb->s_bdev); 102 + } 103 + 104 + static int mbt_set(struct super_block *sb, void *data) 105 + { 106 + return 0; 107 + } 30 108 31 109 static struct super_block *mbt_ext4_alloc_super_block(void) 32 110 { 33 - struct ext4_super_block *es = kzalloc(sizeof(*es), GFP_KERNEL); 34 - struct ext4_sb_info *sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); 35 - struct mbt_ext4_super_block *fsb = kzalloc(sizeof(*fsb), GFP_KERNEL); 111 + struct mbt_ext4_super_block *fsb; 112 + struct super_block *sb; 113 + struct ext4_sb_info *sbi; 36 114 37 - if (fsb == NULL || sbi == NULL || es == NULL) 115 + fsb = kzalloc(sizeof(*fsb), GFP_KERNEL); 116 + if (fsb == NULL) 117 + return NULL; 118 + 119 + sb = sget(&mbt_fs_type, NULL, mbt_set, 0, NULL); 120 + if (IS_ERR(sb)) 38 121 goto out; 39 122 40 - sbi->s_es = es; 41 - fsb->sb.s_fs_info = sbi; 42 - return &fsb->sb; 123 + sbi = &fsb->sbi; 43 124 125 + sbi->s_blockgroup_lock = 126 + kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL); 127 + if (!sbi->s_blockgroup_lock) 128 + goto out_deactivate; 129 + 130 + bgl_lock_init(sbi->s_blockgroup_lock); 131 + 132 + sbi->s_es = &fsb->es; 133 + sb->s_fs_info = sbi; 134 + 135 + up_write(&sb->s_umount); 136 + return sb; 137 + 138 + out_deactivate: 139 + deactivate_locked_super(sb); 44 140 out: 45 141 kfree(fsb); 46 - kfree(sbi); 47 - kfree(es); 48 142 return NULL; 49 143 } 50 144 51 145 static void mbt_ext4_free_super_block(struct super_block *sb) 52 146 { 53 - struct mbt_ext4_super_block *fsb = 54 - container_of(sb, struct mbt_ext4_super_block, sb); 147 + struct mbt_ext4_super_block *fsb = MBT_SB(sb); 55 148 struct ext4_sb_info *sbi = EXT4_SB(sb); 56 149 57 - kfree(sbi->s_es); 58 - kfree(sbi); 150 + kfree(sbi->s_blockgroup_lock); 151 + deactivate_super(sb); 59 152 kfree(fsb); 60 153 } 61 154 ··· 177 82 sbi->s_clusters_per_group = layout->blocks_per_group >> 178 83 layout->cluster_bits; 179 84 sbi->s_desc_size = layout->desc_size; 85 + sbi->s_desc_per_block_bits = 86 + sb->s_blocksize_bits - (fls(layout->desc_size) - 1); 87 + sbi->s_desc_per_block = 1 << sbi->s_desc_per_block_bits; 180 88 181 89 es->s_first_data_block = cpu_to_le32(0); 182 90 es->s_blocks_count_lo = cpu_to_le32(layout->blocks_per_group * ··· 189 91 static int mbt_grp_ctx_init(struct super_block *sb, 190 92 struct mbt_grp_ctx *grp_ctx) 191 93 { 94 + ext4_grpblk_t max = EXT4_CLUSTERS_PER_GROUP(sb); 95 + 192 96 grp_ctx->bitmap_bh.b_data = kzalloc(EXT4_BLOCK_SIZE(sb), GFP_KERNEL); 193 97 if (grp_ctx->bitmap_bh.b_data == NULL) 194 98 return -ENOMEM; 99 + mb_set_bits(grp_ctx->bitmap_bh.b_data, max, sb->s_blocksize * 8 - max); 100 + ext4_free_group_clusters_set(sb, &grp_ctx->desc, max); 195 101 196 102 return 0; 197 103 } ··· 212 110 struct mbt_grp_ctx *grp_ctx = MBT_GRP_CTX(sb, group); 213 111 214 112 mb_set_bits(grp_ctx->bitmap_bh.b_data, start, len); 113 + } 114 + 115 + static void *mbt_ctx_bitmap(struct super_block *sb, ext4_group_t group) 116 + { 117 + struct mbt_grp_ctx *grp_ctx = MBT_GRP_CTX(sb, group); 118 + 119 + return grp_ctx->bitmap_bh.b_data; 215 120 } 216 121 217 122 /* called after mbt_init_sb_layout */ ··· 242 133 * block which will fail ext4_sb_block_valid check. 243 134 */ 244 135 mb_set_bits(ctx->grp_ctx[0].bitmap_bh.b_data, 0, 1); 136 + ext4_free_group_clusters_set(sb, &ctx->grp_ctx[0].desc, 137 + EXT4_CLUSTERS_PER_GROUP(sb) - 1); 245 138 246 139 return 0; 247 140 out: ··· 278 167 ext4_group_t block_group, 279 168 struct buffer_head *bh) 280 169 { 170 + /* 171 + * real ext4_wait_block_bitmap will set these flags and 172 + * functions like ext4_mb_init_cache will verify the flags. 173 + */ 174 + set_buffer_uptodate(bh); 175 + set_bitmap_uptodate(bh); 176 + set_buffer_verified(bh); 281 177 return 0; 282 178 } 283 179 ··· 350 232 kunit_activate_static_stub(test, 351 233 ext4_mb_mark_context, 352 234 ext4_mb_mark_context_stub); 235 + 236 + /* stub function will be called in mbt_mb_init->ext4_mb_init */ 237 + if (mbt_mb_init(sb) != 0) { 238 + mbt_ctx_release(sb); 239 + mbt_ext4_free_super_block(sb); 240 + return -ENOMEM; 241 + } 242 + 353 243 return 0; 354 244 } 355 245 ··· 365 239 { 366 240 struct super_block *sb = (struct super_block *)test->priv; 367 241 242 + mbt_mb_release(sb); 368 243 mbt_ctx_release(sb); 369 244 mbt_ext4_free_super_block(sb); 370 245 } ··· 373 246 static void test_new_blocks_simple(struct kunit *test) 374 247 { 375 248 struct super_block *sb = (struct super_block *)test->priv; 376 - struct inode inode = { .i_sb = sb, }; 249 + struct inode *inode; 377 250 struct ext4_allocation_request ar; 378 251 ext4_group_t i, goal_group = TEST_GOAL_GROUP; 379 252 int err = 0; 380 253 ext4_fsblk_t found; 381 254 struct ext4_sb_info *sbi = EXT4_SB(sb); 382 255 383 - ar.inode = &inode; 256 + inode = kunit_kzalloc(test, sizeof(*inode), GFP_KERNEL); 257 + if (!inode) 258 + return; 259 + 260 + inode->i_sb = sb; 261 + ar.inode = inode; 384 262 385 263 /* get block at goal */ 386 264 ar.goal = ext4_group_first_block_no(sb, goal_group); ··· 429 297 "unexpectedly get block when no block is available"); 430 298 } 431 299 300 + #define TEST_RANGE_COUNT 8 301 + 302 + struct test_range { 303 + ext4_grpblk_t start; 304 + ext4_grpblk_t len; 305 + }; 306 + 307 + static void 308 + mbt_generate_test_ranges(struct super_block *sb, struct test_range *ranges, 309 + int count) 310 + { 311 + ext4_grpblk_t start, len, max; 312 + int i; 313 + 314 + max = EXT4_CLUSTERS_PER_GROUP(sb) / count; 315 + for (i = 0; i < count; i++) { 316 + start = get_random_u32() % max; 317 + len = get_random_u32() % max; 318 + len = min(len, max - start); 319 + 320 + ranges[i].start = start + i * max; 321 + ranges[i].len = len; 322 + } 323 + } 324 + 325 + static void 326 + validate_free_blocks_simple(struct kunit *test, struct super_block *sb, 327 + ext4_group_t goal_group, ext4_grpblk_t start, 328 + ext4_grpblk_t len) 329 + { 330 + void *bitmap; 331 + ext4_grpblk_t bit, max = EXT4_CLUSTERS_PER_GROUP(sb); 332 + ext4_group_t i; 333 + 334 + for (i = 0; i < ext4_get_groups_count(sb); i++) { 335 + if (i == goal_group) 336 + continue; 337 + 338 + bitmap = mbt_ctx_bitmap(sb, i); 339 + bit = mb_find_next_zero_bit(bitmap, max, 0); 340 + KUNIT_ASSERT_EQ_MSG(test, bit, max, 341 + "free block on unexpected group %d", i); 342 + } 343 + 344 + bitmap = mbt_ctx_bitmap(sb, goal_group); 345 + bit = mb_find_next_zero_bit(bitmap, max, 0); 346 + KUNIT_ASSERT_EQ(test, bit, start); 347 + 348 + bit = mb_find_next_bit(bitmap, max, bit + 1); 349 + KUNIT_ASSERT_EQ(test, bit, start + len); 350 + } 351 + 352 + static void 353 + test_free_blocks_simple_range(struct kunit *test, ext4_group_t goal_group, 354 + ext4_grpblk_t start, ext4_grpblk_t len) 355 + { 356 + struct super_block *sb = (struct super_block *)test->priv; 357 + struct ext4_sb_info *sbi = EXT4_SB(sb); 358 + struct inode *inode; 359 + ext4_fsblk_t block; 360 + 361 + inode = kunit_kzalloc(test, sizeof(*inode), GFP_KERNEL); 362 + if (!inode) 363 + return; 364 + inode->i_sb = sb; 365 + 366 + if (len == 0) 367 + return; 368 + 369 + block = ext4_group_first_block_no(sb, goal_group) + 370 + EXT4_C2B(sbi, start); 371 + ext4_free_blocks_simple(inode, block, len); 372 + validate_free_blocks_simple(test, sb, goal_group, start, len); 373 + mbt_ctx_mark_used(sb, goal_group, 0, EXT4_CLUSTERS_PER_GROUP(sb)); 374 + } 375 + 376 + static void test_free_blocks_simple(struct kunit *test) 377 + { 378 + struct super_block *sb = (struct super_block *)test->priv; 379 + ext4_grpblk_t max = EXT4_CLUSTERS_PER_GROUP(sb); 380 + ext4_group_t i; 381 + struct test_range ranges[TEST_RANGE_COUNT]; 382 + 383 + for (i = 0; i < ext4_get_groups_count(sb); i++) 384 + mbt_ctx_mark_used(sb, i, 0, max); 385 + 386 + mbt_generate_test_ranges(sb, ranges, TEST_RANGE_COUNT); 387 + for (i = 0; i < TEST_RANGE_COUNT; i++) 388 + test_free_blocks_simple_range(test, TEST_GOAL_GROUP, 389 + ranges[i].start, ranges[i].len); 390 + } 391 + 392 + static void 393 + test_mark_diskspace_used_range(struct kunit *test, 394 + struct ext4_allocation_context *ac, 395 + ext4_grpblk_t start, 396 + ext4_grpblk_t len) 397 + { 398 + struct super_block *sb = (struct super_block *)test->priv; 399 + int ret; 400 + void *bitmap; 401 + ext4_grpblk_t i, max; 402 + 403 + /* ext4_mb_mark_diskspace_used will BUG if len is 0 */ 404 + if (len == 0) 405 + return; 406 + 407 + ac->ac_b_ex.fe_group = TEST_GOAL_GROUP; 408 + ac->ac_b_ex.fe_start = start; 409 + ac->ac_b_ex.fe_len = len; 410 + 411 + bitmap = mbt_ctx_bitmap(sb, TEST_GOAL_GROUP); 412 + memset(bitmap, 0, sb->s_blocksize); 413 + ret = ext4_mb_mark_diskspace_used(ac, NULL, 0); 414 + KUNIT_ASSERT_EQ(test, ret, 0); 415 + 416 + max = EXT4_CLUSTERS_PER_GROUP(sb); 417 + i = mb_find_next_bit(bitmap, max, 0); 418 + KUNIT_ASSERT_EQ(test, i, start); 419 + i = mb_find_next_zero_bit(bitmap, max, i + 1); 420 + KUNIT_ASSERT_EQ(test, i, start + len); 421 + i = mb_find_next_bit(bitmap, max, i + 1); 422 + KUNIT_ASSERT_EQ(test, max, i); 423 + } 424 + 425 + static void test_mark_diskspace_used(struct kunit *test) 426 + { 427 + struct super_block *sb = (struct super_block *)test->priv; 428 + struct inode *inode; 429 + struct ext4_allocation_context ac; 430 + struct test_range ranges[TEST_RANGE_COUNT]; 431 + int i; 432 + 433 + mbt_generate_test_ranges(sb, ranges, TEST_RANGE_COUNT); 434 + 435 + inode = kunit_kzalloc(test, sizeof(*inode), GFP_KERNEL); 436 + if (!inode) 437 + return; 438 + inode->i_sb = sb; 439 + 440 + ac.ac_status = AC_STATUS_FOUND; 441 + ac.ac_sb = sb; 442 + ac.ac_inode = inode; 443 + for (i = 0; i < TEST_RANGE_COUNT; i++) 444 + test_mark_diskspace_used_range(test, &ac, ranges[i].start, 445 + ranges[i].len); 446 + } 447 + 448 + static void mbt_generate_buddy(struct super_block *sb, void *buddy, 449 + void *bitmap, struct ext4_group_info *grp) 450 + { 451 + struct ext4_sb_info *sbi = EXT4_SB(sb); 452 + uint32_t order, off; 453 + void *bb, *bb_h; 454 + int max; 455 + 456 + memset(buddy, 0xff, sb->s_blocksize); 457 + memset(grp, 0, offsetof(struct ext4_group_info, 458 + bb_counters[MB_NUM_ORDERS(sb)])); 459 + 460 + bb = bitmap; 461 + max = EXT4_CLUSTERS_PER_GROUP(sb); 462 + bb_h = buddy + sbi->s_mb_offsets[1]; 463 + 464 + off = mb_find_next_zero_bit(bb, max, 0); 465 + grp->bb_first_free = off; 466 + while (off < max) { 467 + grp->bb_counters[0]++; 468 + grp->bb_free++; 469 + 470 + if (!(off & 1) && !mb_test_bit(off + 1, bb)) { 471 + grp->bb_free++; 472 + grp->bb_counters[0]--; 473 + mb_clear_bit(off >> 1, bb_h); 474 + grp->bb_counters[1]++; 475 + grp->bb_largest_free_order = 1; 476 + off++; 477 + } 478 + 479 + off = mb_find_next_zero_bit(bb, max, off + 1); 480 + } 481 + 482 + for (order = 1; order < MB_NUM_ORDERS(sb) - 1; order++) { 483 + bb = buddy + sbi->s_mb_offsets[order]; 484 + bb_h = buddy + sbi->s_mb_offsets[order + 1]; 485 + max = max >> 1; 486 + off = mb_find_next_zero_bit(bb, max, 0); 487 + 488 + while (off < max) { 489 + if (!(off & 1) && !mb_test_bit(off + 1, bb)) { 490 + mb_set_bits(bb, off, 2); 491 + grp->bb_counters[order] -= 2; 492 + mb_clear_bit(off >> 1, bb_h); 493 + grp->bb_counters[order + 1]++; 494 + grp->bb_largest_free_order = order + 1; 495 + off++; 496 + } 497 + 498 + off = mb_find_next_zero_bit(bb, max, off + 1); 499 + } 500 + } 501 + 502 + max = EXT4_CLUSTERS_PER_GROUP(sb); 503 + off = mb_find_next_zero_bit(bitmap, max, 0); 504 + while (off < max) { 505 + grp->bb_fragments++; 506 + 507 + off = mb_find_next_bit(bitmap, max, off + 1); 508 + if (off + 1 >= max) 509 + break; 510 + 511 + off = mb_find_next_zero_bit(bitmap, max, off + 1); 512 + } 513 + } 514 + 515 + static void 516 + mbt_validate_group_info(struct kunit *test, struct ext4_group_info *grp1, 517 + struct ext4_group_info *grp2) 518 + { 519 + struct super_block *sb = (struct super_block *)test->priv; 520 + int i; 521 + 522 + KUNIT_ASSERT_EQ(test, grp1->bb_first_free, 523 + grp2->bb_first_free); 524 + KUNIT_ASSERT_EQ(test, grp1->bb_fragments, 525 + grp2->bb_fragments); 526 + KUNIT_ASSERT_EQ(test, grp1->bb_free, grp2->bb_free); 527 + KUNIT_ASSERT_EQ(test, grp1->bb_largest_free_order, 528 + grp2->bb_largest_free_order); 529 + 530 + for (i = 1; i < MB_NUM_ORDERS(sb); i++) { 531 + KUNIT_ASSERT_EQ_MSG(test, grp1->bb_counters[i], 532 + grp2->bb_counters[i], 533 + "bb_counters[%d] diffs, expected %d, generated %d", 534 + i, grp1->bb_counters[i], 535 + grp2->bb_counters[i]); 536 + } 537 + } 538 + 539 + static void 540 + do_test_generate_buddy(struct kunit *test, struct super_block *sb, void *bitmap, 541 + void *mbt_buddy, struct ext4_group_info *mbt_grp, 542 + void *ext4_buddy, struct ext4_group_info *ext4_grp) 543 + { 544 + int i; 545 + 546 + mbt_generate_buddy(sb, mbt_buddy, bitmap, mbt_grp); 547 + 548 + for (i = 0; i < MB_NUM_ORDERS(sb); i++) 549 + ext4_grp->bb_counters[i] = 0; 550 + /* needed by validation in ext4_mb_generate_buddy */ 551 + ext4_grp->bb_free = mbt_grp->bb_free; 552 + memset(ext4_buddy, 0xff, sb->s_blocksize); 553 + ext4_mb_generate_buddy(sb, ext4_buddy, bitmap, TEST_GOAL_GROUP, 554 + ext4_grp); 555 + 556 + KUNIT_ASSERT_EQ(test, memcmp(mbt_buddy, ext4_buddy, sb->s_blocksize), 557 + 0); 558 + mbt_validate_group_info(test, mbt_grp, ext4_grp); 559 + } 560 + 561 + static void test_mb_generate_buddy(struct kunit *test) 562 + { 563 + struct super_block *sb = (struct super_block *)test->priv; 564 + void *bitmap, *expected_bb, *generate_bb; 565 + struct ext4_group_info *expected_grp, *generate_grp; 566 + struct test_range ranges[TEST_RANGE_COUNT]; 567 + int i; 568 + 569 + bitmap = kunit_kzalloc(test, sb->s_blocksize, GFP_KERNEL); 570 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, bitmap); 571 + expected_bb = kunit_kzalloc(test, sb->s_blocksize, GFP_KERNEL); 572 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, expected_bb); 573 + generate_bb = kunit_kzalloc(test, sb->s_blocksize, GFP_KERNEL); 574 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, generate_bb); 575 + expected_grp = kunit_kzalloc(test, offsetof(struct ext4_group_info, 576 + bb_counters[MB_NUM_ORDERS(sb)]), GFP_KERNEL); 577 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, expected_grp); 578 + generate_grp = ext4_get_group_info(sb, TEST_GOAL_GROUP); 579 + KUNIT_ASSERT_NOT_NULL(test, generate_grp); 580 + 581 + mbt_generate_test_ranges(sb, ranges, TEST_RANGE_COUNT); 582 + for (i = 0; i < TEST_RANGE_COUNT; i++) { 583 + mb_set_bits(bitmap, ranges[i].start, ranges[i].len); 584 + do_test_generate_buddy(test, sb, bitmap, expected_bb, 585 + expected_grp, generate_bb, generate_grp); 586 + } 587 + } 588 + 589 + static void 590 + test_mb_mark_used_range(struct kunit *test, struct ext4_buddy *e4b, 591 + ext4_grpblk_t start, ext4_grpblk_t len, void *bitmap, 592 + void *buddy, struct ext4_group_info *grp) 593 + { 594 + struct super_block *sb = (struct super_block *)test->priv; 595 + struct ext4_free_extent ex; 596 + int i; 597 + 598 + /* mb_mark_used only accepts non-zero len */ 599 + if (len == 0) 600 + return; 601 + 602 + ex.fe_start = start; 603 + ex.fe_len = len; 604 + ex.fe_group = TEST_GOAL_GROUP; 605 + 606 + ext4_lock_group(sb, TEST_GOAL_GROUP); 607 + mb_mark_used(e4b, &ex); 608 + ext4_unlock_group(sb, TEST_GOAL_GROUP); 609 + 610 + mb_set_bits(bitmap, start, len); 611 + /* bypass bb_free validatoin in ext4_mb_generate_buddy */ 612 + grp->bb_free -= len; 613 + memset(buddy, 0xff, sb->s_blocksize); 614 + for (i = 0; i < MB_NUM_ORDERS(sb); i++) 615 + grp->bb_counters[i] = 0; 616 + ext4_mb_generate_buddy(sb, buddy, bitmap, 0, grp); 617 + 618 + KUNIT_ASSERT_EQ(test, memcmp(buddy, e4b->bd_buddy, sb->s_blocksize), 619 + 0); 620 + mbt_validate_group_info(test, grp, e4b->bd_info); 621 + } 622 + 623 + static void test_mb_mark_used(struct kunit *test) 624 + { 625 + struct ext4_buddy e4b; 626 + struct super_block *sb = (struct super_block *)test->priv; 627 + void *bitmap, *buddy; 628 + struct ext4_group_info *grp; 629 + int ret; 630 + struct test_range ranges[TEST_RANGE_COUNT]; 631 + int i; 632 + 633 + /* buddy cache assumes that each page contains at least one block */ 634 + if (sb->s_blocksize > PAGE_SIZE) 635 + kunit_skip(test, "blocksize exceeds pagesize"); 636 + 637 + bitmap = kunit_kzalloc(test, sb->s_blocksize, GFP_KERNEL); 638 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, bitmap); 639 + buddy = kunit_kzalloc(test, sb->s_blocksize, GFP_KERNEL); 640 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buddy); 641 + grp = kunit_kzalloc(test, offsetof(struct ext4_group_info, 642 + bb_counters[MB_NUM_ORDERS(sb)]), GFP_KERNEL); 643 + 644 + ret = ext4_mb_load_buddy(sb, TEST_GOAL_GROUP, &e4b); 645 + KUNIT_ASSERT_EQ(test, ret, 0); 646 + 647 + grp->bb_free = EXT4_CLUSTERS_PER_GROUP(sb); 648 + mbt_generate_test_ranges(sb, ranges, TEST_RANGE_COUNT); 649 + for (i = 0; i < TEST_RANGE_COUNT; i++) 650 + test_mb_mark_used_range(test, &e4b, ranges[i].start, 651 + ranges[i].len, bitmap, buddy, grp); 652 + 653 + ext4_mb_unload_buddy(&e4b); 654 + } 655 + 656 + static void 657 + test_mb_free_blocks_range(struct kunit *test, struct ext4_buddy *e4b, 658 + ext4_grpblk_t start, ext4_grpblk_t len, void *bitmap, 659 + void *buddy, struct ext4_group_info *grp) 660 + { 661 + struct super_block *sb = (struct super_block *)test->priv; 662 + int i; 663 + 664 + /* mb_free_blocks will WARN if len is 0 */ 665 + if (len == 0) 666 + return; 667 + 668 + ext4_lock_group(sb, e4b->bd_group); 669 + mb_free_blocks(NULL, e4b, start, len); 670 + ext4_unlock_group(sb, e4b->bd_group); 671 + 672 + mb_clear_bits(bitmap, start, len); 673 + /* bypass bb_free validatoin in ext4_mb_generate_buddy */ 674 + grp->bb_free += len; 675 + memset(buddy, 0xff, sb->s_blocksize); 676 + for (i = 0; i < MB_NUM_ORDERS(sb); i++) 677 + grp->bb_counters[i] = 0; 678 + ext4_mb_generate_buddy(sb, buddy, bitmap, 0, grp); 679 + 680 + KUNIT_ASSERT_EQ(test, memcmp(buddy, e4b->bd_buddy, sb->s_blocksize), 681 + 0); 682 + mbt_validate_group_info(test, grp, e4b->bd_info); 683 + 684 + } 685 + 686 + static void test_mb_free_blocks(struct kunit *test) 687 + { 688 + struct ext4_buddy e4b; 689 + struct super_block *sb = (struct super_block *)test->priv; 690 + void *bitmap, *buddy; 691 + struct ext4_group_info *grp; 692 + struct ext4_free_extent ex; 693 + int ret; 694 + int i; 695 + struct test_range ranges[TEST_RANGE_COUNT]; 696 + 697 + /* buddy cache assumes that each page contains at least one block */ 698 + if (sb->s_blocksize > PAGE_SIZE) 699 + kunit_skip(test, "blocksize exceeds pagesize"); 700 + 701 + bitmap = kunit_kzalloc(test, sb->s_blocksize, GFP_KERNEL); 702 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, bitmap); 703 + buddy = kunit_kzalloc(test, sb->s_blocksize, GFP_KERNEL); 704 + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, buddy); 705 + grp = kunit_kzalloc(test, offsetof(struct ext4_group_info, 706 + bb_counters[MB_NUM_ORDERS(sb)]), GFP_KERNEL); 707 + 708 + ret = ext4_mb_load_buddy(sb, TEST_GOAL_GROUP, &e4b); 709 + KUNIT_ASSERT_EQ(test, ret, 0); 710 + 711 + ex.fe_start = 0; 712 + ex.fe_len = EXT4_CLUSTERS_PER_GROUP(sb); 713 + ex.fe_group = TEST_GOAL_GROUP; 714 + 715 + ext4_lock_group(sb, TEST_GOAL_GROUP); 716 + mb_mark_used(&e4b, &ex); 717 + ext4_unlock_group(sb, TEST_GOAL_GROUP); 718 + 719 + grp->bb_free = 0; 720 + memset(bitmap, 0xff, sb->s_blocksize); 721 + 722 + mbt_generate_test_ranges(sb, ranges, TEST_RANGE_COUNT); 723 + for (i = 0; i < TEST_RANGE_COUNT; i++) 724 + test_mb_free_blocks_range(test, &e4b, ranges[i].start, 725 + ranges[i].len, bitmap, buddy, grp); 726 + 727 + ext4_mb_unload_buddy(&e4b); 728 + } 729 + 432 730 static const struct mbt_ext4_block_layout mbt_test_layouts[] = { 433 731 { 434 732 .blocksize_bits = 10, ··· 896 334 897 335 static struct kunit_case mbt_test_cases[] = { 898 336 KUNIT_CASE_PARAM(test_new_blocks_simple, mbt_layouts_gen_params), 337 + KUNIT_CASE_PARAM(test_free_blocks_simple, mbt_layouts_gen_params), 338 + KUNIT_CASE_PARAM(test_mb_generate_buddy, mbt_layouts_gen_params), 339 + KUNIT_CASE_PARAM(test_mb_mark_used, mbt_layouts_gen_params), 340 + KUNIT_CASE_PARAM(test_mb_free_blocks, mbt_layouts_gen_params), 341 + KUNIT_CASE_PARAM(test_mark_diskspace_used, mbt_layouts_gen_params), 899 342 {} 900 343 }; 901 344
+35 -27
fs/ext4/mballoc.c
··· 3015 3015 { 3016 3016 struct super_block *sb = pde_data(file_inode(seq->file)); 3017 3017 ext4_group_t group = (ext4_group_t) ((unsigned long) v); 3018 - int i; 3019 - int err, buddy_loaded = 0; 3018 + int i, err; 3019 + char nbuf[16]; 3020 3020 struct ext4_buddy e4b; 3021 3021 struct ext4_group_info *grinfo; 3022 3022 unsigned char blocksize_bits = min_t(unsigned char, ··· 3043 3043 if (unlikely(EXT4_MB_GRP_NEED_INIT(grinfo))) { 3044 3044 err = ext4_mb_load_buddy(sb, group, &e4b); 3045 3045 if (err) { 3046 - seq_printf(seq, "#%-5u: I/O error\n", group); 3046 + seq_printf(seq, "#%-5u: %s\n", group, ext4_decode_error(NULL, err, nbuf)); 3047 3047 return 0; 3048 3048 } 3049 - buddy_loaded = 1; 3049 + ext4_mb_unload_buddy(&e4b); 3050 3050 } 3051 3051 3052 + /* 3053 + * We care only about free space counters in the group info and 3054 + * these are safe to access even after the buddy has been unloaded 3055 + */ 3052 3056 memcpy(&sg, grinfo, i); 3053 - 3054 - if (buddy_loaded) 3055 - ext4_mb_unload_buddy(&e4b); 3056 - 3057 3057 seq_printf(seq, "#%-5u: %-5u %-5u %-5u [", group, sg.info.bb_free, 3058 3058 sg.info.bb_fragments, sg.info.bb_first_free); 3059 3059 for (i = 0; i <= 13; i++) 3060 3060 seq_printf(seq, " %-5u", i <= blocksize_bits + 1 ? 3061 3061 sg.info.bb_counters[i] : 0); 3062 - seq_puts(seq, " ]\n"); 3062 + seq_puts(seq, " ]"); 3063 + if (EXT4_MB_GRP_BBITMAP_CORRUPT(&sg.info)) 3064 + seq_puts(seq, " Block bitmap corrupted!"); 3065 + seq_puts(seq, "\n"); 3063 3066 3064 3067 return 0; 3065 3068 } ··· 3832 3829 } 3833 3830 3834 3831 static inline int ext4_issue_discard(struct super_block *sb, 3835 - ext4_group_t block_group, ext4_grpblk_t cluster, int count, 3836 - struct bio **biop) 3832 + ext4_group_t block_group, ext4_grpblk_t cluster, int count) 3837 3833 { 3838 3834 ext4_fsblk_t discard_block; 3839 3835 ··· 3841 3839 count = EXT4_C2B(EXT4_SB(sb), count); 3842 3840 trace_ext4_discard_blocks(sb, 3843 3841 (unsigned long long) discard_block, count); 3844 - if (biop) { 3845 - return __blkdev_issue_discard(sb->s_bdev, 3846 - (sector_t)discard_block << (sb->s_blocksize_bits - 9), 3847 - (sector_t)count << (sb->s_blocksize_bits - 9), 3848 - GFP_NOFS, biop); 3849 - } else 3850 - return sb_issue_discard(sb, discard_block, count, GFP_NOFS, 0); 3842 + 3843 + return sb_issue_discard(sb, discard_block, count, GFP_NOFS, 0); 3851 3844 } 3852 3845 3853 3846 static void ext4_free_data_in_buddy(struct super_block *sb, ··· 5166 5169 .fe_len = ac->ac_orig_goal_len, 5167 5170 }; 5168 5171 loff_t orig_goal_end = extent_logical_end(sbi, &ex); 5172 + loff_t o_ex_end = extent_logical_end(sbi, &ac->ac_o_ex); 5169 5173 5170 - /* we can't allocate as much as normalizer wants. 5171 - * so, found space must get proper lstart 5172 - * to cover original request */ 5174 + /* 5175 + * We can't allocate as much as normalizer wants, so we try 5176 + * to get proper lstart to cover the original request, except 5177 + * when the goal doesn't cover the original request as below: 5178 + * 5179 + * orig_ex:2045/2055(10), isize:8417280 -> normalized:0/2048 5180 + * best_ex:0/200(200) -> adjusted: 1848/2048(200) 5181 + */ 5173 5182 BUG_ON(ac->ac_g_ex.fe_logical > ac->ac_o_ex.fe_logical); 5174 5183 BUG_ON(ac->ac_g_ex.fe_len < ac->ac_o_ex.fe_len); 5175 5184 ··· 5187 5184 * 1. Check if best ex can be kept at end of goal (before 5188 5185 * cr_best_avail trimmed it) and still cover original start 5189 5186 * 2. Else, check if best ex can be kept at start of goal and 5190 - * still cover original start 5187 + * still cover original end 5191 5188 * 3. Else, keep the best ex at start of original request. 5192 5189 */ 5193 5190 ex.fe_len = ac->ac_b_ex.fe_len; ··· 5197 5194 goto adjust_bex; 5198 5195 5199 5196 ex.fe_logical = ac->ac_g_ex.fe_logical; 5200 - if (ac->ac_o_ex.fe_logical < extent_logical_end(sbi, &ex)) 5197 + if (o_ex_end <= extent_logical_end(sbi, &ex)) 5201 5198 goto adjust_bex; 5202 5199 5203 5200 ex.fe_logical = ac->ac_o_ex.fe_logical; ··· 5205 5202 ac->ac_b_ex.fe_logical = ex.fe_logical; 5206 5203 5207 5204 BUG_ON(ac->ac_o_ex.fe_logical < ac->ac_b_ex.fe_logical); 5208 - BUG_ON(ac->ac_o_ex.fe_len > ac->ac_b_ex.fe_len); 5209 5205 BUG_ON(extent_logical_end(sbi, &ex) > orig_goal_end); 5210 5206 } 5211 5207 ··· 6489 6487 } else { 6490 6488 if (test_opt(sb, DISCARD)) { 6491 6489 err = ext4_issue_discard(sb, block_group, bit, 6492 - count_clusters, NULL); 6493 - if (err && err != -EOPNOTSUPP) 6490 + count_clusters); 6491 + /* 6492 + * Ignore EOPNOTSUPP error. This is consistent with 6493 + * what happens when using journal. 6494 + */ 6495 + if (err == -EOPNOTSUPP) 6496 + err = 0; 6497 + if (err) 6494 6498 ext4_msg(sb, KERN_WARNING, "discard request in" 6495 6499 " group:%u block:%d count:%lu failed" 6496 6500 " with %d", block_group, bit, count, ··· 6746 6738 */ 6747 6739 mb_mark_used(e4b, &ex); 6748 6740 ext4_unlock_group(sb, group); 6749 - ret = ext4_issue_discard(sb, group, start, count, NULL); 6741 + ret = ext4_issue_discard(sb, group, start, count); 6750 6742 ext4_lock_group(sb, group); 6751 6743 mb_free_blocks(NULL, e4b, start, ex.fe_len); 6752 6744 return ret;
+3 -2
fs/ext4/resize.c
··· 1602 1602 int gdb_num = group / EXT4_DESC_PER_BLOCK(sb); 1603 1603 int gdb_num_end = ((group + flex_gd->count - 1) / 1604 1604 EXT4_DESC_PER_BLOCK(sb)); 1605 - int meta_bg = ext4_has_feature_meta_bg(sb); 1605 + int meta_bg = ext4_has_feature_meta_bg(sb) && 1606 + gdb_num >= le32_to_cpu(es->s_first_meta_bg); 1606 1607 sector_t padding_blocks = meta_bg ? 0 : sbi->s_sbh->b_blocknr - 1607 1608 ext4_group_first_block_no(sb, 0); 1608 1609 ··· 2085 2084 } 2086 2085 } 2087 2086 2088 - if ((!resize_inode && !meta_bg) || n_blocks_count == o_blocks_count) { 2087 + if ((!resize_inode && !meta_bg && n_desc_blocks > o_desc_blocks) || n_blocks_count == o_blocks_count) { 2089 2088 err = ext4_convert_meta_bg(sb, resize_inode); 2090 2089 if (err) 2091 2090 goto out;
+25 -17
fs/ext4/super.c
··· 4421 4421 } 4422 4422 sbi->s_cluster_bits = le32_to_cpu(es->s_log_cluster_size) - 4423 4423 le32_to_cpu(es->s_log_block_size); 4424 - sbi->s_clusters_per_group = 4425 - le32_to_cpu(es->s_clusters_per_group); 4426 - if (sbi->s_clusters_per_group > sb->s_blocksize * 8) { 4427 - ext4_msg(sb, KERN_ERR, 4428 - "#clusters per group too big: %lu", 4429 - sbi->s_clusters_per_group); 4430 - return -EINVAL; 4431 - } 4432 - if (sbi->s_blocks_per_group != 4433 - (sbi->s_clusters_per_group * (clustersize / sb->s_blocksize))) { 4434 - ext4_msg(sb, KERN_ERR, "blocks per group (%lu) and " 4435 - "clusters per group (%lu) inconsistent", 4436 - sbi->s_blocks_per_group, 4437 - sbi->s_clusters_per_group); 4438 - return -EINVAL; 4439 - } 4440 4424 } else { 4441 4425 if (clustersize != sb->s_blocksize) { 4442 4426 ext4_msg(sb, KERN_ERR, ··· 4434 4450 sbi->s_blocks_per_group); 4435 4451 return -EINVAL; 4436 4452 } 4437 - sbi->s_clusters_per_group = sbi->s_blocks_per_group; 4438 4453 sbi->s_cluster_bits = 0; 4454 + } 4455 + sbi->s_clusters_per_group = le32_to_cpu(es->s_clusters_per_group); 4456 + if (sbi->s_clusters_per_group > sb->s_blocksize * 8) { 4457 + ext4_msg(sb, KERN_ERR, "#clusters per group too big: %lu", 4458 + sbi->s_clusters_per_group); 4459 + return -EINVAL; 4460 + } 4461 + if (sbi->s_blocks_per_group != 4462 + (sbi->s_clusters_per_group * (clustersize / sb->s_blocksize))) { 4463 + ext4_msg(sb, KERN_ERR, 4464 + "blocks per group (%lu) and clusters per group (%lu) inconsistent", 4465 + sbi->s_blocks_per_group, sbi->s_clusters_per_group); 4466 + return -EINVAL; 4439 4467 } 4440 4468 sbi->s_cluster_ratio = clustersize / sb->s_blocksize; 4441 4469 ··· 6860 6864 if (IS_ERR(handle)) 6861 6865 return PTR_ERR(handle); 6862 6866 ret = dquot_commit(dquot); 6867 + if (ret < 0) 6868 + ext4_error_err(dquot->dq_sb, -ret, 6869 + "Failed to commit dquot type %d", 6870 + dquot->dq_id.type); 6863 6871 err = ext4_journal_stop(handle); 6864 6872 if (!ret) 6865 6873 ret = err; ··· 6880 6880 if (IS_ERR(handle)) 6881 6881 return PTR_ERR(handle); 6882 6882 ret = dquot_acquire(dquot); 6883 + if (ret < 0) 6884 + ext4_error_err(dquot->dq_sb, -ret, 6885 + "Failed to acquire dquot type %d", 6886 + dquot->dq_id.type); 6883 6887 err = ext4_journal_stop(handle); 6884 6888 if (!ret) 6885 6889 ret = err; ··· 6903 6899 return PTR_ERR(handle); 6904 6900 } 6905 6901 ret = dquot_release(dquot); 6902 + if (ret < 0) 6903 + ext4_error_err(dquot->dq_sb, -ret, 6904 + "Failed to release dquot type %d", 6905 + dquot->dq_id.type); 6906 6906 err = ext4_journal_stop(handle); 6907 6907 if (!ret) 6908 6908 ret = err;
+24 -37
fs/ext4/xattr.c
··· 1565 1565 /* 1566 1566 * Add value of the EA in an inode. 1567 1567 */ 1568 - static int ext4_xattr_inode_lookup_create(handle_t *handle, struct inode *inode, 1569 - const void *value, size_t value_len, 1570 - struct inode **ret_inode) 1568 + static struct inode *ext4_xattr_inode_lookup_create(handle_t *handle, 1569 + struct inode *inode, const void *value, size_t value_len) 1571 1570 { 1572 1571 struct inode *ea_inode; 1573 1572 u32 hash; 1574 1573 int err; 1575 1574 1575 + /* Account inode & space to quota even if sharing... */ 1576 + err = ext4_xattr_inode_alloc_quota(inode, value_len); 1577 + if (err) 1578 + return ERR_PTR(err); 1579 + 1576 1580 hash = ext4_xattr_inode_hash(EXT4_SB(inode->i_sb), value, value_len); 1577 1581 ea_inode = ext4_xattr_inode_cache_find(inode, value, value_len, hash); 1578 1582 if (ea_inode) { 1579 1583 err = ext4_xattr_inode_inc_ref(handle, ea_inode); 1580 - if (err) { 1581 - iput(ea_inode); 1582 - return err; 1583 - } 1584 - 1585 - *ret_inode = ea_inode; 1586 - return 0; 1584 + if (err) 1585 + goto out_err; 1586 + return ea_inode; 1587 1587 } 1588 1588 1589 1589 /* Create an inode for the EA value */ 1590 1590 ea_inode = ext4_xattr_inode_create(handle, inode, hash); 1591 - if (IS_ERR(ea_inode)) 1592 - return PTR_ERR(ea_inode); 1591 + if (IS_ERR(ea_inode)) { 1592 + ext4_xattr_inode_free_quota(inode, NULL, value_len); 1593 + return ea_inode; 1594 + } 1593 1595 1594 1596 err = ext4_xattr_inode_write(handle, ea_inode, value, value_len); 1595 1597 if (err) { 1596 1598 if (ext4_xattr_inode_dec_ref(handle, ea_inode)) 1597 1599 ext4_warning_inode(ea_inode, "cleanup dec ref error %d", err); 1598 - iput(ea_inode); 1599 - return err; 1600 + goto out_err; 1600 1601 } 1601 1602 1602 1603 if (EA_INODE_CACHE(inode)) 1603 1604 mb_cache_entry_create(EA_INODE_CACHE(inode), GFP_NOFS, hash, 1604 1605 ea_inode->i_ino, true /* reusable */); 1605 - 1606 - *ret_inode = ea_inode; 1607 - return 0; 1606 + return ea_inode; 1607 + out_err: 1608 + iput(ea_inode); 1609 + ext4_xattr_inode_free_quota(inode, NULL, value_len); 1610 + return ERR_PTR(err); 1608 1611 } 1609 1612 1610 1613 /* ··· 1715 1712 if (i->value && in_inode) { 1716 1713 WARN_ON_ONCE(!i->value_len); 1717 1714 1718 - ret = ext4_xattr_inode_alloc_quota(inode, i->value_len); 1719 - if (ret) 1720 - goto out; 1721 - 1722 - ret = ext4_xattr_inode_lookup_create(handle, inode, i->value, 1723 - i->value_len, 1724 - &new_ea_inode); 1725 - if (ret) { 1715 + new_ea_inode = ext4_xattr_inode_lookup_create(handle, inode, 1716 + i->value, i->value_len); 1717 + if (IS_ERR(new_ea_inode)) { 1718 + ret = PTR_ERR(new_ea_inode); 1726 1719 new_ea_inode = NULL; 1727 - ext4_xattr_inode_free_quota(inode, NULL, i->value_len); 1728 1720 goto out; 1729 1721 } 1730 1722 } ··· 2158 2160 ENTRY(header(s->base)+1)); 2159 2161 if (error) 2160 2162 goto getblk_failed; 2161 - if (ea_inode) { 2162 - /* Drop the extra ref on ea_inode. */ 2163 - error = ext4_xattr_inode_dec_ref(handle, 2164 - ea_inode); 2165 - if (error) 2166 - ext4_warning_inode(ea_inode, 2167 - "dec ref error=%d", 2168 - error); 2169 - iput(ea_inode); 2170 - ea_inode = NULL; 2171 - } 2172 2163 2173 2164 lock_buffer(new_bh); 2174 2165 error = ext4_journal_get_create_access(handle, sb,