diff options
author | Tao Ma <tao.ma@oracle.com> | 2010-04-22 02:09:15 -0400 |
---|---|---|
committer | Tao Ma <tao.ma@oracle.com> | 2010-04-22 02:09:15 -0400 |
commit | 4711954eaa8d30f653fda238cecf919f1ae40d6f (patch) | |
tree | f150d49ce67d3982faa22a3a73c143cc901234ac | |
parent | 95ec0adf0b56d6a3f0ca1ec87173311898486b2e (diff) |
ocfs2: Some tiny bug fixes for discontiguous block allocation.
The fixes include:
1. some endian problems.
2. we should use bit/bpc in ocfs2_block_group_grow_discontig to
allocate clusters.
3. set num_clusters properly in __ocfs2_claim_clusters.
4. change name from ocfs2_supports_discontig_bh to
ocfs2_supports_discontig_bg.
Signed-off-by: Tao Ma <tao.ma@oracle.com>
-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); |