aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJoel Becker <joel.becker@oracle.com>2010-04-13 02:30:19 -0400
committerTao Ma <tao.ma@oracle.com>2010-04-13 02:30:19 -0400
commit7d1fe093bf04124dcc50c5dde1765bd098464bfa (patch)
treea86faa1dc041acd214de5ccbc1baf80ea0109449 /fs
parent798db35f4649eac2778381c390ed7d12de9ec767 (diff)
ocfs2: Pass suballocation results back via a structure.
We're going to be adding more info to a suballocator allocation. Rather than growing every function in the chain, let's pass a result structure around. Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Tao Ma <tao.ma@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/ocfs2/suballoc.c165
-rw-r--r--fs/ocfs2/suballoc.h5
2 files changed, 72 insertions, 98 deletions
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c
index 2f753954a7a8..3d823cffc620 100644
--- a/fs/ocfs2/suballoc.c
+++ b/fs/ocfs2/suballoc.c
@@ -53,6 +53,12 @@
53 53
54#define OCFS2_MAX_TO_STEAL 1024 54#define OCFS2_MAX_TO_STEAL 1024
55 55
56struct ocfs2_suballoc_result {
57 u64 sr_bg_blkno; /* The bg we allocated from */
58 unsigned int sr_bit_offset; /* The bit in the bg */
59 unsigned int sr_bits; /* How many bits we claimed */
60};
61
56static inline void ocfs2_debug_bg(struct ocfs2_group_desc *bg); 62static inline void ocfs2_debug_bg(struct ocfs2_group_desc *bg);
57static inline void ocfs2_debug_suballoc_inode(struct ocfs2_dinode *fe); 63static inline void ocfs2_debug_suballoc_inode(struct ocfs2_dinode *fe);
58static inline u16 ocfs2_find_victim_chain(struct ocfs2_chain_list *cl); 64static inline u16 ocfs2_find_victim_chain(struct ocfs2_chain_list *cl);
@@ -74,20 +80,18 @@ static int ocfs2_cluster_group_search(struct inode *inode,
74 struct buffer_head *group_bh, 80 struct buffer_head *group_bh,
75 u32 bits_wanted, u32 min_bits, 81 u32 bits_wanted, u32 min_bits,
76 u64 max_block, 82 u64 max_block,
77 u16 *bit_off, u16 *bits_found); 83 struct ocfs2_suballoc_result *res);
78static int ocfs2_block_group_search(struct inode *inode, 84static int ocfs2_block_group_search(struct inode *inode,
79 struct buffer_head *group_bh, 85 struct buffer_head *group_bh,
80 u32 bits_wanted, u32 min_bits, 86 u32 bits_wanted, u32 min_bits,
81 u64 max_block, 87 u64 max_block,
82 u16 *bit_off, u16 *bits_found); 88 struct ocfs2_suballoc_result *res);
83static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb, 89static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb,
84 struct ocfs2_alloc_context *ac, 90 struct ocfs2_alloc_context *ac,
85 handle_t *handle, 91 handle_t *handle,
86 u32 bits_wanted, 92 u32 bits_wanted,
87 u32 min_bits, 93 u32 min_bits,
88 u16 *bit_off, 94 struct ocfs2_suballoc_result *res);
89 unsigned int *num_bits,
90 u64 *bg_blkno);
91static int ocfs2_test_bg_bit_allocatable(struct buffer_head *bg_bh, 95static int ocfs2_test_bg_bit_allocatable(struct buffer_head *bg_bh,
92 int nr); 96 int nr);
93static inline int ocfs2_block_group_set_bits(handle_t *handle, 97static inline int ocfs2_block_group_set_bits(handle_t *handle,
@@ -1248,8 +1252,7 @@ static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb,
1248 struct buffer_head *bg_bh, 1252 struct buffer_head *bg_bh,
1249 unsigned int bits_wanted, 1253 unsigned int bits_wanted,
1250 unsigned int total_bits, 1254 unsigned int total_bits,
1251 u16 *bit_off, 1255 struct ocfs2_suballoc_result *res)
1252 u16 *bits_found)
1253{ 1256{
1254 void *bitmap; 1257 void *bitmap;
1255 u16 best_offset, best_size; 1258 u16 best_offset, best_size;
@@ -1293,14 +1296,9 @@ static int ocfs2_block_group_find_clear_bits(struct ocfs2_super *osb,
1293 } 1296 }
1294 } 1297 }
1295 1298
1296 /* XXX: I think the first clause is equivalent to the second 1299 if (best_size) {
1297 * - jlbec */ 1300 res->sr_bit_offset = best_offset;
1298 if (found == bits_wanted) { 1301 res->sr_bits = best_size;
1299 *bit_off = start - found;
1300 *bits_found = found;
1301 } else if (best_size) {
1302 *bit_off = best_offset;
1303 *bits_found = best_size;
1304 } else { 1302 } else {
1305 status = -ENOSPC; 1303 status = -ENOSPC;
1306 /* No error log here -- see the comment above 1304 /* No error log here -- see the comment above
@@ -1456,14 +1454,13 @@ static int ocfs2_cluster_group_search(struct inode *inode,
1456 struct buffer_head *group_bh, 1454 struct buffer_head *group_bh,
1457 u32 bits_wanted, u32 min_bits, 1455 u32 bits_wanted, u32 min_bits,
1458 u64 max_block, 1456 u64 max_block,
1459 u16 *bit_off, u16 *bits_found) 1457 struct ocfs2_suballoc_result *res)
1460{ 1458{
1461 int search = -ENOSPC; 1459 int search = -ENOSPC;
1462 int ret; 1460 int ret;
1463 u64 blkoff; 1461 u64 blkoff;
1464 struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *) group_bh->b_data; 1462 struct ocfs2_group_desc *gd = (struct ocfs2_group_desc *) group_bh->b_data;
1465 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); 1463 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
1466 u16 tmp_off, tmp_found;
1467 unsigned int max_bits, gd_cluster_off; 1464 unsigned int max_bits, gd_cluster_off;
1468 1465
1469 BUG_ON(!ocfs2_is_cluster_bitmap(inode)); 1466 BUG_ON(!ocfs2_is_cluster_bitmap(inode));
@@ -1490,15 +1487,15 @@ static int ocfs2_cluster_group_search(struct inode *inode,
1490 1487
1491 ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb), 1488 ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb),
1492 group_bh, bits_wanted, 1489 group_bh, bits_wanted,
1493 max_bits, 1490 max_bits, res);
1494 &tmp_off, &tmp_found);
1495 if (ret) 1491 if (ret)
1496 return ret; 1492 return ret;
1497 1493
1498 if (max_block) { 1494 if (max_block) {
1499 blkoff = ocfs2_clusters_to_blocks(inode->i_sb, 1495 blkoff = ocfs2_clusters_to_blocks(inode->i_sb,
1500 gd_cluster_off + 1496 gd_cluster_off +
1501 tmp_off + tmp_found); 1497 res->sr_bit_offset +
1498 res->sr_bits);
1502 mlog(0, "Checking %llu against %llu\n", 1499 mlog(0, "Checking %llu against %llu\n",
1503 (unsigned long long)blkoff, 1500 (unsigned long long)blkoff,
1504 (unsigned long long)max_block); 1501 (unsigned long long)max_block);
@@ -1510,16 +1507,14 @@ static int ocfs2_cluster_group_search(struct inode *inode,
1510 * return success, but we still want to return 1507 * return success, but we still want to return
1511 * -ENOSPC unless it found the minimum number 1508 * -ENOSPC unless it found the minimum number
1512 * of bits. */ 1509 * of bits. */
1513 if (min_bits <= tmp_found) { 1510 if (min_bits <= res->sr_bits)
1514 *bit_off = tmp_off;
1515 *bits_found = tmp_found;
1516 search = 0; /* success */ 1511 search = 0; /* success */
1517 } else if (tmp_found) { 1512 else if (res->sr_bits) {
1518 /* 1513 /*
1519 * Don't show bits which we'll be returning 1514 * Don't show bits which we'll be returning
1520 * for allocation to the local alloc bitmap. 1515 * for allocation to the local alloc bitmap.
1521 */ 1516 */
1522 ocfs2_local_alloc_seen_free_bits(osb, tmp_found); 1517 ocfs2_local_alloc_seen_free_bits(osb, res->sr_bits);
1523 } 1518 }
1524 } 1519 }
1525 1520
@@ -1530,7 +1525,7 @@ static int ocfs2_block_group_search(struct inode *inode,
1530 struct buffer_head *group_bh, 1525 struct buffer_head *group_bh,
1531 u32 bits_wanted, u32 min_bits, 1526 u32 bits_wanted, u32 min_bits,
1532 u64 max_block, 1527 u64 max_block,
1533 u16 *bit_off, u16 *bits_found) 1528 struct ocfs2_suballoc_result *res)
1534{ 1529{
1535 int ret = -ENOSPC; 1530 int ret = -ENOSPC;
1536 u64 blkoff; 1531 u64 blkoff;
@@ -1543,10 +1538,10 @@ static int ocfs2_block_group_search(struct inode *inode,
1543 ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb), 1538 ret = ocfs2_block_group_find_clear_bits(OCFS2_SB(inode->i_sb),
1544 group_bh, bits_wanted, 1539 group_bh, bits_wanted,
1545 le16_to_cpu(bg->bg_bits), 1540 le16_to_cpu(bg->bg_bits),
1546 bit_off, bits_found); 1541 res);
1547 if (!ret && max_block) { 1542 if (!ret && max_block) {
1548 blkoff = le64_to_cpu(bg->bg_blkno) + *bit_off + 1543 blkoff = le64_to_cpu(bg->bg_blkno) +
1549 *bits_found; 1544 res->sr_bit_offset + res->sr_bits;
1550 mlog(0, "Checking %llu against %llu\n", 1545 mlog(0, "Checking %llu against %llu\n",
1551 (unsigned long long)blkoff, 1546 (unsigned long long)blkoff,
1552 (unsigned long long)max_block); 1547 (unsigned long long)max_block);
@@ -1589,20 +1584,17 @@ static int ocfs2_search_one_group(struct ocfs2_alloc_context *ac,
1589 handle_t *handle, 1584 handle_t *handle,
1590 u32 bits_wanted, 1585 u32 bits_wanted,
1591 u32 min_bits, 1586 u32 min_bits,
1592 u16 *bit_off, 1587 struct ocfs2_suballoc_result *res,
1593 unsigned int *num_bits,
1594 u64 gd_blkno,
1595 u16 *bits_left) 1588 u16 *bits_left)
1596{ 1589{
1597 int ret; 1590 int ret;
1598 u16 found;
1599 struct buffer_head *group_bh = NULL; 1591 struct buffer_head *group_bh = NULL;
1600 struct ocfs2_group_desc *gd; 1592 struct ocfs2_group_desc *gd;
1601 struct ocfs2_dinode *di = (struct ocfs2_dinode *)ac->ac_bh->b_data; 1593 struct ocfs2_dinode *di = (struct ocfs2_dinode *)ac->ac_bh->b_data;
1602 struct inode *alloc_inode = ac->ac_inode; 1594 struct inode *alloc_inode = ac->ac_inode;
1603 1595
1604 ret = ocfs2_read_group_descriptor(alloc_inode, di, gd_blkno, 1596 ret = ocfs2_read_group_descriptor(alloc_inode, di,
1605 &group_bh); 1597 res->sr_bg_blkno, &group_bh);
1606 if (ret < 0) { 1598 if (ret < 0) {
1607 mlog_errno(ret); 1599 mlog_errno(ret);
1608 return ret; 1600 return ret;
@@ -1610,17 +1602,15 @@ static int ocfs2_search_one_group(struct ocfs2_alloc_context *ac,
1610 1602
1611 gd = (struct ocfs2_group_desc *) group_bh->b_data; 1603 gd = (struct ocfs2_group_desc *) group_bh->b_data;
1612 ret = ac->ac_group_search(alloc_inode, group_bh, bits_wanted, min_bits, 1604 ret = ac->ac_group_search(alloc_inode, group_bh, bits_wanted, min_bits,
1613 ac->ac_max_block, bit_off, &found); 1605 ac->ac_max_block, res);
1614 if (ret < 0) { 1606 if (ret < 0) {
1615 if (ret != -ENOSPC) 1607 if (ret != -ENOSPC)
1616 mlog_errno(ret); 1608 mlog_errno(ret);
1617 goto out; 1609 goto out;
1618 } 1610 }
1619 1611
1620 *num_bits = found;
1621
1622 ret = ocfs2_alloc_dinode_update_counts(alloc_inode, handle, ac->ac_bh, 1612 ret = ocfs2_alloc_dinode_update_counts(alloc_inode, handle, ac->ac_bh,
1623 *num_bits, 1613 res->sr_bits,
1624 le16_to_cpu(gd->bg_chain)); 1614 le16_to_cpu(gd->bg_chain));
1625 if (ret < 0) { 1615 if (ret < 0) {
1626 mlog_errno(ret); 1616 mlog_errno(ret);
@@ -1628,7 +1618,7 @@ static int ocfs2_search_one_group(struct ocfs2_alloc_context *ac,
1628 } 1618 }
1629 1619
1630 ret = ocfs2_block_group_set_bits(handle, alloc_inode, gd, group_bh, 1620 ret = ocfs2_block_group_set_bits(handle, alloc_inode, gd, group_bh,
1631 *bit_off, *num_bits); 1621 res->sr_bit_offset, res->sr_bits);
1632 if (ret < 0) 1622 if (ret < 0)
1633 mlog_errno(ret); 1623 mlog_errno(ret);
1634 1624
@@ -1644,13 +1634,11 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac,
1644 handle_t *handle, 1634 handle_t *handle,
1645 u32 bits_wanted, 1635 u32 bits_wanted,
1646 u32 min_bits, 1636 u32 min_bits,
1647 u16 *bit_off, 1637 struct ocfs2_suballoc_result *res,
1648 unsigned int *num_bits,
1649 u64 *bg_blkno,
1650 u16 *bits_left) 1638 u16 *bits_left)
1651{ 1639{
1652 int status; 1640 int status;
1653 u16 chain, tmp_bits; 1641 u16 chain;
1654 u32 tmp_used; 1642 u32 tmp_used;
1655 u64 next_group; 1643 u64 next_group;
1656 struct inode *alloc_inode = ac->ac_inode; 1644 struct inode *alloc_inode = ac->ac_inode;
@@ -1679,8 +1667,8 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac,
1679 * the 1st group with any empty bits. */ 1667 * the 1st group with any empty bits. */
1680 while ((status = ac->ac_group_search(alloc_inode, group_bh, 1668 while ((status = ac->ac_group_search(alloc_inode, group_bh,
1681 bits_wanted, min_bits, 1669 bits_wanted, min_bits,
1682 ac->ac_max_block, bit_off, 1670 ac->ac_max_block,
1683 &tmp_bits)) == -ENOSPC) { 1671 res)) == -ENOSPC) {
1684 if (!bg->bg_next_group) 1672 if (!bg->bg_next_group)
1685 break; 1673 break;
1686 1674
@@ -1705,11 +1693,11 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac,
1705 } 1693 }
1706 1694
1707 mlog(0, "alloc succeeds: we give %u bits from block group %llu\n", 1695 mlog(0, "alloc succeeds: we give %u bits from block group %llu\n",
1708 tmp_bits, (unsigned long long)le64_to_cpu(bg->bg_blkno)); 1696 res->sr_bits, (unsigned long long)le64_to_cpu(bg->bg_blkno));
1709 1697
1710 *num_bits = tmp_bits; 1698 res->sr_bg_blkno = le64_to_cpu(bg->bg_blkno);
1711 1699
1712 BUG_ON(*num_bits == 0); 1700 BUG_ON(res->sr_bits == 0);
1713 1701
1714 /* 1702 /*
1715 * Keep track of previous block descriptor read. When 1703 * Keep track of previous block descriptor read. When
@@ -1726,7 +1714,7 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac,
1726 */ 1714 */
1727 if (ac->ac_allow_chain_relink && 1715 if (ac->ac_allow_chain_relink &&
1728 (prev_group_bh) && 1716 (prev_group_bh) &&
1729 (ocfs2_block_group_reasonably_empty(bg, *num_bits))) { 1717 (ocfs2_block_group_reasonably_empty(bg, res->sr_bits))) {
1730 status = ocfs2_relink_block_group(handle, alloc_inode, 1718 status = ocfs2_relink_block_group(handle, alloc_inode,
1731 ac->ac_bh, group_bh, 1719 ac->ac_bh, group_bh,
1732 prev_group_bh, chain); 1720 prev_group_bh, chain);
@@ -1748,25 +1736,24 @@ static int ocfs2_search_chain(struct ocfs2_alloc_context *ac,
1748 } 1736 }
1749 1737
1750 tmp_used = le32_to_cpu(fe->id1.bitmap1.i_used); 1738 tmp_used = le32_to_cpu(fe->id1.bitmap1.i_used);
1751 fe->id1.bitmap1.i_used = cpu_to_le32(*num_bits + tmp_used); 1739 fe->id1.bitmap1.i_used = cpu_to_le32(res->sr_bits + tmp_used);
1752 le32_add_cpu(&cl->cl_recs[chain].c_free, -(*num_bits)); 1740 le32_add_cpu(&cl->cl_recs[chain].c_free, -res->sr_bits);
1753 ocfs2_journal_dirty(handle, ac->ac_bh); 1741 ocfs2_journal_dirty(handle, ac->ac_bh);
1754 1742
1755 status = ocfs2_block_group_set_bits(handle, 1743 status = ocfs2_block_group_set_bits(handle,
1756 alloc_inode, 1744 alloc_inode,
1757 bg, 1745 bg,
1758 group_bh, 1746 group_bh,
1759 *bit_off, 1747 res->sr_bit_offset,
1760 *num_bits); 1748 res->sr_bits);
1761 if (status < 0) { 1749 if (status < 0) {
1762 mlog_errno(status); 1750 mlog_errno(status);
1763 goto bail; 1751 goto bail;
1764 } 1752 }
1765 1753
1766 mlog(0, "Allocated %u bits from suballocator %llu\n", *num_bits, 1754 mlog(0, "Allocated %u bits from suballocator %llu\n", res->sr_bits,
1767 (unsigned long long)le64_to_cpu(fe->i_blkno)); 1755 (unsigned long long)le64_to_cpu(fe->i_blkno));
1768 1756
1769 *bg_blkno = le64_to_cpu(bg->bg_blkno);
1770 *bits_left = le16_to_cpu(bg->bg_free_bits_count); 1757 *bits_left = le16_to_cpu(bg->bg_free_bits_count);
1771bail: 1758bail:
1772 brelse(group_bh); 1759 brelse(group_bh);
@@ -1782,14 +1769,11 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb,
1782 handle_t *handle, 1769 handle_t *handle,
1783 u32 bits_wanted, 1770 u32 bits_wanted,
1784 u32 min_bits, 1771 u32 min_bits,
1785 u16 *bit_off, 1772 struct ocfs2_suballoc_result *res)
1786 unsigned int *num_bits,
1787 u64 *bg_blkno)
1788{ 1773{
1789 int status; 1774 int status;
1790 u16 victim, i; 1775 u16 victim, i;
1791 u16 bits_left = 0; 1776 u16 bits_left = 0;
1792 u64 hint_blkno = ac->ac_last_group;
1793 struct ocfs2_chain_list *cl; 1777 struct ocfs2_chain_list *cl;
1794 struct ocfs2_dinode *fe; 1778 struct ocfs2_dinode *fe;
1795 1779
@@ -1816,22 +1800,16 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb,
1816 goto bail; 1800 goto bail;
1817 } 1801 }
1818 1802
1819 if (hint_blkno) { 1803 res->sr_bg_blkno = ac->ac_last_group;
1804 if (res->sr_bg_blkno) {
1820 /* Attempt to short-circuit the usual search mechanism 1805 /* Attempt to short-circuit the usual search mechanism
1821 * by jumping straight to the most recently used 1806 * by jumping straight to the most recently used
1822 * allocation group. This helps us mantain some 1807 * allocation group. This helps us mantain some
1823 * contiguousness across allocations. */ 1808 * contiguousness across allocations. */
1824 status = ocfs2_search_one_group(ac, handle, bits_wanted, 1809 status = ocfs2_search_one_group(ac, handle, bits_wanted,
1825 min_bits, bit_off, num_bits, 1810 min_bits, res, &bits_left);
1826 hint_blkno, &bits_left); 1811 if (!status)
1827 if (!status) {
1828 /* Be careful to update *bg_blkno here as the
1829 * caller is expecting it to be filled in, and
1830 * ocfs2_search_one_group() won't do that for
1831 * us. */
1832 *bg_blkno = hint_blkno;
1833 goto set_hint; 1812 goto set_hint;
1834 }
1835 if (status < 0 && status != -ENOSPC) { 1813 if (status < 0 && status != -ENOSPC) {
1836 mlog_errno(status); 1814 mlog_errno(status);
1837 goto bail; 1815 goto bail;
@@ -1844,8 +1822,8 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb,
1844 ac->ac_chain = victim; 1822 ac->ac_chain = victim;
1845 ac->ac_allow_chain_relink = 1; 1823 ac->ac_allow_chain_relink = 1;
1846 1824
1847 status = ocfs2_search_chain(ac, handle, bits_wanted, min_bits, bit_off, 1825 status = ocfs2_search_chain(ac, handle, bits_wanted, min_bits,
1848 num_bits, bg_blkno, &bits_left); 1826 res, &bits_left);
1849 if (!status) 1827 if (!status)
1850 goto set_hint; 1828 goto set_hint;
1851 if (status < 0 && status != -ENOSPC) { 1829 if (status < 0 && status != -ENOSPC) {
@@ -1869,8 +1847,7 @@ static int ocfs2_claim_suballoc_bits(struct ocfs2_super *osb,
1869 1847
1870 ac->ac_chain = i; 1848 ac->ac_chain = i;
1871 status = ocfs2_search_chain(ac, handle, bits_wanted, min_bits, 1849 status = ocfs2_search_chain(ac, handle, bits_wanted, min_bits,
1872 bit_off, num_bits, bg_blkno, 1850 res, &bits_left);
1873 &bits_left);
1874 if (!status) 1851 if (!status)
1875 break; 1852 break;
1876 if (status < 0 && status != -ENOSPC) { 1853 if (status < 0 && status != -ENOSPC) {
@@ -1887,7 +1864,7 @@ set_hint:
1887 if (bits_left < min_bits) 1864 if (bits_left < min_bits)
1888 ac->ac_last_group = 0; 1865 ac->ac_last_group = 0;
1889 else 1866 else
1890 ac->ac_last_group = *bg_blkno; 1867 ac->ac_last_group = res->sr_bg_blkno;
1891 } 1868 }
1892 1869
1893bail: 1870bail:
@@ -1904,7 +1881,7 @@ int ocfs2_claim_metadata(struct ocfs2_super *osb,
1904 u64 *blkno_start) 1881 u64 *blkno_start)
1905{ 1882{
1906 int status; 1883 int status;
1907 u64 bg_blkno; 1884 struct ocfs2_suballoc_result res;
1908 1885
1909 BUG_ON(!ac); 1886 BUG_ON(!ac);
1910 BUG_ON(ac->ac_bits_wanted < (ac->ac_bits_given + bits_wanted)); 1887 BUG_ON(ac->ac_bits_wanted < (ac->ac_bits_given + bits_wanted));
@@ -1915,17 +1892,17 @@ int ocfs2_claim_metadata(struct ocfs2_super *osb,
1915 handle, 1892 handle,
1916 bits_wanted, 1893 bits_wanted,
1917 1, 1894 1,
1918 suballoc_bit_start, 1895 &res);
1919 num_bits,
1920 &bg_blkno);
1921 if (status < 0) { 1896 if (status < 0) {
1922 mlog_errno(status); 1897 mlog_errno(status);
1923 goto bail; 1898 goto bail;
1924 } 1899 }
1925 atomic_inc(&osb->alloc_stats.bg_allocs); 1900 atomic_inc(&osb->alloc_stats.bg_allocs);
1926 1901
1927 *blkno_start = bg_blkno + (u64) *suballoc_bit_start; 1902 *suballoc_bit_start = res.sr_bit_offset;
1928 ac->ac_bits_given += (*num_bits); 1903 *blkno_start = res.sr_bg_blkno + (u64)(res.sr_bit_offset);
1904 ac->ac_bits_given += res.sr_bits;
1905 *num_bits = res.sr_bits;
1929 status = 0; 1906 status = 0;
1930bail: 1907bail:
1931 mlog_exit(status); 1908 mlog_exit(status);
@@ -1972,8 +1949,7 @@ int ocfs2_claim_new_inode(struct ocfs2_super *osb,
1972 u64 *fe_blkno) 1949 u64 *fe_blkno)
1973{ 1950{
1974 int status; 1951 int status;
1975 unsigned int num_bits; 1952 struct ocfs2_suballoc_result res;
1976 u64 bg_blkno;
1977 1953
1978 mlog_entry_void(); 1954 mlog_entry_void();
1979 1955
@@ -1989,18 +1965,17 @@ int ocfs2_claim_new_inode(struct ocfs2_super *osb,
1989 handle, 1965 handle,
1990 1, 1966 1,
1991 1, 1967 1,
1992 suballoc_bit, 1968 &res);
1993 &num_bits,
1994 &bg_blkno);
1995 if (status < 0) { 1969 if (status < 0) {
1996 mlog_errno(status); 1970 mlog_errno(status);
1997 goto bail; 1971 goto bail;
1998 } 1972 }
1999 atomic_inc(&osb->alloc_stats.bg_allocs); 1973 atomic_inc(&osb->alloc_stats.bg_allocs);
2000 1974
2001 BUG_ON(num_bits != 1); 1975 BUG_ON(res.sr_bits != 1);
2002 1976
2003 *fe_blkno = bg_blkno + (u64) (*suballoc_bit); 1977 *suballoc_bit = res.sr_bit_offset;
1978 *fe_blkno = res.sr_bg_blkno + (u64)(res.sr_bit_offset);
2004 ac->ac_bits_given++; 1979 ac->ac_bits_given++;
2005 ocfs2_save_inode_ac_group(dir, ac); 1980 ocfs2_save_inode_ac_group(dir, ac);
2006 status = 0; 1981 status = 0;
@@ -2080,8 +2055,7 @@ int __ocfs2_claim_clusters(struct ocfs2_super *osb,
2080{ 2055{
2081 int status; 2056 int status;
2082 unsigned int bits_wanted = max_clusters; 2057 unsigned int bits_wanted = max_clusters;
2083 u64 bg_blkno = 0; 2058 struct ocfs2_suballoc_result res;
2084 u16 bg_bit_off;
2085 2059
2086 mlog_entry_void(); 2060 mlog_entry_void();
2087 2061
@@ -2120,14 +2094,12 @@ int __ocfs2_claim_clusters(struct ocfs2_super *osb,
2120 handle, 2094 handle,
2121 bits_wanted, 2095 bits_wanted,
2122 min_clusters, 2096 min_clusters,
2123 &bg_bit_off, 2097 &res);
2124 num_clusters,
2125 &bg_blkno);
2126 if (!status) { 2098 if (!status) {
2127 *cluster_start = 2099 *cluster_start =
2128 ocfs2_desc_bitmap_to_cluster_off(ac->ac_inode, 2100 ocfs2_desc_bitmap_to_cluster_off(ac->ac_inode,
2129 bg_blkno, 2101 res.sr_bg_blkno,
2130 bg_bit_off); 2102 res.sr_bit_offset);
2131 atomic_inc(&osb->alloc_stats.bitmap_data); 2103 atomic_inc(&osb->alloc_stats.bitmap_data);
2132 } 2104 }
2133 } 2105 }
@@ -2137,7 +2109,8 @@ int __ocfs2_claim_clusters(struct ocfs2_super *osb,
2137 goto bail; 2109 goto bail;
2138 } 2110 }
2139 2111
2140 ac->ac_bits_given += *num_clusters; 2112 ac->ac_bits_given += res.sr_bits;
2113 *num_clusters = res.sr_bits;
2141 2114
2142bail: 2115bail:
2143 mlog_exit(status); 2116 mlog_exit(status);
diff --git a/fs/ocfs2/suballoc.h b/fs/ocfs2/suballoc.h
index da2f29a55ec3..f5a22cd1640f 100644
--- a/fs/ocfs2/suballoc.h
+++ b/fs/ocfs2/suballoc.h
@@ -26,13 +26,14 @@
26#ifndef _CHAINALLOC_H_ 26#ifndef _CHAINALLOC_H_
27#define _CHAINALLOC_H_ 27#define _CHAINALLOC_H_
28 28
29struct ocfs2_suballoc_result;
29typedef int (group_search_t)(struct inode *, 30typedef int (group_search_t)(struct inode *,
30 struct buffer_head *, 31 struct buffer_head *,
31 u32, /* bits_wanted */ 32 u32, /* bits_wanted */
32 u32, /* min_bits */ 33 u32, /* min_bits */
33 u64, /* max_block */ 34 u64, /* max_block */
34 u16 *, /* *bit_off */ 35 struct ocfs2_suballoc_result *);
35 u16 *); /* *bits_found */ 36 /* found bits */
36 37
37struct ocfs2_alloc_context { 38struct ocfs2_alloc_context {
38 struct inode *ac_inode; /* which bitmap are we allocating from? */ 39 struct inode *ac_inode; /* which bitmap are we allocating from? */