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

ext4: adjust some functions for reclaiming extents from extent status tree

This commit changes some interfaces in extent status tree because we
need to use inode to count the cached objects in a extent status tree.

Signed-off-by: Zheng Liu <wenqing.lz@taobao.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Cc: Jan kara <jack@suse.cz>

authored by

Zheng Liu and committed by
Theodore Ts'o
bdedbb7b 69eb33dc

+24 -26
+24 -26
fs/ext4/extents_status.c
··· 142 142 143 143 static struct kmem_cache *ext4_es_cachep; 144 144 145 - static int __es_insert_extent(struct ext4_es_tree *tree, 146 - struct extent_status *newes); 147 - static int __es_remove_extent(struct ext4_es_tree *tree, ext4_lblk_t lblk, 145 + static int __es_insert_extent(struct inode *inode, struct extent_status *newes); 146 + static int __es_remove_extent(struct inode *inode, ext4_lblk_t lblk, 148 147 ext4_lblk_t end); 149 148 150 149 int __init ext4_init_es(void) ··· 284 285 } 285 286 286 287 static struct extent_status * 287 - ext4_es_alloc_extent(ext4_lblk_t lblk, ext4_lblk_t len, ext4_fsblk_t pblk) 288 + ext4_es_alloc_extent(struct inode *inode, ext4_lblk_t lblk, ext4_lblk_t len, 289 + ext4_fsblk_t pblk) 288 290 { 289 291 struct extent_status *es; 290 292 es = kmem_cache_alloc(ext4_es_cachep, GFP_ATOMIC); ··· 297 297 return es; 298 298 } 299 299 300 - static void ext4_es_free_extent(struct extent_status *es) 300 + static void ext4_es_free_extent(struct inode *inode, struct extent_status *es) 301 301 { 302 302 kmem_cache_free(ext4_es_cachep, es); 303 303 } ··· 326 326 } 327 327 328 328 static struct extent_status * 329 - ext4_es_try_to_merge_left(struct ext4_es_tree *tree, struct extent_status *es) 329 + ext4_es_try_to_merge_left(struct inode *inode, struct extent_status *es) 330 330 { 331 + struct ext4_es_tree *tree = &EXT4_I(inode)->i_es_tree; 331 332 struct extent_status *es1; 332 333 struct rb_node *node; 333 334 ··· 340 339 if (ext4_es_can_be_merged(es1, es)) { 341 340 es1->es_len += es->es_len; 342 341 rb_erase(&es->rb_node, &tree->root); 343 - ext4_es_free_extent(es); 342 + ext4_es_free_extent(inode, es); 344 343 es = es1; 345 344 } 346 345 ··· 348 347 } 349 348 350 349 static struct extent_status * 351 - ext4_es_try_to_merge_right(struct ext4_es_tree *tree, struct extent_status *es) 350 + ext4_es_try_to_merge_right(struct inode *inode, struct extent_status *es) 352 351 { 352 + struct ext4_es_tree *tree = &EXT4_I(inode)->i_es_tree; 353 353 struct extent_status *es1; 354 354 struct rb_node *node; 355 355 ··· 362 360 if (ext4_es_can_be_merged(es, es1)) { 363 361 es->es_len += es1->es_len; 364 362 rb_erase(node, &tree->root); 365 - ext4_es_free_extent(es1); 363 + ext4_es_free_extent(inode, es1); 366 364 } 367 365 368 366 return es; 369 367 } 370 368 371 - static int __es_insert_extent(struct ext4_es_tree *tree, 372 - struct extent_status *newes) 369 + static int __es_insert_extent(struct inode *inode, struct extent_status *newes) 373 370 { 371 + struct ext4_es_tree *tree = &EXT4_I(inode)->i_es_tree; 374 372 struct rb_node **p = &tree->root.rb_node; 375 373 struct rb_node *parent = NULL; 376 374 struct extent_status *es; ··· 391 389 ext4_es_is_unwritten(es)) 392 390 ext4_es_store_pblock(es, 393 391 newes->es_pblk); 394 - es = ext4_es_try_to_merge_left(tree, es); 392 + es = ext4_es_try_to_merge_left(inode, es); 395 393 goto out; 396 394 } 397 395 p = &(*p)->rb_left; 398 396 } else if (newes->es_lblk > ext4_es_end(es)) { 399 397 if (ext4_es_can_be_merged(es, newes)) { 400 398 es->es_len += newes->es_len; 401 - es = ext4_es_try_to_merge_right(tree, es); 399 + es = ext4_es_try_to_merge_right(inode, es); 402 400 goto out; 403 401 } 404 402 p = &(*p)->rb_right; ··· 408 406 } 409 407 } 410 408 411 - es = ext4_es_alloc_extent(newes->es_lblk, newes->es_len, 409 + es = ext4_es_alloc_extent(inode, newes->es_lblk, newes->es_len, 412 410 newes->es_pblk); 413 411 if (!es) 414 412 return -ENOMEM; ··· 432 430 ext4_lblk_t len, ext4_fsblk_t pblk, 433 431 unsigned long long status) 434 432 { 435 - struct ext4_es_tree *tree; 436 433 struct extent_status newes; 437 434 ext4_lblk_t end = lblk + len - 1; 438 435 int err = 0; ··· 448 447 trace_ext4_es_insert_extent(inode, &newes); 449 448 450 449 write_lock(&EXT4_I(inode)->i_es_lock); 451 - tree = &EXT4_I(inode)->i_es_tree; 452 - err = __es_remove_extent(tree, lblk, end); 450 + err = __es_remove_extent(inode, lblk, end); 453 451 if (err != 0) 454 452 goto error; 455 - err = __es_insert_extent(tree, &newes); 453 + err = __es_insert_extent(inode, &newes); 456 454 457 455 error: 458 456 write_unlock(&EXT4_I(inode)->i_es_lock); ··· 521 521 return found; 522 522 } 523 523 524 - static int __es_remove_extent(struct ext4_es_tree *tree, ext4_lblk_t lblk, 525 - ext4_lblk_t end) 524 + static int __es_remove_extent(struct inode *inode, ext4_lblk_t lblk, 525 + ext4_lblk_t end) 526 526 { 527 + struct ext4_es_tree *tree = &EXT4_I(inode)->i_es_tree; 527 528 struct rb_node *node; 528 529 struct extent_status *es; 529 530 struct extent_status orig_es; ··· 562 561 ext4_es_store_pblock(&newes, block); 563 562 } 564 563 ext4_es_store_status(&newes, ext4_es_status(&orig_es)); 565 - err = __es_insert_extent(tree, &newes); 564 + err = __es_insert_extent(inode, &newes); 566 565 if (err) { 567 566 es->es_lblk = orig_es.es_lblk; 568 567 es->es_len = orig_es.es_len; ··· 591 590 while (es && ext4_es_end(es) <= end) { 592 591 node = rb_next(&es->rb_node); 593 592 rb_erase(&es->rb_node, &tree->root); 594 - ext4_es_free_extent(es); 593 + ext4_es_free_extent(inode, es); 595 594 if (!node) { 596 595 es = NULL; 597 596 break; ··· 623 622 int ext4_es_remove_extent(struct inode *inode, ext4_lblk_t lblk, 624 623 ext4_lblk_t len) 625 624 { 626 - struct ext4_es_tree *tree; 627 625 ext4_lblk_t end; 628 626 int err = 0; 629 627 ··· 633 633 end = lblk + len - 1; 634 634 BUG_ON(end < lblk); 635 635 636 - tree = &EXT4_I(inode)->i_es_tree; 637 - 638 636 write_lock(&EXT4_I(inode)->i_es_lock); 639 - err = __es_remove_extent(tree, lblk, end); 637 + err = __es_remove_extent(inode, lblk, end); 640 638 write_unlock(&EXT4_I(inode)->i_es_lock); 641 639 ext4_es_print_tree(inode); 642 640 return err;