diff options
author | Joel Becker <joel.becker@oracle.com> | 2010-03-25 22:09:15 -0400 |
---|---|---|
committer | Tao Ma <tao.ma@oracle.com> | 2010-03-25 22:09:15 -0400 |
commit | 2b6cb576aa80611f1f6a3c88708d1e68a8d97985 (patch) | |
tree | a984f09104970133379e4d370b9f01e7f85c6f9b /fs/ocfs2 | |
parent | ba2066351b630f0205ebf725f5c81a2a07a77cd7 (diff) |
ocfs2: Set suballoc_loc on allocated metadata.
Get the suballoc_loc from ocfs2_claim_new_inode() or
ocfs2_claim_metadata(). Store it on the appropriate field of the block
we just allocated.
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Diffstat (limited to 'fs/ocfs2')
-rw-r--r-- | fs/ocfs2/alloc.c | 4 | ||||
-rw-r--r-- | fs/ocfs2/dir.c | 7 | ||||
-rw-r--r-- | fs/ocfs2/namei.c | 6 | ||||
-rw-r--r-- | fs/ocfs2/refcounttree.c | 15 | ||||
-rw-r--r-- | fs/ocfs2/suballoc.c | 16 | ||||
-rw-r--r-- | fs/ocfs2/suballoc.h | 2 | ||||
-rw-r--r-- | fs/ocfs2/xattr.c | 7 |
7 files changed, 39 insertions, 18 deletions
diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c index b6e2ba1f6a7b..479d2ecae340 100644 --- a/fs/ocfs2/alloc.c +++ b/fs/ocfs2/alloc.c | |||
@@ -1006,7 +1006,7 @@ static int ocfs2_create_new_meta_bhs(handle_t *handle, | |||
1006 | int count, status, i; | 1006 | int count, status, i; |
1007 | u16 suballoc_bit_start; | 1007 | u16 suballoc_bit_start; |
1008 | u32 num_got; | 1008 | u32 num_got; |
1009 | u64 first_blkno; | 1009 | u64 suballoc_loc, first_blkno; |
1010 | struct ocfs2_super *osb = | 1010 | struct ocfs2_super *osb = |
1011 | OCFS2_SB(ocfs2_metadata_cache_get_super(et->et_ci)); | 1011 | OCFS2_SB(ocfs2_metadata_cache_get_super(et->et_ci)); |
1012 | struct ocfs2_extent_block *eb; | 1012 | struct ocfs2_extent_block *eb; |
@@ -1018,6 +1018,7 @@ static int ocfs2_create_new_meta_bhs(handle_t *handle, | |||
1018 | status = ocfs2_claim_metadata(handle, | 1018 | status = ocfs2_claim_metadata(handle, |
1019 | meta_ac, | 1019 | meta_ac, |
1020 | wanted - count, | 1020 | wanted - count, |
1021 | &suballoc_loc, | ||
1021 | &suballoc_bit_start, | 1022 | &suballoc_bit_start, |
1022 | &num_got, | 1023 | &num_got, |
1023 | &first_blkno); | 1024 | &first_blkno); |
@@ -1051,6 +1052,7 @@ static int ocfs2_create_new_meta_bhs(handle_t *handle, | |||
1051 | eb->h_fs_generation = cpu_to_le32(osb->fs_generation); | 1052 | eb->h_fs_generation = cpu_to_le32(osb->fs_generation); |
1052 | eb->h_suballoc_slot = | 1053 | eb->h_suballoc_slot = |
1053 | cpu_to_le16(meta_ac->ac_alloc_slot); | 1054 | cpu_to_le16(meta_ac->ac_alloc_slot); |
1055 | eb->h_suballoc_loc = cpu_to_le64(suballoc_loc); | ||
1054 | eb->h_suballoc_bit = cpu_to_le16(suballoc_bit_start); | 1056 | eb->h_suballoc_bit = cpu_to_le16(suballoc_bit_start); |
1055 | eb->h_list.l_count = | 1057 | eb->h_list.l_count = |
1056 | cpu_to_le16(ocfs2_extent_recs_per_eb(osb->sb)); | 1058 | cpu_to_le16(ocfs2_extent_recs_per_eb(osb->sb)); |
diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c index 02c3f2261550..341bb8f811e9 100644 --- a/fs/ocfs2/dir.c +++ b/fs/ocfs2/dir.c | |||
@@ -2395,15 +2395,15 @@ static int ocfs2_dx_dir_attach_index(struct ocfs2_super *osb, | |||
2395 | int ret; | 2395 | int ret; |
2396 | struct ocfs2_dinode *di = (struct ocfs2_dinode *) di_bh->b_data; | 2396 | struct ocfs2_dinode *di = (struct ocfs2_dinode *) di_bh->b_data; |
2397 | u16 dr_suballoc_bit; | 2397 | u16 dr_suballoc_bit; |
2398 | u64 dr_blkno; | 2398 | u64 suballoc_loc, dr_blkno; |
2399 | unsigned int num_bits; | 2399 | unsigned int num_bits; |
2400 | struct buffer_head *dx_root_bh = NULL; | 2400 | struct buffer_head *dx_root_bh = NULL; |
2401 | struct ocfs2_dx_root_block *dx_root; | 2401 | struct ocfs2_dx_root_block *dx_root; |
2402 | struct ocfs2_dir_block_trailer *trailer = | 2402 | struct ocfs2_dir_block_trailer *trailer = |
2403 | ocfs2_trailer_from_bh(dirdata_bh, dir->i_sb); | 2403 | ocfs2_trailer_from_bh(dirdata_bh, dir->i_sb); |
2404 | 2404 | ||
2405 | ret = ocfs2_claim_metadata(handle, meta_ac, 1, &dr_suballoc_bit, | 2405 | ret = ocfs2_claim_metadata(handle, meta_ac, 1, &suballoc_loc, |
2406 | &num_bits, &dr_blkno); | 2406 | &dr_suballoc_bit, &num_bits, &dr_blkno); |
2407 | if (ret) { | 2407 | if (ret) { |
2408 | mlog_errno(ret); | 2408 | mlog_errno(ret); |
2409 | goto out; | 2409 | goto out; |
@@ -2431,6 +2431,7 @@ static int ocfs2_dx_dir_attach_index(struct ocfs2_super *osb, | |||
2431 | memset(dx_root, 0, osb->sb->s_blocksize); | 2431 | memset(dx_root, 0, osb->sb->s_blocksize); |
2432 | strcpy(dx_root->dr_signature, OCFS2_DX_ROOT_SIGNATURE); | 2432 | strcpy(dx_root->dr_signature, OCFS2_DX_ROOT_SIGNATURE); |
2433 | dx_root->dr_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); | 2433 | dx_root->dr_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); |
2434 | dx_root->dr_suballoc_loc = cpu_to_le64(suballoc_loc); | ||
2434 | dx_root->dr_suballoc_bit = cpu_to_le16(dr_suballoc_bit); | 2435 | dx_root->dr_suballoc_bit = cpu_to_le16(dr_suballoc_bit); |
2435 | dx_root->dr_fs_generation = cpu_to_le32(osb->fs_generation); | 2436 | dx_root->dr_fs_generation = cpu_to_le32(osb->fs_generation); |
2436 | dx_root->dr_blkno = cpu_to_le64(dr_blkno); | 2437 | dx_root->dr_blkno = cpu_to_le64(dr_blkno); |
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index e5434a04b88a..bfe4571a4fa1 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c | |||
@@ -472,14 +472,15 @@ static int ocfs2_mknod_locked(struct ocfs2_super *osb, | |||
472 | int status = 0; | 472 | int status = 0; |
473 | struct ocfs2_dinode *fe = NULL; | 473 | struct ocfs2_dinode *fe = NULL; |
474 | struct ocfs2_extent_list *fel; | 474 | struct ocfs2_extent_list *fel; |
475 | u64 fe_blkno = 0; | 475 | u64 suballoc_loc, fe_blkno = 0; |
476 | u16 suballoc_bit; | 476 | u16 suballoc_bit; |
477 | u16 feat; | 477 | u16 feat; |
478 | 478 | ||
479 | *new_fe_bh = NULL; | 479 | *new_fe_bh = NULL; |
480 | 480 | ||
481 | status = ocfs2_claim_new_inode(handle, dir, parent_fe_bh, | 481 | status = ocfs2_claim_new_inode(handle, dir, parent_fe_bh, |
482 | inode_ac, &suballoc_bit, &fe_blkno); | 482 | inode_ac, &suballoc_loc, |
483 | &suballoc_bit, &fe_blkno); | ||
483 | if (status < 0) { | 484 | if (status < 0) { |
484 | mlog_errno(status); | 485 | mlog_errno(status); |
485 | goto leave; | 486 | goto leave; |
@@ -516,6 +517,7 @@ static int ocfs2_mknod_locked(struct ocfs2_super *osb, | |||
516 | fe->i_generation = cpu_to_le32(inode->i_generation); | 517 | fe->i_generation = cpu_to_le32(inode->i_generation); |
517 | fe->i_fs_generation = cpu_to_le32(osb->fs_generation); | 518 | fe->i_fs_generation = cpu_to_le32(osb->fs_generation); |
518 | fe->i_blkno = cpu_to_le64(fe_blkno); | 519 | fe->i_blkno = cpu_to_le64(fe_blkno); |
520 | fe->i_suballoc_loc = cpu_to_le64(suballoc_loc); | ||
519 | fe->i_suballoc_bit = cpu_to_le16(suballoc_bit); | 521 | fe->i_suballoc_bit = cpu_to_le16(suballoc_bit); |
520 | fe->i_suballoc_slot = cpu_to_le16(inode_ac->ac_alloc_slot); | 522 | fe->i_suballoc_slot = cpu_to_le16(inode_ac->ac_alloc_slot); |
521 | fe->i_uid = cpu_to_le32(inode->i_uid); | 523 | fe->i_uid = cpu_to_le32(inode->i_uid); |
diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c index 2bd74766c4e0..275920e8a40d 100644 --- a/fs/ocfs2/refcounttree.c +++ b/fs/ocfs2/refcounttree.c | |||
@@ -571,7 +571,7 @@ static int ocfs2_create_refcount_tree(struct inode *inode, | |||
571 | struct ocfs2_refcount_tree *new_tree = NULL, *tree = NULL; | 571 | struct ocfs2_refcount_tree *new_tree = NULL, *tree = NULL; |
572 | u16 suballoc_bit_start; | 572 | u16 suballoc_bit_start; |
573 | u32 num_got; | 573 | u32 num_got; |
574 | u64 first_blkno; | 574 | u64 suballoc_loc, first_blkno; |
575 | 575 | ||
576 | BUG_ON(oi->ip_dyn_features & OCFS2_HAS_REFCOUNT_FL); | 576 | BUG_ON(oi->ip_dyn_features & OCFS2_HAS_REFCOUNT_FL); |
577 | 577 | ||
@@ -597,7 +597,7 @@ static int ocfs2_create_refcount_tree(struct inode *inode, | |||
597 | goto out_commit; | 597 | goto out_commit; |
598 | } | 598 | } |
599 | 599 | ||
600 | ret = ocfs2_claim_metadata(handle, meta_ac, 1, | 600 | ret = ocfs2_claim_metadata(handle, meta_ac, 1, &suballoc_loc, |
601 | &suballoc_bit_start, &num_got, | 601 | &suballoc_bit_start, &num_got, |
602 | &first_blkno); | 602 | &first_blkno); |
603 | if (ret) { | 603 | if (ret) { |
@@ -627,6 +627,7 @@ static int ocfs2_create_refcount_tree(struct inode *inode, | |||
627 | memset(rb, 0, inode->i_sb->s_blocksize); | 627 | memset(rb, 0, inode->i_sb->s_blocksize); |
628 | strcpy((void *)rb, OCFS2_REFCOUNT_BLOCK_SIGNATURE); | 628 | strcpy((void *)rb, OCFS2_REFCOUNT_BLOCK_SIGNATURE); |
629 | rb->rf_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); | 629 | rb->rf_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); |
630 | rb->rf_suballoc_loc = cpu_to_le64(suballoc_loc); | ||
630 | rb->rf_suballoc_bit = cpu_to_le16(suballoc_bit_start); | 631 | rb->rf_suballoc_bit = cpu_to_le16(suballoc_bit_start); |
631 | rb->rf_fs_generation = cpu_to_le32(osb->fs_generation); | 632 | rb->rf_fs_generation = cpu_to_le32(osb->fs_generation); |
632 | rb->rf_blkno = cpu_to_le64(first_blkno); | 633 | rb->rf_blkno = cpu_to_le64(first_blkno); |
@@ -1283,7 +1284,7 @@ static int ocfs2_expand_inline_ref_root(handle_t *handle, | |||
1283 | int ret; | 1284 | int ret; |
1284 | u16 suballoc_bit_start; | 1285 | u16 suballoc_bit_start; |
1285 | u32 num_got; | 1286 | u32 num_got; |
1286 | u64 blkno; | 1287 | u64 suballoc_loc, blkno; |
1287 | struct super_block *sb = ocfs2_metadata_cache_get_super(ci); | 1288 | struct super_block *sb = ocfs2_metadata_cache_get_super(ci); |
1288 | struct buffer_head *new_bh = NULL; | 1289 | struct buffer_head *new_bh = NULL; |
1289 | struct ocfs2_refcount_block *new_rb; | 1290 | struct ocfs2_refcount_block *new_rb; |
@@ -1297,7 +1298,7 @@ static int ocfs2_expand_inline_ref_root(handle_t *handle, | |||
1297 | goto out; | 1298 | goto out; |
1298 | } | 1299 | } |
1299 | 1300 | ||
1300 | ret = ocfs2_claim_metadata(handle, meta_ac, 1, | 1301 | ret = ocfs2_claim_metadata(handle, meta_ac, 1, &suballoc_loc, |
1301 | &suballoc_bit_start, &num_got, | 1302 | &suballoc_bit_start, &num_got, |
1302 | &blkno); | 1303 | &blkno); |
1303 | if (ret) { | 1304 | if (ret) { |
@@ -1329,6 +1330,7 @@ static int ocfs2_expand_inline_ref_root(handle_t *handle, | |||
1329 | 1330 | ||
1330 | new_rb = (struct ocfs2_refcount_block *)new_bh->b_data; | 1331 | new_rb = (struct ocfs2_refcount_block *)new_bh->b_data; |
1331 | new_rb->rf_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); | 1332 | new_rb->rf_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); |
1333 | new_rb->rf_suballoc_loc = cpu_to_le64(suballoc_loc); | ||
1332 | new_rb->rf_suballoc_bit = cpu_to_le16(suballoc_bit_start); | 1334 | new_rb->rf_suballoc_bit = cpu_to_le16(suballoc_bit_start); |
1333 | new_rb->rf_blkno = cpu_to_le64(blkno); | 1335 | new_rb->rf_blkno = cpu_to_le64(blkno); |
1334 | new_rb->rf_cpos = cpu_to_le32(0); | 1336 | new_rb->rf_cpos = cpu_to_le32(0); |
@@ -1523,7 +1525,7 @@ static int ocfs2_new_leaf_refcount_block(handle_t *handle, | |||
1523 | int ret; | 1525 | int ret; |
1524 | u16 suballoc_bit_start; | 1526 | u16 suballoc_bit_start; |
1525 | u32 num_got, new_cpos; | 1527 | u32 num_got, new_cpos; |
1526 | u64 blkno; | 1528 | u64 suballoc_loc, blkno; |
1527 | struct super_block *sb = ocfs2_metadata_cache_get_super(ci); | 1529 | struct super_block *sb = ocfs2_metadata_cache_get_super(ci); |
1528 | struct ocfs2_refcount_block *root_rb = | 1530 | struct ocfs2_refcount_block *root_rb = |
1529 | (struct ocfs2_refcount_block *)ref_root_bh->b_data; | 1531 | (struct ocfs2_refcount_block *)ref_root_bh->b_data; |
@@ -1547,7 +1549,7 @@ static int ocfs2_new_leaf_refcount_block(handle_t *handle, | |||
1547 | goto out; | 1549 | goto out; |
1548 | } | 1550 | } |
1549 | 1551 | ||
1550 | ret = ocfs2_claim_metadata(handle, meta_ac, 1, | 1552 | ret = ocfs2_claim_metadata(handle, meta_ac, 1, &suballoc_loc, |
1551 | &suballoc_bit_start, &num_got, | 1553 | &suballoc_bit_start, &num_got, |
1552 | &blkno); | 1554 | &blkno); |
1553 | if (ret) { | 1555 | if (ret) { |
@@ -1575,6 +1577,7 @@ static int ocfs2_new_leaf_refcount_block(handle_t *handle, | |||
1575 | memset(new_rb, 0, sb->s_blocksize); | 1577 | memset(new_rb, 0, sb->s_blocksize); |
1576 | strcpy((void *)new_rb, OCFS2_REFCOUNT_BLOCK_SIGNATURE); | 1578 | strcpy((void *)new_rb, OCFS2_REFCOUNT_BLOCK_SIGNATURE); |
1577 | new_rb->rf_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); | 1579 | new_rb->rf_suballoc_slot = cpu_to_le16(meta_ac->ac_alloc_slot); |
1580 | new_rb->rf_suballoc_loc = cpu_to_le64(suballoc_loc); | ||
1578 | new_rb->rf_suballoc_bit = cpu_to_le16(suballoc_bit_start); | 1581 | new_rb->rf_suballoc_bit = cpu_to_le16(suballoc_bit_start); |
1579 | new_rb->rf_fs_generation = cpu_to_le32(OCFS2_SB(sb)->fs_generation); | 1582 | new_rb->rf_fs_generation = cpu_to_le32(OCFS2_SB(sb)->fs_generation); |
1580 | new_rb->rf_blkno = cpu_to_le64(blkno); | 1583 | new_rb->rf_blkno = cpu_to_le64(blkno); |
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index 9c2e669a74fa..7809f41bcbfc 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c | |||
@@ -54,7 +54,9 @@ | |||
54 | #define OCFS2_MAX_TO_STEAL 1024 | 54 | #define OCFS2_MAX_TO_STEAL 1024 |
55 | 55 | ||
56 | struct ocfs2_suballoc_result { | 56 | struct ocfs2_suballoc_result { |
57 | u64 sr_bg_blkno; /* The bg we allocated from */ | 57 | u64 sr_bg_blkno; /* The bg we allocated from. Set |
58 | to 0 when a block group is | ||
59 | contiguous. */ | ||
58 | u64 sr_blkno; /* The first allocated block */ | 60 | u64 sr_blkno; /* The first allocated block */ |
59 | unsigned int sr_bit_offset; /* The bit in the bg */ | 61 | unsigned int sr_bit_offset; /* The bit in the bg */ |
60 | unsigned int sr_bits; /* How many bits we claimed */ | 62 | unsigned int sr_bits; /* How many bits we claimed */ |
@@ -1604,6 +1606,7 @@ static void ocfs2_bg_discontig_fix_result(struct ocfs2_alloc_context *ac, | |||
1604 | struct ocfs2_suballoc_result *res) | 1606 | struct ocfs2_suballoc_result *res) |
1605 | { | 1607 | { |
1606 | int i; | 1608 | int i; |
1609 | u64 bg_blkno = res->sr_bg_blkno; /* Save off */ | ||
1607 | struct ocfs2_extent_rec *rec; | 1610 | struct ocfs2_extent_rec *rec; |
1608 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)ac->ac_bh->b_data; | 1611 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)ac->ac_bh->b_data; |
1609 | struct ocfs2_chain_list *cl = &di->id2.i_chain; | 1612 | struct ocfs2_chain_list *cl = &di->id2.i_chain; |
@@ -1614,14 +1617,17 @@ static void ocfs2_bg_discontig_fix_result(struct ocfs2_alloc_context *ac, | |||
1614 | } | 1617 | } |
1615 | 1618 | ||
1616 | res->sr_blkno = res->sr_bg_blkno + res->sr_bit_offset; | 1619 | res->sr_blkno = res->sr_bg_blkno + res->sr_bit_offset; |
1620 | res->sr_bg_blkno = 0; /* Clear it for contig block groups */ | ||
1617 | if (!ocfs2_supports_discontig_bh(OCFS2_SB(ac->ac_inode->i_sb)) || | 1621 | if (!ocfs2_supports_discontig_bh(OCFS2_SB(ac->ac_inode->i_sb)) || |
1618 | !bg->bg_list.l_next_free_rec) | 1622 | !bg->bg_list.l_next_free_rec) |
1619 | return; | 1623 | return; |
1620 | 1624 | ||
1621 | for (i = 0; i < le16_to_cpu(bg->bg_list.l_next_free_rec); i++) { | 1625 | for (i = 0; i < le16_to_cpu(bg->bg_list.l_next_free_rec); i++) { |
1622 | rec = &bg->bg_list.l_recs[i]; | 1626 | rec = &bg->bg_list.l_recs[i]; |
1623 | if (ocfs2_bg_discontig_fix_by_rec(res, rec, cl)) | 1627 | if (ocfs2_bg_discontig_fix_by_rec(res, rec, cl)) { |
1628 | res->sr_bg_blkno = bg_blkno; /* Restore */ | ||
1624 | break; | 1629 | break; |
1630 | } | ||
1625 | } | 1631 | } |
1626 | } | 1632 | } |
1627 | 1633 | ||
@@ -1926,6 +1932,7 @@ bail: | |||
1926 | int ocfs2_claim_metadata(handle_t *handle, | 1932 | int ocfs2_claim_metadata(handle_t *handle, |
1927 | struct ocfs2_alloc_context *ac, | 1933 | struct ocfs2_alloc_context *ac, |
1928 | u32 bits_wanted, | 1934 | u32 bits_wanted, |
1935 | u64 *suballoc_loc, | ||
1929 | u16 *suballoc_bit_start, | 1936 | u16 *suballoc_bit_start, |
1930 | unsigned int *num_bits, | 1937 | unsigned int *num_bits, |
1931 | u64 *blkno_start) | 1938 | u64 *blkno_start) |
@@ -1948,6 +1955,7 @@ int ocfs2_claim_metadata(handle_t *handle, | |||
1948 | } | 1955 | } |
1949 | atomic_inc(&OCFS2_SB(ac->ac_inode->i_sb)->alloc_stats.bg_allocs); | 1956 | atomic_inc(&OCFS2_SB(ac->ac_inode->i_sb)->alloc_stats.bg_allocs); |
1950 | 1957 | ||
1958 | *suballoc_loc = res.sr_bg_blkno; | ||
1951 | *suballoc_bit_start = res.sr_bit_offset; | 1959 | *suballoc_bit_start = res.sr_bit_offset; |
1952 | *blkno_start = res.sr_blkno; | 1960 | *blkno_start = res.sr_blkno; |
1953 | ac->ac_bits_given += res.sr_bits; | 1961 | ac->ac_bits_given += res.sr_bits; |
@@ -1993,11 +2001,12 @@ int ocfs2_claim_new_inode(handle_t *handle, | |||
1993 | struct inode *dir, | 2001 | struct inode *dir, |
1994 | struct buffer_head *parent_fe_bh, | 2002 | struct buffer_head *parent_fe_bh, |
1995 | struct ocfs2_alloc_context *ac, | 2003 | struct ocfs2_alloc_context *ac, |
2004 | u64 *suballoc_loc, | ||
1996 | u16 *suballoc_bit, | 2005 | u16 *suballoc_bit, |
1997 | u64 *fe_blkno) | 2006 | u64 *fe_blkno) |
1998 | { | 2007 | { |
1999 | int status; | 2008 | int status; |
2000 | struct ocfs2_suballoc_result res = { .sr_blkno = 0, }; | 2009 | struct ocfs2_suballoc_result res; |
2001 | 2010 | ||
2002 | mlog_entry_void(); | 2011 | mlog_entry_void(); |
2003 | 2012 | ||
@@ -2021,6 +2030,7 @@ int ocfs2_claim_new_inode(handle_t *handle, | |||
2021 | 2030 | ||
2022 | BUG_ON(res.sr_bits != 1); | 2031 | BUG_ON(res.sr_bits != 1); |
2023 | 2032 | ||
2033 | *suballoc_loc = res.sr_bg_blkno; | ||
2024 | *suballoc_bit = res.sr_bit_offset; | 2034 | *suballoc_bit = res.sr_bit_offset; |
2025 | *fe_blkno = res.sr_blkno; | 2035 | *fe_blkno = res.sr_blkno; |
2026 | ac->ac_bits_given++; | 2036 | ac->ac_bits_given++; |
diff --git a/fs/ocfs2/suballoc.h b/fs/ocfs2/suballoc.h index 49b0b22d30cf..a017dd3ee7d9 100644 --- a/fs/ocfs2/suballoc.h +++ b/fs/ocfs2/suballoc.h | |||
@@ -86,6 +86,7 @@ int ocfs2_reserve_clusters(struct ocfs2_super *osb, | |||
86 | int ocfs2_claim_metadata(handle_t *handle, | 86 | int ocfs2_claim_metadata(handle_t *handle, |
87 | struct ocfs2_alloc_context *ac, | 87 | struct ocfs2_alloc_context *ac, |
88 | u32 bits_wanted, | 88 | u32 bits_wanted, |
89 | u64 *suballoc_loc, | ||
89 | u16 *suballoc_bit_start, | 90 | u16 *suballoc_bit_start, |
90 | u32 *num_bits, | 91 | u32 *num_bits, |
91 | u64 *blkno_start); | 92 | u64 *blkno_start); |
@@ -93,6 +94,7 @@ int ocfs2_claim_new_inode(handle_t *handle, | |||
93 | struct inode *dir, | 94 | struct inode *dir, |
94 | struct buffer_head *parent_fe_bh, | 95 | struct buffer_head *parent_fe_bh, |
95 | struct ocfs2_alloc_context *ac, | 96 | struct ocfs2_alloc_context *ac, |
97 | u64 *suballoc_loc, | ||
96 | u16 *suballoc_bit, | 98 | u16 *suballoc_bit, |
97 | u64 *fe_blkno); | 99 | u64 *fe_blkno); |
98 | int ocfs2_claim_clusters(handle_t *handle, | 100 | int ocfs2_claim_clusters(handle_t *handle, |
diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c index 2f6fd48c0ba4..805167e226c1 100644 --- a/fs/ocfs2/xattr.c +++ b/fs/ocfs2/xattr.c | |||
@@ -2829,7 +2829,7 @@ static int ocfs2_create_xattr_block(struct inode *inode, | |||
2829 | int ret; | 2829 | int ret; |
2830 | u16 suballoc_bit_start; | 2830 | u16 suballoc_bit_start; |
2831 | u32 num_got; | 2831 | u32 num_got; |
2832 | u64 first_blkno; | 2832 | u64 suballoc_loc, first_blkno; |
2833 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)inode_bh->b_data; | 2833 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)inode_bh->b_data; |
2834 | struct buffer_head *new_bh = NULL; | 2834 | struct buffer_head *new_bh = NULL; |
2835 | struct ocfs2_xattr_block *xblk; | 2835 | struct ocfs2_xattr_block *xblk; |
@@ -2842,8 +2842,8 @@ static int ocfs2_create_xattr_block(struct inode *inode, | |||
2842 | } | 2842 | } |
2843 | 2843 | ||
2844 | ret = ocfs2_claim_metadata(ctxt->handle, ctxt->meta_ac, 1, | 2844 | ret = ocfs2_claim_metadata(ctxt->handle, ctxt->meta_ac, 1, |
2845 | &suballoc_bit_start, &num_got, | 2845 | &suballoc_loc, &suballoc_bit_start, |
2846 | &first_blkno); | 2846 | &num_got, &first_blkno); |
2847 | if (ret < 0) { | 2847 | if (ret < 0) { |
2848 | mlog_errno(ret); | 2848 | mlog_errno(ret); |
2849 | goto end; | 2849 | goto end; |
@@ -2865,6 +2865,7 @@ static int ocfs2_create_xattr_block(struct inode *inode, | |||
2865 | memset(xblk, 0, inode->i_sb->s_blocksize); | 2865 | memset(xblk, 0, inode->i_sb->s_blocksize); |
2866 | strcpy((void *)xblk, OCFS2_XATTR_BLOCK_SIGNATURE); | 2866 | strcpy((void *)xblk, OCFS2_XATTR_BLOCK_SIGNATURE); |
2867 | xblk->xb_suballoc_slot = cpu_to_le16(ctxt->meta_ac->ac_alloc_slot); | 2867 | xblk->xb_suballoc_slot = cpu_to_le16(ctxt->meta_ac->ac_alloc_slot); |
2868 | xblk->xb_suballoc_loc = cpu_to_le64(suballoc_loc); | ||
2868 | xblk->xb_suballoc_bit = cpu_to_le16(suballoc_bit_start); | 2869 | xblk->xb_suballoc_bit = cpu_to_le16(suballoc_bit_start); |
2869 | xblk->xb_fs_generation = | 2870 | xblk->xb_fs_generation = |
2870 | cpu_to_le32(OCFS2_SB(inode->i_sb)->fs_generation); | 2871 | cpu_to_le32(OCFS2_SB(inode->i_sb)->fs_generation); |