diff options
author | Alex Tomas <alex@clusterfs.com> | 2008-01-29 00:19:52 -0500 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2008-01-29 00:19:52 -0500 |
commit | c9de560ded61faa5b754137b7753da252391c55a (patch) | |
tree | 2c4311377c4aa72450e27f531e198fe3e1c67db0 /fs/ext4/balloc.c | |
parent | 1988b51e476bd097d910c9245b53f2e38aedaf0d (diff) |
ext4: Add multi block allocator for ext4
Signed-off-by: Alex Tomas <alex@clusterfs.com>
Signed-off-by: Andreas Dilger <adilger@clusterfs.com>
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/balloc.c')
-rw-r--r-- | fs/ext4/balloc.c | 67 |
1 files changed, 56 insertions, 11 deletions
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index 80a4616c8244..ac75ea953d83 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c | |||
@@ -577,6 +577,8 @@ void ext4_discard_reservation(struct inode *inode) | |||
577 | struct ext4_reserve_window_node *rsv; | 577 | struct ext4_reserve_window_node *rsv; |
578 | spinlock_t *rsv_lock = &EXT4_SB(inode->i_sb)->s_rsv_window_lock; | 578 | spinlock_t *rsv_lock = &EXT4_SB(inode->i_sb)->s_rsv_window_lock; |
579 | 579 | ||
580 | ext4_mb_discard_inode_preallocations(inode); | ||
581 | |||
580 | if (!block_i) | 582 | if (!block_i) |
581 | return; | 583 | return; |
582 | 584 | ||
@@ -785,19 +787,29 @@ error_return: | |||
785 | * @inode: inode | 787 | * @inode: inode |
786 | * @block: start physical block to free | 788 | * @block: start physical block to free |
787 | * @count: number of blocks to count | 789 | * @count: number of blocks to count |
790 | * @metadata: Are these metadata blocks | ||
788 | */ | 791 | */ |
789 | void ext4_free_blocks(handle_t *handle, struct inode *inode, | 792 | void ext4_free_blocks(handle_t *handle, struct inode *inode, |
790 | ext4_fsblk_t block, unsigned long count) | 793 | ext4_fsblk_t block, unsigned long count, |
794 | int metadata) | ||
791 | { | 795 | { |
792 | struct super_block * sb; | 796 | struct super_block * sb; |
793 | unsigned long dquot_freed_blocks; | 797 | unsigned long dquot_freed_blocks; |
794 | 798 | ||
799 | /* this isn't the right place to decide whether block is metadata | ||
800 | * inode.c/extents.c knows better, but for safety ... */ | ||
801 | if (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode) || | ||
802 | ext4_should_journal_data(inode)) | ||
803 | metadata = 1; | ||
804 | |||
795 | sb = inode->i_sb; | 805 | sb = inode->i_sb; |
796 | if (!sb) { | 806 | |
797 | printk ("ext4_free_blocks: nonexistent device"); | 807 | if (!test_opt(sb, MBALLOC) || !EXT4_SB(sb)->s_group_info) |
798 | return; | 808 | ext4_free_blocks_sb(handle, sb, block, count, |
799 | } | 809 | &dquot_freed_blocks); |
800 | ext4_free_blocks_sb(handle, sb, block, count, &dquot_freed_blocks); | 810 | else |
811 | ext4_mb_free_blocks(handle, inode, block, count, | ||
812 | metadata, &dquot_freed_blocks); | ||
801 | if (dquot_freed_blocks) | 813 | if (dquot_freed_blocks) |
802 | DQUOT_FREE_BLOCK(inode, dquot_freed_blocks); | 814 | DQUOT_FREE_BLOCK(inode, dquot_freed_blocks); |
803 | return; | 815 | return; |
@@ -1576,7 +1588,7 @@ int ext4_should_retry_alloc(struct super_block *sb, int *retries) | |||
1576 | } | 1588 | } |
1577 | 1589 | ||
1578 | /** | 1590 | /** |
1579 | * ext4_new_blocks() -- core block(s) allocation function | 1591 | * ext4_new_blocks_old() -- core block(s) allocation function |
1580 | * @handle: handle to this transaction | 1592 | * @handle: handle to this transaction |
1581 | * @inode: file inode | 1593 | * @inode: file inode |
1582 | * @goal: given target block(filesystem wide) | 1594 | * @goal: given target block(filesystem wide) |
@@ -1589,7 +1601,7 @@ int ext4_should_retry_alloc(struct super_block *sb, int *retries) | |||
1589 | * any specific goal block. | 1601 | * any specific goal block. |
1590 | * | 1602 | * |
1591 | */ | 1603 | */ |
1592 | ext4_fsblk_t ext4_new_blocks(handle_t *handle, struct inode *inode, | 1604 | ext4_fsblk_t ext4_new_blocks_old(handle_t *handle, struct inode *inode, |
1593 | ext4_fsblk_t goal, unsigned long *count, int *errp) | 1605 | ext4_fsblk_t goal, unsigned long *count, int *errp) |
1594 | { | 1606 | { |
1595 | struct buffer_head *bitmap_bh = NULL; | 1607 | struct buffer_head *bitmap_bh = NULL; |
@@ -1849,13 +1861,46 @@ out: | |||
1849 | } | 1861 | } |
1850 | 1862 | ||
1851 | ext4_fsblk_t ext4_new_block(handle_t *handle, struct inode *inode, | 1863 | ext4_fsblk_t ext4_new_block(handle_t *handle, struct inode *inode, |
1852 | ext4_fsblk_t goal, int *errp) | 1864 | ext4_fsblk_t goal, int *errp) |
1865 | { | ||
1866 | struct ext4_allocation_request ar; | ||
1867 | ext4_fsblk_t ret; | ||
1868 | |||
1869 | if (!test_opt(inode->i_sb, MBALLOC)) { | ||
1870 | unsigned long count = 1; | ||
1871 | ret = ext4_new_blocks_old(handle, inode, goal, &count, errp); | ||
1872 | return ret; | ||
1873 | } | ||
1874 | |||
1875 | memset(&ar, 0, sizeof(ar)); | ||
1876 | ar.inode = inode; | ||
1877 | ar.goal = goal; | ||
1878 | ar.len = 1; | ||
1879 | ret = ext4_mb_new_blocks(handle, &ar, errp); | ||
1880 | return ret; | ||
1881 | } | ||
1882 | |||
1883 | ext4_fsblk_t ext4_new_blocks(handle_t *handle, struct inode *inode, | ||
1884 | ext4_fsblk_t goal, unsigned long *count, int *errp) | ||
1853 | { | 1885 | { |
1854 | unsigned long count = 1; | 1886 | struct ext4_allocation_request ar; |
1887 | ext4_fsblk_t ret; | ||
1855 | 1888 | ||
1856 | return ext4_new_blocks(handle, inode, goal, &count, errp); | 1889 | if (!test_opt(inode->i_sb, MBALLOC)) { |
1890 | ret = ext4_new_blocks_old(handle, inode, goal, count, errp); | ||
1891 | return ret; | ||
1892 | } | ||
1893 | |||
1894 | memset(&ar, 0, sizeof(ar)); | ||
1895 | ar.inode = inode; | ||
1896 | ar.goal = goal; | ||
1897 | ar.len = *count; | ||
1898 | ret = ext4_mb_new_blocks(handle, &ar, errp); | ||
1899 | *count = ar.len; | ||
1900 | return ret; | ||
1857 | } | 1901 | } |
1858 | 1902 | ||
1903 | |||
1859 | /** | 1904 | /** |
1860 | * ext4_count_free_blocks() -- count filesystem free blocks | 1905 | * ext4_count_free_blocks() -- count filesystem free blocks |
1861 | * @sb: superblock | 1906 | * @sb: superblock |