diff options
Diffstat (limited to 'fs/ext4/balloc.c')
| -rw-r--r-- | fs/ext4/balloc.c | 209 |
1 files changed, 150 insertions, 59 deletions
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index 9cc80b9cc8d8..495ab21b9832 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c | |||
| @@ -47,7 +47,7 @@ static int ext4_block_in_group(struct super_block *sb, ext4_fsblk_t block, | |||
| 47 | ext4_group_t block_group) | 47 | ext4_group_t block_group) |
| 48 | { | 48 | { |
| 49 | ext4_group_t actual_group; | 49 | ext4_group_t actual_group; |
| 50 | ext4_get_group_no_and_offset(sb, block, &actual_group, 0); | 50 | ext4_get_group_no_and_offset(sb, block, &actual_group, NULL); |
| 51 | if (actual_group == block_group) | 51 | if (actual_group == block_group) |
| 52 | return 1; | 52 | return 1; |
| 53 | return 0; | 53 | return 0; |
| @@ -121,12 +121,7 @@ unsigned ext4_init_block_bitmap(struct super_block *sb, struct buffer_head *bh, | |||
| 121 | le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks); | 121 | le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks); |
| 122 | } | 122 | } |
| 123 | } else { /* For META_BG_BLOCK_GROUPS */ | 123 | } else { /* For META_BG_BLOCK_GROUPS */ |
| 124 | int group_rel = (block_group - | 124 | bit_max += ext4_bg_num_gdb(sb, block_group); |
| 125 | le32_to_cpu(sbi->s_es->s_first_meta_bg)) % | ||
| 126 | EXT4_DESC_PER_BLOCK(sb); | ||
| 127 | if (group_rel == 0 || group_rel == 1 || | ||
| 128 | (group_rel == EXT4_DESC_PER_BLOCK(sb) - 1)) | ||
| 129 | bit_max += 1; | ||
| 130 | } | 125 | } |
| 131 | 126 | ||
| 132 | if (block_group == sbi->s_groups_count - 1) { | 127 | if (block_group == sbi->s_groups_count - 1) { |
| @@ -295,7 +290,7 @@ err_out: | |||
| 295 | return 0; | 290 | return 0; |
| 296 | } | 291 | } |
| 297 | /** | 292 | /** |
| 298 | * read_block_bitmap() | 293 | * ext4_read_block_bitmap() |
| 299 | * @sb: super block | 294 | * @sb: super block |
| 300 | * @block_group: given block group | 295 | * @block_group: given block group |
| 301 | * | 296 | * |
| @@ -305,7 +300,7 @@ err_out: | |||
| 305 | * Return buffer_head on success or NULL in case of failure. | 300 | * Return buffer_head on success or NULL in case of failure. |
| 306 | */ | 301 | */ |
| 307 | struct buffer_head * | 302 | struct buffer_head * |
| 308 | read_block_bitmap(struct super_block *sb, ext4_group_t block_group) | 303 | ext4_read_block_bitmap(struct super_block *sb, ext4_group_t block_group) |
| 309 | { | 304 | { |
| 310 | struct ext4_group_desc * desc; | 305 | struct ext4_group_desc * desc; |
| 311 | struct buffer_head * bh = NULL; | 306 | struct buffer_head * bh = NULL; |
| @@ -409,8 +404,7 @@ restart: | |||
| 409 | prev = rsv; | 404 | prev = rsv; |
| 410 | } | 405 | } |
| 411 | printk("Window map complete.\n"); | 406 | printk("Window map complete.\n"); |
| 412 | if (bad) | 407 | BUG_ON(bad); |
| 413 | BUG(); | ||
| 414 | } | 408 | } |
| 415 | #define rsv_window_dump(root, verbose) \ | 409 | #define rsv_window_dump(root, verbose) \ |
| 416 | __rsv_window_dump((root), (verbose), __func__) | 410 | __rsv_window_dump((root), (verbose), __func__) |
| @@ -694,7 +688,7 @@ do_more: | |||
| 694 | count -= overflow; | 688 | count -= overflow; |
| 695 | } | 689 | } |
| 696 | brelse(bitmap_bh); | 690 | brelse(bitmap_bh); |
| 697 | bitmap_bh = read_block_bitmap(sb, block_group); | 691 | bitmap_bh = ext4_read_block_bitmap(sb, block_group); |
| 698 | if (!bitmap_bh) | 692 | if (!bitmap_bh) |
| 699 | goto error_return; | 693 | goto error_return; |
| 700 | desc = ext4_get_group_desc (sb, block_group, &gd_bh); | 694 | desc = ext4_get_group_desc (sb, block_group, &gd_bh); |
| @@ -810,6 +804,13 @@ do_more: | |||
| 810 | spin_unlock(sb_bgl_lock(sbi, block_group)); | 804 | spin_unlock(sb_bgl_lock(sbi, block_group)); |
| 811 | percpu_counter_add(&sbi->s_freeblocks_counter, count); | 805 | percpu_counter_add(&sbi->s_freeblocks_counter, count); |
| 812 | 806 | ||
| 807 | if (sbi->s_log_groups_per_flex) { | ||
| 808 | ext4_group_t flex_group = ext4_flex_group(sbi, block_group); | ||
| 809 | spin_lock(sb_bgl_lock(sbi, flex_group)); | ||
| 810 | sbi->s_flex_groups[flex_group].free_blocks += count; | ||
| 811 | spin_unlock(sb_bgl_lock(sbi, flex_group)); | ||
| 812 | } | ||
| 813 | |||
| 813 | /* We dirtied the bitmap block */ | 814 | /* We dirtied the bitmap block */ |
| 814 | BUFFER_TRACE(bitmap_bh, "dirtied bitmap block"); | 815 | BUFFER_TRACE(bitmap_bh, "dirtied bitmap block"); |
| 815 | err = ext4_journal_dirty_metadata(handle, bitmap_bh); | 816 | err = ext4_journal_dirty_metadata(handle, bitmap_bh); |
| @@ -1598,23 +1599,35 @@ out: | |||
| 1598 | 1599 | ||
| 1599 | /** | 1600 | /** |
| 1600 | * ext4_has_free_blocks() | 1601 | * ext4_has_free_blocks() |
| 1601 | * @sbi: in-core super block structure. | 1602 | * @sbi: in-core super block structure. |
| 1603 | * @nblocks: number of neeed blocks | ||
| 1602 | * | 1604 | * |
| 1603 | * Check if filesystem has at least 1 free block available for allocation. | 1605 | * Check if filesystem has free blocks available for allocation. |
| 1606 | * Return the number of blocks avaible for allocation for this request | ||
| 1607 | * On success, return nblocks | ||
| 1604 | */ | 1608 | */ |
| 1605 | static int ext4_has_free_blocks(struct ext4_sb_info *sbi) | 1609 | ext4_fsblk_t ext4_has_free_blocks(struct ext4_sb_info *sbi, |
| 1610 | ext4_fsblk_t nblocks) | ||
| 1606 | { | 1611 | { |
| 1607 | ext4_fsblk_t free_blocks, root_blocks; | 1612 | ext4_fsblk_t free_blocks; |
| 1613 | ext4_fsblk_t root_blocks = 0; | ||
| 1608 | 1614 | ||
| 1609 | free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); | 1615 | free_blocks = percpu_counter_read_positive(&sbi->s_freeblocks_counter); |
| 1610 | root_blocks = ext4_r_blocks_count(sbi->s_es); | 1616 | |
| 1611 | if (free_blocks < root_blocks + 1 && !capable(CAP_SYS_RESOURCE) && | 1617 | if (!capable(CAP_SYS_RESOURCE) && |
| 1612 | sbi->s_resuid != current->fsuid && | 1618 | sbi->s_resuid != current->fsuid && |
| 1613 | (sbi->s_resgid == 0 || !in_group_p (sbi->s_resgid))) { | 1619 | (sbi->s_resgid == 0 || !in_group_p(sbi->s_resgid))) |
| 1614 | return 0; | 1620 | root_blocks = ext4_r_blocks_count(sbi->s_es); |
| 1615 | } | 1621 | #ifdef CONFIG_SMP |
| 1616 | return 1; | 1622 | if (free_blocks - root_blocks < FBC_BATCH) |
| 1617 | } | 1623 | free_blocks = |
| 1624 | percpu_counter_sum_and_set(&sbi->s_freeblocks_counter); | ||
| 1625 | #endif | ||
| 1626 | if (free_blocks - root_blocks < nblocks) | ||
| 1627 | return free_blocks - root_blocks; | ||
| 1628 | return nblocks; | ||
| 1629 | } | ||
| 1630 | |||
| 1618 | 1631 | ||
| 1619 | /** | 1632 | /** |
| 1620 | * ext4_should_retry_alloc() | 1633 | * ext4_should_retry_alloc() |
| @@ -1630,7 +1643,7 @@ static int ext4_has_free_blocks(struct ext4_sb_info *sbi) | |||
| 1630 | */ | 1643 | */ |
| 1631 | int ext4_should_retry_alloc(struct super_block *sb, int *retries) | 1644 | int ext4_should_retry_alloc(struct super_block *sb, int *retries) |
| 1632 | { | 1645 | { |
| 1633 | if (!ext4_has_free_blocks(EXT4_SB(sb)) || (*retries)++ > 3) | 1646 | if (!ext4_has_free_blocks(EXT4_SB(sb), 1) || (*retries)++ > 3) |
| 1634 | return 0; | 1647 | return 0; |
| 1635 | 1648 | ||
| 1636 | jbd_debug(1, "%s: retrying operation after ENOSPC\n", sb->s_id); | 1649 | jbd_debug(1, "%s: retrying operation after ENOSPC\n", sb->s_id); |
| @@ -1639,20 +1652,24 @@ int ext4_should_retry_alloc(struct super_block *sb, int *retries) | |||
| 1639 | } | 1652 | } |
| 1640 | 1653 | ||
| 1641 | /** | 1654 | /** |
| 1642 | * ext4_new_blocks_old() -- core block(s) allocation function | 1655 | * ext4_old_new_blocks() -- core block bitmap based block allocation function |
| 1656 | * | ||
| 1643 | * @handle: handle to this transaction | 1657 | * @handle: handle to this transaction |
| 1644 | * @inode: file inode | 1658 | * @inode: file inode |
| 1645 | * @goal: given target block(filesystem wide) | 1659 | * @goal: given target block(filesystem wide) |
| 1646 | * @count: target number of blocks to allocate | 1660 | * @count: target number of blocks to allocate |
| 1647 | * @errp: error code | 1661 | * @errp: error code |
| 1648 | * | 1662 | * |
| 1649 | * ext4_new_blocks uses a goal block to assist allocation. It tries to | 1663 | * ext4_old_new_blocks uses a goal block to assist allocation and look up |
| 1650 | * allocate block(s) from the block group contains the goal block first. If that | 1664 | * the block bitmap directly to do block allocation. It tries to |
| 1651 | * fails, it will try to allocate block(s) from other block groups without | 1665 | * allocate block(s) from the block group contains the goal block first. If |
| 1652 | * any specific goal block. | 1666 | * that fails, it will try to allocate block(s) from other block groups |
| 1667 | * without any specific goal block. | ||
| 1668 | * | ||
| 1669 | * This function is called when -o nomballoc mount option is enabled | ||
| 1653 | * | 1670 | * |
| 1654 | */ | 1671 | */ |
| 1655 | ext4_fsblk_t ext4_new_blocks_old(handle_t *handle, struct inode *inode, | 1672 | ext4_fsblk_t ext4_old_new_blocks(handle_t *handle, struct inode *inode, |
| 1656 | ext4_fsblk_t goal, unsigned long *count, int *errp) | 1673 | ext4_fsblk_t goal, unsigned long *count, int *errp) |
| 1657 | { | 1674 | { |
| 1658 | struct buffer_head *bitmap_bh = NULL; | 1675 | struct buffer_head *bitmap_bh = NULL; |
| @@ -1676,13 +1693,26 @@ ext4_fsblk_t ext4_new_blocks_old(handle_t *handle, struct inode *inode, | |||
| 1676 | ext4_group_t ngroups; | 1693 | ext4_group_t ngroups; |
| 1677 | unsigned long num = *count; | 1694 | unsigned long num = *count; |
| 1678 | 1695 | ||
| 1679 | *errp = -ENOSPC; | ||
| 1680 | sb = inode->i_sb; | 1696 | sb = inode->i_sb; |
| 1681 | if (!sb) { | 1697 | if (!sb) { |
| 1698 | *errp = -ENODEV; | ||
| 1682 | printk("ext4_new_block: nonexistent device"); | 1699 | printk("ext4_new_block: nonexistent device"); |
| 1683 | return 0; | 1700 | return 0; |
| 1684 | } | 1701 | } |
| 1685 | 1702 | ||
| 1703 | sbi = EXT4_SB(sb); | ||
| 1704 | if (!EXT4_I(inode)->i_delalloc_reserved_flag) { | ||
| 1705 | /* | ||
| 1706 | * With delalloc we already reserved the blocks | ||
| 1707 | */ | ||
| 1708 | *count = ext4_has_free_blocks(sbi, *count); | ||
| 1709 | } | ||
| 1710 | if (*count == 0) { | ||
| 1711 | *errp = -ENOSPC; | ||
| 1712 | return 0; /*return with ENOSPC error */ | ||
| 1713 | } | ||
| 1714 | num = *count; | ||
| 1715 | |||
| 1686 | /* | 1716 | /* |
| 1687 | * Check quota for allocation of this block. | 1717 | * Check quota for allocation of this block. |
| 1688 | */ | 1718 | */ |
| @@ -1706,11 +1736,6 @@ ext4_fsblk_t ext4_new_blocks_old(handle_t *handle, struct inode *inode, | |||
| 1706 | if (block_i && ((windowsz = block_i->rsv_window_node.rsv_goal_size) > 0)) | 1736 | if (block_i && ((windowsz = block_i->rsv_window_node.rsv_goal_size) > 0)) |
| 1707 | my_rsv = &block_i->rsv_window_node; | 1737 | my_rsv = &block_i->rsv_window_node; |
| 1708 | 1738 | ||
| 1709 | if (!ext4_has_free_blocks(sbi)) { | ||
| 1710 | *errp = -ENOSPC; | ||
| 1711 | goto out; | ||
| 1712 | } | ||
| 1713 | |||
| 1714 | /* | 1739 | /* |
| 1715 | * First, test whether the goal block is free. | 1740 | * First, test whether the goal block is free. |
| 1716 | */ | 1741 | */ |
| @@ -1734,7 +1759,7 @@ retry_alloc: | |||
| 1734 | my_rsv = NULL; | 1759 | my_rsv = NULL; |
| 1735 | 1760 | ||
| 1736 | if (free_blocks > 0) { | 1761 | if (free_blocks > 0) { |
| 1737 | bitmap_bh = read_block_bitmap(sb, group_no); | 1762 | bitmap_bh = ext4_read_block_bitmap(sb, group_no); |
| 1738 | if (!bitmap_bh) | 1763 | if (!bitmap_bh) |
| 1739 | goto io_error; | 1764 | goto io_error; |
| 1740 | grp_alloc_blk = ext4_try_to_allocate_with_rsv(sb, handle, | 1765 | grp_alloc_blk = ext4_try_to_allocate_with_rsv(sb, handle, |
| @@ -1770,7 +1795,7 @@ retry_alloc: | |||
| 1770 | continue; | 1795 | continue; |
| 1771 | 1796 | ||
| 1772 | brelse(bitmap_bh); | 1797 | brelse(bitmap_bh); |
| 1773 | bitmap_bh = read_block_bitmap(sb, group_no); | 1798 | bitmap_bh = ext4_read_block_bitmap(sb, group_no); |
| 1774 | if (!bitmap_bh) | 1799 | if (!bitmap_bh) |
| 1775 | goto io_error; | 1800 | goto io_error; |
| 1776 | /* | 1801 | /* |
| @@ -1882,7 +1907,15 @@ allocated: | |||
| 1882 | le16_add_cpu(&gdp->bg_free_blocks_count, -num); | 1907 | le16_add_cpu(&gdp->bg_free_blocks_count, -num); |
| 1883 | gdp->bg_checksum = ext4_group_desc_csum(sbi, group_no, gdp); | 1908 | gdp->bg_checksum = ext4_group_desc_csum(sbi, group_no, gdp); |
| 1884 | spin_unlock(sb_bgl_lock(sbi, group_no)); | 1909 | spin_unlock(sb_bgl_lock(sbi, group_no)); |
| 1885 | percpu_counter_sub(&sbi->s_freeblocks_counter, num); | 1910 | if (!EXT4_I(inode)->i_delalloc_reserved_flag) |
| 1911 | percpu_counter_sub(&sbi->s_freeblocks_counter, num); | ||
| 1912 | |||
| 1913 | if (sbi->s_log_groups_per_flex) { | ||
| 1914 | ext4_group_t flex_group = ext4_flex_group(sbi, group_no); | ||
| 1915 | spin_lock(sb_bgl_lock(sbi, flex_group)); | ||
| 1916 | sbi->s_flex_groups[flex_group].free_blocks -= num; | ||
| 1917 | spin_unlock(sb_bgl_lock(sbi, flex_group)); | ||
| 1918 | } | ||
| 1886 | 1919 | ||
| 1887 | BUFFER_TRACE(gdp_bh, "journal_dirty_metadata for group descriptor"); | 1920 | BUFFER_TRACE(gdp_bh, "journal_dirty_metadata for group descriptor"); |
| 1888 | err = ext4_journal_dirty_metadata(handle, gdp_bh); | 1921 | err = ext4_journal_dirty_metadata(handle, gdp_bh); |
| @@ -1915,46 +1948,104 @@ out: | |||
| 1915 | return 0; | 1948 | return 0; |
| 1916 | } | 1949 | } |
| 1917 | 1950 | ||
| 1918 | ext4_fsblk_t ext4_new_block(handle_t *handle, struct inode *inode, | 1951 | #define EXT4_META_BLOCK 0x1 |
| 1919 | ext4_fsblk_t goal, int *errp) | 1952 | |
| 1953 | static ext4_fsblk_t do_blk_alloc(handle_t *handle, struct inode *inode, | ||
| 1954 | ext4_lblk_t iblock, ext4_fsblk_t goal, | ||
| 1955 | unsigned long *count, int *errp, int flags) | ||
| 1920 | { | 1956 | { |
| 1921 | struct ext4_allocation_request ar; | 1957 | struct ext4_allocation_request ar; |
| 1922 | ext4_fsblk_t ret; | 1958 | ext4_fsblk_t ret; |
| 1923 | 1959 | ||
| 1924 | if (!test_opt(inode->i_sb, MBALLOC)) { | 1960 | if (!test_opt(inode->i_sb, MBALLOC)) { |
| 1925 | unsigned long count = 1; | 1961 | return ext4_old_new_blocks(handle, inode, goal, count, errp); |
| 1926 | ret = ext4_new_blocks_old(handle, inode, goal, &count, errp); | ||
| 1927 | return ret; | ||
| 1928 | } | 1962 | } |
| 1929 | 1963 | ||
| 1930 | memset(&ar, 0, sizeof(ar)); | 1964 | memset(&ar, 0, sizeof(ar)); |
| 1965 | /* Fill with neighbour allocated blocks */ | ||
| 1966 | |||
| 1931 | ar.inode = inode; | 1967 | ar.inode = inode; |
| 1932 | ar.goal = goal; | 1968 | ar.goal = goal; |
| 1933 | ar.len = 1; | 1969 | ar.len = *count; |
| 1970 | ar.logical = iblock; | ||
| 1971 | |||
| 1972 | if (S_ISREG(inode->i_mode) && !(flags & EXT4_META_BLOCK)) | ||
| 1973 | /* enable in-core preallocation for data block allocation */ | ||
| 1974 | ar.flags = EXT4_MB_HINT_DATA; | ||
| 1975 | else | ||
| 1976 | /* disable in-core preallocation for non-regular files */ | ||
| 1977 | ar.flags = 0; | ||
| 1978 | |||
| 1934 | ret = ext4_mb_new_blocks(handle, &ar, errp); | 1979 | ret = ext4_mb_new_blocks(handle, &ar, errp); |
| 1980 | *count = ar.len; | ||
| 1935 | return ret; | 1981 | return ret; |
| 1936 | } | 1982 | } |
| 1937 | 1983 | ||
| 1938 | ext4_fsblk_t ext4_new_blocks(handle_t *handle, struct inode *inode, | 1984 | /* |
| 1985 | * ext4_new_meta_blocks() -- allocate block for meta data (indexing) blocks | ||
| 1986 | * | ||
| 1987 | * @handle: handle to this transaction | ||
| 1988 | * @inode: file inode | ||
| 1989 | * @goal: given target block(filesystem wide) | ||
| 1990 | * @count: total number of blocks need | ||
| 1991 | * @errp: error code | ||
| 1992 | * | ||
| 1993 | * Return 1st allocated block numberon success, *count stores total account | ||
| 1994 | * error stores in errp pointer | ||
| 1995 | */ | ||
| 1996 | ext4_fsblk_t ext4_new_meta_blocks(handle_t *handle, struct inode *inode, | ||
| 1939 | ext4_fsblk_t goal, unsigned long *count, int *errp) | 1997 | ext4_fsblk_t goal, unsigned long *count, int *errp) |
| 1940 | { | 1998 | { |
| 1941 | struct ext4_allocation_request ar; | ||
| 1942 | ext4_fsblk_t ret; | 1999 | ext4_fsblk_t ret; |
| 1943 | 2000 | ret = do_blk_alloc(handle, inode, 0, goal, | |
| 1944 | if (!test_opt(inode->i_sb, MBALLOC)) { | 2001 | count, errp, EXT4_META_BLOCK); |
| 1945 | ret = ext4_new_blocks_old(handle, inode, goal, count, errp); | 2002 | /* |
| 1946 | return ret; | 2003 | * Account for the allocated meta blocks |
| 2004 | */ | ||
| 2005 | if (!(*errp)) { | ||
| 2006 | spin_lock(&EXT4_I(inode)->i_block_reservation_lock); | ||
| 2007 | EXT4_I(inode)->i_allocated_meta_blocks += *count; | ||
| 2008 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); | ||
| 1947 | } | 2009 | } |
| 1948 | |||
| 1949 | memset(&ar, 0, sizeof(ar)); | ||
| 1950 | ar.inode = inode; | ||
| 1951 | ar.goal = goal; | ||
| 1952 | ar.len = *count; | ||
| 1953 | ret = ext4_mb_new_blocks(handle, &ar, errp); | ||
| 1954 | *count = ar.len; | ||
| 1955 | return ret; | 2010 | return ret; |
| 1956 | } | 2011 | } |
| 1957 | 2012 | ||
| 2013 | /* | ||
| 2014 | * ext4_new_meta_block() -- allocate block for meta data (indexing) blocks | ||
| 2015 | * | ||
| 2016 | * @handle: handle to this transaction | ||
| 2017 | * @inode: file inode | ||
| 2018 | * @goal: given target block(filesystem wide) | ||
| 2019 | * @errp: error code | ||
| 2020 | * | ||
| 2021 | * Return allocated block number on success | ||
| 2022 | */ | ||
| 2023 | ext4_fsblk_t ext4_new_meta_block(handle_t *handle, struct inode *inode, | ||
| 2024 | ext4_fsblk_t goal, int *errp) | ||
| 2025 | { | ||
| 2026 | unsigned long count = 1; | ||
| 2027 | return ext4_new_meta_blocks(handle, inode, goal, &count, errp); | ||
| 2028 | } | ||
| 2029 | |||
| 2030 | /* | ||
| 2031 | * ext4_new_blocks() -- allocate data blocks | ||
| 2032 | * | ||
| 2033 | * @handle: handle to this transaction | ||
| 2034 | * @inode: file inode | ||
| 2035 | * @goal: given target block(filesystem wide) | ||
| 2036 | * @count: total number of blocks need | ||
| 2037 | * @errp: error code | ||
| 2038 | * | ||
| 2039 | * Return 1st allocated block numberon success, *count stores total account | ||
| 2040 | * error stores in errp pointer | ||
| 2041 | */ | ||
| 2042 | |||
| 2043 | ext4_fsblk_t ext4_new_blocks(handle_t *handle, struct inode *inode, | ||
| 2044 | ext4_lblk_t iblock, ext4_fsblk_t goal, | ||
| 2045 | unsigned long *count, int *errp) | ||
| 2046 | { | ||
| 2047 | return do_blk_alloc(handle, inode, iblock, goal, count, errp, 0); | ||
| 2048 | } | ||
| 1958 | 2049 | ||
| 1959 | /** | 2050 | /** |
| 1960 | * ext4_count_free_blocks() -- count filesystem free blocks | 2051 | * ext4_count_free_blocks() -- count filesystem free blocks |
| @@ -1986,7 +2077,7 @@ ext4_fsblk_t ext4_count_free_blocks(struct super_block *sb) | |||
| 1986 | continue; | 2077 | continue; |
| 1987 | desc_count += le16_to_cpu(gdp->bg_free_blocks_count); | 2078 | desc_count += le16_to_cpu(gdp->bg_free_blocks_count); |
| 1988 | brelse(bitmap_bh); | 2079 | brelse(bitmap_bh); |
| 1989 | bitmap_bh = read_block_bitmap(sb, i); | 2080 | bitmap_bh = ext4_read_block_bitmap(sb, i); |
| 1990 | if (bitmap_bh == NULL) | 2081 | if (bitmap_bh == NULL) |
| 1991 | continue; | 2082 | continue; |
| 1992 | 2083 | ||
