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 | ||