diff options
Diffstat (limited to 'fs/ocfs2/suballoc.c')
-rw-r--r-- | fs/ocfs2/suballoc.c | 48 |
1 files changed, 22 insertions, 26 deletions
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index 7809f41bcbfc..e5403acdb3f5 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c | |||
@@ -523,12 +523,6 @@ static int ocfs2_block_group_grow_discontig(handle_t *handle, | |||
523 | 523 | ||
524 | while ((needed > 0) && (le16_to_cpu(el->l_next_free_rec) < | 524 | while ((needed > 0) && (le16_to_cpu(el->l_next_free_rec) < |
525 | le16_to_cpu(el->l_count))) { | 525 | le16_to_cpu(el->l_count))) { |
526 | status = ocfs2_extend_trans(handle, OCFS2_SUBALLOC_ALLOC); | ||
527 | if (status) { | ||
528 | mlog_errno(status); | ||
529 | goto bail; | ||
530 | } | ||
531 | |||
532 | if (min_bits > needed) | 526 | if (min_bits > needed) |
533 | min_bits = needed; | 527 | min_bits = needed; |
534 | status = ocfs2_block_group_claim_bits(osb, handle, ac, | 528 | status = ocfs2_block_group_claim_bits(osb, handle, ac, |
@@ -556,11 +550,12 @@ bail: | |||
556 | return status; | 550 | return status; |
557 | } | 551 | } |
558 | 552 | ||
559 | static void ocfs2_bg_alloc_cleanup(struct inode *alloc_inode, | 553 | static void ocfs2_bg_alloc_cleanup(handle_t *handle, |
560 | struct buffer_head *bg_bh, | 554 | struct ocfs2_alloc_context *cluster_ac, |
561 | struct ocfs2_cached_dealloc_ctxt *dealloc) | 555 | struct inode *alloc_inode, |
556 | struct buffer_head *bg_bh) | ||
562 | { | 557 | { |
563 | int i; | 558 | int i, ret; |
564 | struct ocfs2_group_desc *bg; | 559 | struct ocfs2_group_desc *bg; |
565 | struct ocfs2_extent_list *el; | 560 | struct ocfs2_extent_list *el; |
566 | struct ocfs2_extent_rec *rec; | 561 | struct ocfs2_extent_rec *rec; |
@@ -572,9 +567,13 @@ static void ocfs2_bg_alloc_cleanup(struct inode *alloc_inode, | |||
572 | el = &bg->bg_list; | 567 | el = &bg->bg_list; |
573 | for (i = 0; i < le16_to_cpu(el->l_next_free_rec); i++) { | 568 | for (i = 0; i < le16_to_cpu(el->l_next_free_rec); i++) { |
574 | rec = &el->l_recs[i]; | 569 | rec = &el->l_recs[i]; |
575 | ocfs2_cache_cluster_dealloc(dealloc, | 570 | ret = ocfs2_free_clusters(handle, cluster_ac->ac_inode, |
576 | le64_to_cpu(rec->e_blkno), | 571 | cluster_ac->ac_bh, |
577 | le32_to_cpu(rec->e_leaf_clusters)); | 572 | le64_to_cpu(rec->e_blkno), |
573 | le32_to_cpu(rec->e_leaf_clusters)); | ||
574 | if (ret) | ||
575 | mlog_errno(ret); | ||
576 | /* Try all the clusters to free */ | ||
578 | } | 577 | } |
579 | 578 | ||
580 | ocfs2_remove_from_cache(INODE_CACHE(alloc_inode), bg_bh); | 579 | ocfs2_remove_from_cache(INODE_CACHE(alloc_inode), bg_bh); |
@@ -585,8 +584,7 @@ static struct buffer_head * | |||
585 | ocfs2_block_group_alloc_discontig(handle_t *handle, | 584 | ocfs2_block_group_alloc_discontig(handle_t *handle, |
586 | struct inode *alloc_inode, | 585 | struct inode *alloc_inode, |
587 | struct ocfs2_alloc_context *ac, | 586 | struct ocfs2_alloc_context *ac, |
588 | struct ocfs2_chain_list *cl, | 587 | struct ocfs2_chain_list *cl) |
589 | struct ocfs2_cached_dealloc_ctxt *dealloc) | ||
590 | { | 588 | { |
591 | int status; | 589 | int status; |
592 | u32 bit_off, num_bits; | 590 | u32 bit_off, num_bits; |
@@ -601,6 +599,13 @@ ocfs2_block_group_alloc_discontig(handle_t *handle, | |||
601 | goto bail; | 599 | goto bail; |
602 | } | 600 | } |
603 | 601 | ||
602 | status = ocfs2_extend_trans(handle, | ||
603 | ocfs2_calc_bg_discontig_credits(osb->sb)); | ||
604 | if (status) { | ||
605 | mlog_errno(status); | ||
606 | goto bail; | ||
607 | } | ||
608 | |||
604 | /* Claim the first region */ | 609 | /* Claim the first region */ |
605 | status = ocfs2_block_group_claim_bits(osb, handle, ac, min_bits, | 610 | status = ocfs2_block_group_claim_bits(osb, handle, ac, min_bits, |
606 | &bit_off, &num_bits); | 611 | &bit_off, &num_bits); |
@@ -638,7 +643,7 @@ ocfs2_block_group_alloc_discontig(handle_t *handle, | |||
638 | 643 | ||
639 | bail: | 644 | bail: |
640 | if (status) | 645 | if (status) |
641 | ocfs2_bg_alloc_cleanup(alloc_inode, bg_bh, dealloc); | 646 | ocfs2_bg_alloc_cleanup(handle, ac, alloc_inode, bg_bh); |
642 | return status ? ERR_PTR(status) : bg_bh; | 647 | return status ? ERR_PTR(status) : bg_bh; |
643 | } | 648 | } |
644 | 649 | ||
@@ -660,14 +665,11 @@ static int ocfs2_block_group_alloc(struct ocfs2_super *osb, | |||
660 | u64 bg_blkno; | 665 | u64 bg_blkno; |
661 | struct buffer_head *bg_bh = NULL; | 666 | struct buffer_head *bg_bh = NULL; |
662 | struct ocfs2_group_desc *bg; | 667 | struct ocfs2_group_desc *bg; |
663 | struct ocfs2_cached_dealloc_ctxt dealloc; | ||
664 | 668 | ||
665 | BUG_ON(ocfs2_is_cluster_bitmap(alloc_inode)); | 669 | BUG_ON(ocfs2_is_cluster_bitmap(alloc_inode)); |
666 | 670 | ||
667 | mlog_entry_void(); | 671 | mlog_entry_void(); |
668 | 672 | ||
669 | ocfs2_init_dealloc_ctxt(&dealloc); | ||
670 | |||
671 | cl = &fe->id2.i_chain; | 673 | cl = &fe->id2.i_chain; |
672 | status = ocfs2_reserve_clusters_with_limit(osb, | 674 | status = ocfs2_reserve_clusters_with_limit(osb, |
673 | le16_to_cpu(cl->cl_cpg), | 675 | le16_to_cpu(cl->cl_cpg), |
@@ -699,8 +701,7 @@ static int ocfs2_block_group_alloc(struct ocfs2_super *osb, | |||
699 | if (IS_ERR(bg_bh) && (PTR_ERR(bg_bh) == -ENOSPC)) | 701 | if (IS_ERR(bg_bh) && (PTR_ERR(bg_bh) == -ENOSPC)) |
700 | bg_bh = ocfs2_block_group_alloc_discontig(handle, | 702 | bg_bh = ocfs2_block_group_alloc_discontig(handle, |
701 | alloc_inode, | 703 | alloc_inode, |
702 | ac, cl, | 704 | ac, cl); |
703 | &dealloc); | ||
704 | if (IS_ERR(bg_bh)) { | 705 | if (IS_ERR(bg_bh)) { |
705 | status = PTR_ERR(bg_bh); | 706 | status = PTR_ERR(bg_bh); |
706 | bg_bh = NULL; | 707 | bg_bh = NULL; |
@@ -750,11 +751,6 @@ bail: | |||
750 | if (handle) | 751 | if (handle) |
751 | ocfs2_commit_trans(osb, handle); | 752 | ocfs2_commit_trans(osb, handle); |
752 | 753 | ||
753 | if (ocfs2_dealloc_has_cluster(&dealloc)) { | ||
754 | ocfs2_schedule_truncate_log_flush(osb, 1); | ||
755 | ocfs2_run_deallocs(osb, &dealloc); | ||
756 | } | ||
757 | |||
758 | if (ac) | 754 | if (ac) |
759 | ocfs2_free_alloc_context(ac); | 755 | ocfs2_free_alloc_context(ac); |
760 | 756 | ||