diff options
Diffstat (limited to 'fs/ocfs2/refcounttree.c')
-rw-r--r-- | fs/ocfs2/refcounttree.c | 74 |
1 files changed, 30 insertions, 44 deletions
diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c index 5cbcd0f008fc..4793f36f6518 100644 --- a/fs/ocfs2/refcounttree.c +++ b/fs/ocfs2/refcounttree.c | |||
@@ -570,7 +570,7 @@ static int ocfs2_create_refcount_tree(struct inode *inode, | |||
570 | struct ocfs2_refcount_tree *new_tree = NULL, *tree = NULL; | 570 | struct ocfs2_refcount_tree *new_tree = NULL, *tree = NULL; |
571 | u16 suballoc_bit_start; | 571 | u16 suballoc_bit_start; |
572 | u32 num_got; | 572 | u32 num_got; |
573 | u64 first_blkno; | 573 | u64 suballoc_loc, first_blkno; |
574 | 574 | ||
575 | BUG_ON(oi->ip_dyn_features & OCFS2_HAS_REFCOUNT_FL); | 575 | BUG_ON(oi->ip_dyn_features & OCFS2_HAS_REFCOUNT_FL); |
576 | 576 | ||
@@ -596,7 +596,7 @@ static int ocfs2_create_refcount_tree(struct inode *inode, | |||
596 | goto out_commit; | 596 | goto out_commit; |
597 | } | 597 | } |
598 | 598 | ||
599 | ret = ocfs2_claim_metadata(osb, handle, meta_ac, 1, | 599 | ret = ocfs2_claim_metadata(handle, meta_ac, 1, &suballoc_loc, |
600 | &suballoc_bit_start, &num_got, | 600 | &suballoc_bit_start, &num_got, |
601 | &first_blkno); | 601 | &first_blkno); |
602 | if (ret) { | 602 | if (ret) { |
@@ -626,6 +626,7 @@ static int ocfs2_create_refcount_tree(struct inode *inode, | |||
626 | memset(rb, 0, inode->i_sb->s_blocksize); | 626 | memset(rb, 0, inode->i_sb->s_blocksize); |
627 | strcpy((void *)rb, OCFS2_REFCOUNT_BLOCK_SIGNATURE); | 627 | strcpy((void *)rb, OCFS2_REFCOUNT_BLOCK_SIGNATURE); |
628 | rb->rf_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); | 628 | rb->rf_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); |
629 | rb->rf_suballoc_loc = cpu_to_le64(suballoc_loc); | ||
629 | rb->rf_suballoc_bit = cpu_to_le16(suballoc_bit_start); | 630 | rb->rf_suballoc_bit = cpu_to_le16(suballoc_bit_start); |
630 | rb->rf_fs_generation = cpu_to_le32(osb->fs_generation); | 631 | rb->rf_fs_generation = cpu_to_le32(osb->fs_generation); |
631 | rb->rf_blkno = cpu_to_le64(first_blkno); | 632 | rb->rf_blkno = cpu_to_le64(first_blkno); |
@@ -790,7 +791,10 @@ int ocfs2_remove_refcount_tree(struct inode *inode, struct buffer_head *di_bh) | |||
790 | if (le32_to_cpu(rb->rf_count) == 1) { | 791 | if (le32_to_cpu(rb->rf_count) == 1) { |
791 | blk = le64_to_cpu(rb->rf_blkno); | 792 | blk = le64_to_cpu(rb->rf_blkno); |
792 | bit = le16_to_cpu(rb->rf_suballoc_bit); | 793 | bit = le16_to_cpu(rb->rf_suballoc_bit); |
793 | bg_blkno = ocfs2_which_suballoc_group(blk, bit); | 794 | if (rb->rf_suballoc_loc) |
795 | bg_blkno = le64_to_cpu(rb->rf_suballoc_loc); | ||
796 | else | ||
797 | bg_blkno = ocfs2_which_suballoc_group(blk, bit); | ||
794 | 798 | ||
795 | alloc_inode = ocfs2_get_system_file_inode(osb, | 799 | alloc_inode = ocfs2_get_system_file_inode(osb, |
796 | EXTENT_ALLOC_SYSTEM_INODE, | 800 | EXTENT_ALLOC_SYSTEM_INODE, |
@@ -1268,9 +1272,7 @@ static int ocfs2_change_refcount_rec(handle_t *handle, | |||
1268 | } else if (merge) | 1272 | } else if (merge) |
1269 | ocfs2_refcount_rec_merge(rb, index); | 1273 | ocfs2_refcount_rec_merge(rb, index); |
1270 | 1274 | ||
1271 | ret = ocfs2_journal_dirty(handle, ref_leaf_bh); | 1275 | ocfs2_journal_dirty(handle, ref_leaf_bh); |
1272 | if (ret) | ||
1273 | mlog_errno(ret); | ||
1274 | out: | 1276 | out: |
1275 | return ret; | 1277 | return ret; |
1276 | } | 1278 | } |
@@ -1284,7 +1286,7 @@ static int ocfs2_expand_inline_ref_root(handle_t *handle, | |||
1284 | int ret; | 1286 | int ret; |
1285 | u16 suballoc_bit_start; | 1287 | u16 suballoc_bit_start; |
1286 | u32 num_got; | 1288 | u32 num_got; |
1287 | u64 blkno; | 1289 | u64 suballoc_loc, blkno; |
1288 | struct super_block *sb = ocfs2_metadata_cache_get_super(ci); | 1290 | struct super_block *sb = ocfs2_metadata_cache_get_super(ci); |
1289 | struct buffer_head *new_bh = NULL; | 1291 | struct buffer_head *new_bh = NULL; |
1290 | struct ocfs2_refcount_block *new_rb; | 1292 | struct ocfs2_refcount_block *new_rb; |
@@ -1298,7 +1300,7 @@ static int ocfs2_expand_inline_ref_root(handle_t *handle, | |||
1298 | goto out; | 1300 | goto out; |
1299 | } | 1301 | } |
1300 | 1302 | ||
1301 | ret = ocfs2_claim_metadata(OCFS2_SB(sb), handle, meta_ac, 1, | 1303 | ret = ocfs2_claim_metadata(handle, meta_ac, 1, &suballoc_loc, |
1302 | &suballoc_bit_start, &num_got, | 1304 | &suballoc_bit_start, &num_got, |
1303 | &blkno); | 1305 | &blkno); |
1304 | if (ret) { | 1306 | if (ret) { |
@@ -1330,6 +1332,7 @@ static int ocfs2_expand_inline_ref_root(handle_t *handle, | |||
1330 | 1332 | ||
1331 | new_rb = (struct ocfs2_refcount_block *)new_bh->b_data; | 1333 | new_rb = (struct ocfs2_refcount_block *)new_bh->b_data; |
1332 | new_rb->rf_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); | 1334 | new_rb->rf_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); |
1335 | new_rb->rf_suballoc_loc = cpu_to_le64(suballoc_loc); | ||
1333 | new_rb->rf_suballoc_bit = cpu_to_le16(suballoc_bit_start); | 1336 | new_rb->rf_suballoc_bit = cpu_to_le16(suballoc_bit_start); |
1334 | new_rb->rf_blkno = cpu_to_le64(blkno); | 1337 | new_rb->rf_blkno = cpu_to_le64(blkno); |
1335 | new_rb->rf_cpos = cpu_to_le32(0); | 1338 | new_rb->rf_cpos = cpu_to_le32(0); |
@@ -1524,7 +1527,7 @@ static int ocfs2_new_leaf_refcount_block(handle_t *handle, | |||
1524 | int ret; | 1527 | int ret; |
1525 | u16 suballoc_bit_start; | 1528 | u16 suballoc_bit_start; |
1526 | u32 num_got, new_cpos; | 1529 | u32 num_got, new_cpos; |
1527 | u64 blkno; | 1530 | u64 suballoc_loc, blkno; |
1528 | struct super_block *sb = ocfs2_metadata_cache_get_super(ci); | 1531 | struct super_block *sb = ocfs2_metadata_cache_get_super(ci); |
1529 | struct ocfs2_refcount_block *root_rb = | 1532 | struct ocfs2_refcount_block *root_rb = |
1530 | (struct ocfs2_refcount_block *)ref_root_bh->b_data; | 1533 | (struct ocfs2_refcount_block *)ref_root_bh->b_data; |
@@ -1548,7 +1551,7 @@ static int ocfs2_new_leaf_refcount_block(handle_t *handle, | |||
1548 | goto out; | 1551 | goto out; |
1549 | } | 1552 | } |
1550 | 1553 | ||
1551 | ret = ocfs2_claim_metadata(OCFS2_SB(sb), handle, meta_ac, 1, | 1554 | ret = ocfs2_claim_metadata(handle, meta_ac, 1, &suballoc_loc, |
1552 | &suballoc_bit_start, &num_got, | 1555 | &suballoc_bit_start, &num_got, |
1553 | &blkno); | 1556 | &blkno); |
1554 | if (ret) { | 1557 | if (ret) { |
@@ -1576,6 +1579,7 @@ static int ocfs2_new_leaf_refcount_block(handle_t *handle, | |||
1576 | memset(new_rb, 0, sb->s_blocksize); | 1579 | memset(new_rb, 0, sb->s_blocksize); |
1577 | strcpy((void *)new_rb, OCFS2_REFCOUNT_BLOCK_SIGNATURE); | 1580 | strcpy((void *)new_rb, OCFS2_REFCOUNT_BLOCK_SIGNATURE); |
1578 | new_rb->rf_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); | 1581 | new_rb->rf_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); |
1582 | new_rb->rf_suballoc_loc = cpu_to_le64(suballoc_loc); | ||
1579 | new_rb->rf_suballoc_bit = cpu_to_le16(suballoc_bit_start); | 1583 | new_rb->rf_suballoc_bit = cpu_to_le16(suballoc_bit_start); |
1580 | new_rb->rf_fs_generation = cpu_to_le32(OCFS2_SB(sb)->fs_generation); | 1584 | new_rb->rf_fs_generation = cpu_to_le32(OCFS2_SB(sb)->fs_generation); |
1581 | new_rb->rf_blkno = cpu_to_le64(blkno); | 1585 | new_rb->rf_blkno = cpu_to_le64(blkno); |
@@ -1694,7 +1698,7 @@ static int ocfs2_adjust_refcount_rec(handle_t *handle, | |||
1694 | * 2 more credits, one for the leaf refcount block, one for | 1698 | * 2 more credits, one for the leaf refcount block, one for |
1695 | * the extent block contains the extent rec. | 1699 | * the extent block contains the extent rec. |
1696 | */ | 1700 | */ |
1697 | ret = ocfs2_extend_trans(handle, handle->h_buffer_credits + 2); | 1701 | ret = ocfs2_extend_trans(handle, 2); |
1698 | if (ret < 0) { | 1702 | if (ret < 0) { |
1699 | mlog_errno(ret); | 1703 | mlog_errno(ret); |
1700 | goto out; | 1704 | goto out; |
@@ -1802,11 +1806,7 @@ static int ocfs2_insert_refcount_rec(handle_t *handle, | |||
1802 | if (merge) | 1806 | if (merge) |
1803 | ocfs2_refcount_rec_merge(rb, index); | 1807 | ocfs2_refcount_rec_merge(rb, index); |
1804 | 1808 | ||
1805 | ret = ocfs2_journal_dirty(handle, ref_leaf_bh); | 1809 | ocfs2_journal_dirty(handle, ref_leaf_bh); |
1806 | if (ret) { | ||
1807 | mlog_errno(ret); | ||
1808 | goto out; | ||
1809 | } | ||
1810 | 1810 | ||
1811 | if (index == 0) { | 1811 | if (index == 0) { |
1812 | ret = ocfs2_adjust_refcount_rec(handle, ci, | 1812 | ret = ocfs2_adjust_refcount_rec(handle, ci, |
@@ -1977,9 +1977,7 @@ static int ocfs2_split_refcount_rec(handle_t *handle, | |||
1977 | ocfs2_refcount_rec_merge(rb, index); | 1977 | ocfs2_refcount_rec_merge(rb, index); |
1978 | } | 1978 | } |
1979 | 1979 | ||
1980 | ret = ocfs2_journal_dirty(handle, ref_leaf_bh); | 1980 | ocfs2_journal_dirty(handle, ref_leaf_bh); |
1981 | if (ret) | ||
1982 | mlog_errno(ret); | ||
1983 | 1981 | ||
1984 | out: | 1982 | out: |
1985 | brelse(new_bh); | 1983 | brelse(new_bh); |
@@ -2112,6 +2110,7 @@ static int ocfs2_remove_refcount_extent(handle_t *handle, | |||
2112 | */ | 2110 | */ |
2113 | ret = ocfs2_cache_block_dealloc(dealloc, EXTENT_ALLOC_SYSTEM_INODE, | 2111 | ret = ocfs2_cache_block_dealloc(dealloc, EXTENT_ALLOC_SYSTEM_INODE, |
2114 | le16_to_cpu(rb->rf_suballoc_slot), | 2112 | le16_to_cpu(rb->rf_suballoc_slot), |
2113 | le64_to_cpu(rb->rf_suballoc_loc), | ||
2115 | le64_to_cpu(rb->rf_blkno), | 2114 | le64_to_cpu(rb->rf_blkno), |
2116 | le16_to_cpu(rb->rf_suballoc_bit)); | 2115 | le16_to_cpu(rb->rf_suballoc_bit)); |
2117 | if (ret) { | 2116 | if (ret) { |
@@ -2516,20 +2515,19 @@ out: | |||
2516 | * | 2515 | * |
2517 | * Normally the refcount blocks store these refcount should be | 2516 | * Normally the refcount blocks store these refcount should be |
2518 | * contiguous also, so that we can get the number easily. | 2517 | * contiguous also, so that we can get the number easily. |
2519 | * As for meta_ac, we will at most add split 2 refcount record and | 2518 | * We will at most add split 2 refcount records and 2 more |
2520 | * 2 more refcount block, so just check it in a rough way. | 2519 | * refcount blocks, so just check it in a rough way. |
2521 | * | 2520 | * |
2522 | * Caller must hold refcount tree lock. | 2521 | * Caller must hold refcount tree lock. |
2523 | */ | 2522 | */ |
2524 | int ocfs2_prepare_refcount_change_for_del(struct inode *inode, | 2523 | int ocfs2_prepare_refcount_change_for_del(struct inode *inode, |
2525 | struct buffer_head *di_bh, | 2524 | u64 refcount_loc, |
2526 | u64 phys_blkno, | 2525 | u64 phys_blkno, |
2527 | u32 clusters, | 2526 | u32 clusters, |
2528 | int *credits, | 2527 | int *credits, |
2529 | struct ocfs2_alloc_context **meta_ac) | 2528 | int *ref_blocks) |
2530 | { | 2529 | { |
2531 | int ret, ref_blocks = 0; | 2530 | int ret; |
2532 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; | ||
2533 | struct ocfs2_inode_info *oi = OCFS2_I(inode); | 2531 | struct ocfs2_inode_info *oi = OCFS2_I(inode); |
2534 | struct buffer_head *ref_root_bh = NULL; | 2532 | struct buffer_head *ref_root_bh = NULL; |
2535 | struct ocfs2_refcount_tree *tree; | 2533 | struct ocfs2_refcount_tree *tree; |
@@ -2546,14 +2544,13 @@ int ocfs2_prepare_refcount_change_for_del(struct inode *inode, | |||
2546 | BUG_ON(!(oi->ip_dyn_features & OCFS2_HAS_REFCOUNT_FL)); | 2544 | BUG_ON(!(oi->ip_dyn_features & OCFS2_HAS_REFCOUNT_FL)); |
2547 | 2545 | ||
2548 | ret = ocfs2_get_refcount_tree(OCFS2_SB(inode->i_sb), | 2546 | ret = ocfs2_get_refcount_tree(OCFS2_SB(inode->i_sb), |
2549 | le64_to_cpu(di->i_refcount_loc), &tree); | 2547 | refcount_loc, &tree); |
2550 | if (ret) { | 2548 | if (ret) { |
2551 | mlog_errno(ret); | 2549 | mlog_errno(ret); |
2552 | goto out; | 2550 | goto out; |
2553 | } | 2551 | } |
2554 | 2552 | ||
2555 | ret = ocfs2_read_refcount_block(&tree->rf_ci, | 2553 | ret = ocfs2_read_refcount_block(&tree->rf_ci, refcount_loc, |
2556 | le64_to_cpu(di->i_refcount_loc), | ||
2557 | &ref_root_bh); | 2554 | &ref_root_bh); |
2558 | if (ret) { | 2555 | if (ret) { |
2559 | mlog_errno(ret); | 2556 | mlog_errno(ret); |
@@ -2564,21 +2561,14 @@ int ocfs2_prepare_refcount_change_for_del(struct inode *inode, | |||
2564 | &tree->rf_ci, | 2561 | &tree->rf_ci, |
2565 | ref_root_bh, | 2562 | ref_root_bh, |
2566 | start_cpos, clusters, | 2563 | start_cpos, clusters, |
2567 | &ref_blocks, credits); | 2564 | ref_blocks, credits); |
2568 | if (ret) { | 2565 | if (ret) { |
2569 | mlog_errno(ret); | 2566 | mlog_errno(ret); |
2570 | goto out; | 2567 | goto out; |
2571 | } | 2568 | } |
2572 | 2569 | ||
2573 | mlog(0, "reserve new metadata %d, credits = %d\n", | 2570 | mlog(0, "reserve new metadata %d blocks, credits = %d\n", |
2574 | ref_blocks, *credits); | 2571 | *ref_blocks, *credits); |
2575 | |||
2576 | if (ref_blocks) { | ||
2577 | ret = ocfs2_reserve_new_metadata_blocks(OCFS2_SB(inode->i_sb), | ||
2578 | ref_blocks, meta_ac); | ||
2579 | if (ret) | ||
2580 | mlog_errno(ret); | ||
2581 | } | ||
2582 | 2572 | ||
2583 | out: | 2573 | out: |
2584 | brelse(ref_root_bh); | 2574 | brelse(ref_root_bh); |
@@ -3040,11 +3030,7 @@ static int ocfs2_duplicate_clusters_by_jbd(handle_t *handle, | |||
3040 | } | 3030 | } |
3041 | 3031 | ||
3042 | memcpy(new_bh->b_data, old_bh->b_data, sb->s_blocksize); | 3032 | memcpy(new_bh->b_data, old_bh->b_data, sb->s_blocksize); |
3043 | ret = ocfs2_journal_dirty(handle, new_bh); | 3033 | ocfs2_journal_dirty(handle, new_bh); |
3044 | if (ret) { | ||
3045 | mlog_errno(ret); | ||
3046 | break; | ||
3047 | } | ||
3048 | 3034 | ||
3049 | brelse(new_bh); | 3035 | brelse(new_bh); |
3050 | brelse(old_bh); | 3036 | brelse(old_bh); |
@@ -3282,7 +3268,7 @@ static int ocfs2_make_clusters_writable(struct super_block *sb, | |||
3282 | } else { | 3268 | } else { |
3283 | delete = 1; | 3269 | delete = 1; |
3284 | 3270 | ||
3285 | ret = __ocfs2_claim_clusters(osb, handle, | 3271 | ret = __ocfs2_claim_clusters(handle, |
3286 | context->data_ac, | 3272 | context->data_ac, |
3287 | 1, set_len, | 3273 | 1, set_len, |
3288 | &new_bit, &new_len); | 3274 | &new_bit, &new_len); |