diff options
| -rw-r--r-- | fs/ocfs2/ocfs2.h | 2 | ||||
| -rw-r--r-- | fs/ocfs2/suballoc.c | 38 |
2 files changed, 25 insertions, 15 deletions
diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h index d389f2714c96..c67003b6b5a2 100644 --- a/fs/ocfs2/ocfs2.h +++ b/fs/ocfs2/ocfs2.h | |||
| @@ -491,7 +491,7 @@ static inline int ocfs2_supports_indexed_dirs(struct ocfs2_super *osb) | |||
| 491 | return 0; | 491 | return 0; |
| 492 | } | 492 | } |
| 493 | 493 | ||
| 494 | static inline int ocfs2_supports_discontig_bh(struct ocfs2_super *osb) | 494 | static inline int ocfs2_supports_discontig_bg(struct ocfs2_super *osb) |
| 495 | { | 495 | { |
| 496 | if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG) | 496 | if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_DISCONTIG_BG) |
| 497 | return 1; | 497 | return 1; |
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index 5852a46647a2..b7491e2481ca 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c | |||
| @@ -341,15 +341,17 @@ static void ocfs2_bg_discontig_add_extent(struct ocfs2_super *osb, | |||
| 341 | struct ocfs2_extent_list *el = &bg->bg_list; | 341 | struct ocfs2_extent_list *el = &bg->bg_list; |
| 342 | struct ocfs2_extent_rec *rec; | 342 | struct ocfs2_extent_rec *rec; |
| 343 | 343 | ||
| 344 | BUG_ON(!ocfs2_supports_discontig_bh(osb)); | 344 | BUG_ON(!ocfs2_supports_discontig_bg(osb)); |
| 345 | if (!el->l_next_free_rec) | 345 | if (!el->l_next_free_rec) |
| 346 | el->l_count = cpu_to_le16(ocfs2_extent_recs_per_gd(osb->sb)); | 346 | el->l_count = cpu_to_le16(ocfs2_extent_recs_per_gd(osb->sb)); |
| 347 | rec = &el->l_recs[le16_to_cpu(el->l_next_free_rec)]; | 347 | rec = &el->l_recs[le16_to_cpu(el->l_next_free_rec)]; |
| 348 | rec->e_blkno = p_blkno; | 348 | rec->e_blkno = cpu_to_le64(p_blkno); |
| 349 | rec->e_cpos = cpu_to_le32(le16_to_cpu(bg->bg_bits) / | 349 | rec->e_cpos = cpu_to_le32(le16_to_cpu(bg->bg_bits) / |
| 350 | le16_to_cpu(cl->cl_bpc)); | 350 | le16_to_cpu(cl->cl_bpc)); |
| 351 | rec->e_leaf_clusters = cpu_to_le32(clusters); | 351 | rec->e_leaf_clusters = cpu_to_le32(clusters); |
| 352 | le16_add_cpu(&bg->bg_bits, clusters * le16_to_cpu(cl->cl_bpc)); | 352 | le16_add_cpu(&bg->bg_bits, clusters * le16_to_cpu(cl->cl_bpc)); |
| 353 | le16_add_cpu(&bg->bg_free_bits_count, | ||
| 354 | clusters * le16_to_cpu(cl->cl_bpc)); | ||
| 353 | le16_add_cpu(&el->l_next_free_rec, 1); | 355 | le16_add_cpu(&el->l_next_free_rec, 1); |
| 354 | } | 356 | } |
| 355 | 357 | ||
| @@ -397,7 +399,7 @@ static int ocfs2_block_group_fill(handle_t *handle, | |||
| 397 | if (group_clusters == le16_to_cpu(cl->cl_cpg)) | 399 | if (group_clusters == le16_to_cpu(cl->cl_cpg)) |
| 398 | bg->bg_bits = cpu_to_le16(ocfs2_bits_per_group(cl)); | 400 | bg->bg_bits = cpu_to_le16(ocfs2_bits_per_group(cl)); |
| 399 | else | 401 | else |
| 400 | ocfs2_bg_discontig_add_extent(osb, bg, cl, bg->bg_blkno, | 402 | ocfs2_bg_discontig_add_extent(osb, bg, cl, group_blkno, |
| 401 | group_clusters); | 403 | group_clusters); |
| 402 | 404 | ||
| 403 | /* set the 1st bit in the bitmap to account for the descriptor block */ | 405 | /* set the 1st bit in the bitmap to account for the descriptor block */ |
| @@ -506,8 +508,8 @@ static int ocfs2_block_group_grow_discontig(handle_t *handle, | |||
| 506 | struct ocfs2_super *osb = OCFS2_SB(alloc_inode->i_sb); | 508 | struct ocfs2_super *osb = OCFS2_SB(alloc_inode->i_sb); |
| 507 | struct ocfs2_group_desc *bg = | 509 | struct ocfs2_group_desc *bg = |
| 508 | (struct ocfs2_group_desc *)bg_bh->b_data; | 510 | (struct ocfs2_group_desc *)bg_bh->b_data; |
| 509 | unsigned int needed = | 511 | unsigned int needed = le16_to_cpu(cl->cl_cpg) - |
| 510 | ocfs2_bits_per_group(cl) - le16_to_cpu(bg->bg_bits); | 512 | le16_to_cpu(bg->bg_bits) / le16_to_cpu(cl->cl_bpc); |
| 511 | u32 p_cpos, clusters; | 513 | u32 p_cpos, clusters; |
| 512 | u64 p_blkno; | 514 | u64 p_blkno; |
| 513 | struct ocfs2_extent_list *el = &bg->bg_list; | 515 | struct ocfs2_extent_list *el = &bg->bg_list; |
| @@ -538,10 +540,17 @@ static int ocfs2_block_group_grow_discontig(handle_t *handle, | |||
| 538 | clusters); | 540 | clusters); |
| 539 | 541 | ||
| 540 | min_bits = clusters; | 542 | min_bits = clusters; |
| 541 | needed = ocfs2_bits_per_group(cl) - le16_to_cpu(bg->bg_bits); | 543 | needed = le16_to_cpu(cl->cl_cpg) - |
| 544 | le16_to_cpu(bg->bg_bits) / le16_to_cpu(cl->cl_bpc); | ||
| 542 | } | 545 | } |
| 543 | 546 | ||
| 544 | if (needed > 0) { | 547 | if (needed > 0) { |
| 548 | /* | ||
| 549 | * We have used up all the extent rec but can't fill up | ||
| 550 | * the cpg. So bail out. | ||
| 551 | */ | ||
| 552 | status = -ENOSPC; | ||
| 553 | goto bail; | ||
| 545 | } | 554 | } |
| 546 | 555 | ||
| 547 | ocfs2_journal_dirty(handle, bg_bh); | 556 | ocfs2_journal_dirty(handle, bg_bh); |
| @@ -594,7 +603,7 @@ ocfs2_block_group_alloc_discontig(handle_t *handle, | |||
| 594 | unsigned int alloc_rec = ocfs2_find_smallest_chain(cl); | 603 | unsigned int alloc_rec = ocfs2_find_smallest_chain(cl); |
| 595 | struct ocfs2_super *osb = OCFS2_SB(alloc_inode->i_sb); | 604 | struct ocfs2_super *osb = OCFS2_SB(alloc_inode->i_sb); |
| 596 | 605 | ||
| 597 | if (!ocfs2_supports_discontig_bh(osb)) { | 606 | if (!ocfs2_supports_discontig_bg(osb)) { |
| 598 | status = -ENOSPC; | 607 | status = -ENOSPC; |
| 599 | goto bail; | 608 | goto bail; |
| 600 | } | 609 | } |
| @@ -670,7 +679,7 @@ static int ocfs2_block_group_alloc(struct ocfs2_super *osb, | |||
| 670 | struct ocfs2_chain_list *cl; | 679 | struct ocfs2_chain_list *cl; |
| 671 | struct ocfs2_alloc_context *ac = NULL; | 680 | struct ocfs2_alloc_context *ac = NULL; |
| 672 | handle_t *handle = NULL; | 681 | handle_t *handle = NULL; |
| 673 | u64 bg_blkno; | 682 | u16 alloc_rec; |
| 674 | struct buffer_head *bg_bh = NULL; | 683 | struct buffer_head *bg_bh = NULL; |
| 675 | struct ocfs2_group_desc *bg; | 684 | struct ocfs2_group_desc *bg; |
| 676 | 685 | ||
| @@ -726,11 +735,12 @@ static int ocfs2_block_group_alloc(struct ocfs2_super *osb, | |||
| 726 | goto bail; | 735 | goto bail; |
| 727 | } | 736 | } |
| 728 | 737 | ||
| 729 | le32_add_cpu(&cl->cl_recs[bg->bg_chain].c_free, | 738 | alloc_rec = le16_to_cpu(bg->bg_chain); |
| 739 | le32_add_cpu(&cl->cl_recs[alloc_rec].c_free, | ||
| 730 | le16_to_cpu(bg->bg_free_bits_count)); | 740 | le16_to_cpu(bg->bg_free_bits_count)); |
| 731 | le32_add_cpu(&cl->cl_recs[bg->bg_chain].c_total, | 741 | le32_add_cpu(&cl->cl_recs[alloc_rec].c_total, |
| 732 | le16_to_cpu(bg->bg_bits)); | 742 | le16_to_cpu(bg->bg_bits)); |
| 733 | cl->cl_recs[bg->bg_chain].c_blkno = cpu_to_le64(bg_blkno); | 743 | cl->cl_recs[alloc_rec].c_blkno = cpu_to_le64(bg->bg_blkno); |
| 734 | if (le16_to_cpu(cl->cl_next_free_rec) < le16_to_cpu(cl->cl_count)) | 744 | if (le16_to_cpu(cl->cl_next_free_rec) < le16_to_cpu(cl->cl_count)) |
| 735 | le16_add_cpu(&cl->cl_next_free_rec, 1); | 745 | le16_add_cpu(&cl->cl_next_free_rec, 1); |
| 736 | 746 | ||
| @@ -1622,7 +1632,7 @@ static void ocfs2_bg_discontig_fix_result(struct ocfs2_alloc_context *ac, | |||
| 1622 | 1632 | ||
| 1623 | res->sr_blkno = res->sr_bg_blkno + res->sr_bit_offset; | 1633 | res->sr_blkno = res->sr_bg_blkno + res->sr_bit_offset; |
| 1624 | res->sr_bg_blkno = 0; /* Clear it for contig block groups */ | 1634 | res->sr_bg_blkno = 0; /* Clear it for contig block groups */ |
| 1625 | if (!ocfs2_supports_discontig_bh(OCFS2_SB(ac->ac_inode->i_sb)) || | 1635 | if (!ocfs2_supports_discontig_bg(OCFS2_SB(ac->ac_inode->i_sb)) || |
| 1626 | !bg->bg_list.l_next_free_rec) | 1636 | !bg->bg_list.l_next_free_rec) |
| 1627 | return; | 1637 | return; |
| 1628 | 1638 | ||
| @@ -2162,6 +2172,7 @@ int __ocfs2_claim_clusters(handle_t *handle, | |||
| 2162 | res.sr_bg_blkno, | 2172 | res.sr_bg_blkno, |
| 2163 | res.sr_bit_offset); | 2173 | res.sr_bit_offset); |
| 2164 | atomic_inc(&osb->alloc_stats.bitmap_data); | 2174 | atomic_inc(&osb->alloc_stats.bitmap_data); |
| 2175 | *num_clusters = res.sr_bits; | ||
| 2165 | } | 2176 | } |
| 2166 | } | 2177 | } |
| 2167 | if (status < 0) { | 2178 | if (status < 0) { |
| @@ -2170,8 +2181,7 @@ int __ocfs2_claim_clusters(handle_t *handle, | |||
| 2170 | goto bail; | 2181 | goto bail; |
| 2171 | } | 2182 | } |
| 2172 | 2183 | ||
| 2173 | ac->ac_bits_given += res.sr_bits; | 2184 | ac->ac_bits_given += *num_clusters; |
| 2174 | *num_clusters = res.sr_bits; | ||
| 2175 | 2185 | ||
| 2176 | bail: | 2186 | bail: |
| 2177 | mlog_exit(status); | 2187 | mlog_exit(status); |
