aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>2008-09-08 23:09:17 -0400
committerTheodore Ts'o <tytso@mit.edu>2008-09-08 23:09:17 -0400
commit68629f29c6764c37ebdceec2f6bbef6637eaf420 (patch)
treeed3a3c537c6a3c0dc2e2b1937ca5b66dc4b4e370
parent5c79161689aede2d487d707d5931a22eadf66120 (diff)
ext4: Fix ext4 nomballoc allocator for ENOSPC
We run into ENOSPC error on nonmballoc ext4, even when there is free blocks on the filesystem. The patch includes two changes: a) Set reservation to NULL if we trying to allocate near group_target_block from the goal group if the free block in the group is less than windows. This should give us a better chance to allocate near group_target_block. This also ensures that if we are not allocating near group_target_block then we don't trun off reservation. This should enable us to allocate with reservation from other groups that have large free blocks count. b) we don't need to check the window size if the block reservation is off. Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: Mingming Cao <cmm@us.ibm.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
-rw-r--r--fs/ext4/balloc.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c
index a425e78c73e..ae26c37e398 100644
--- a/fs/ext4/balloc.c
+++ b/fs/ext4/balloc.c
@@ -1804,15 +1804,17 @@ retry_alloc:
1804 goto io_error; 1804 goto io_error;
1805 1805
1806 free_blocks = le16_to_cpu(gdp->bg_free_blocks_count); 1806 free_blocks = le16_to_cpu(gdp->bg_free_blocks_count);
1807 /*
1808 * if there is not enough free blocks to make a new resevation
1809 * turn off reservation for this allocation
1810 */
1811 if (my_rsv && (free_blocks < windowsz)
1812 && (rsv_is_empty(&my_rsv->rsv_window)))
1813 my_rsv = NULL;
1814 1807
1815 if (free_blocks > 0) { 1808 if (free_blocks > 0) {
1809 /*
1810 * try to allocate with group target block
1811 * in the goal group. If we have low free_blocks
1812 * count turn off reservation
1813 */
1814 if (my_rsv && (free_blocks < windowsz)
1815 && (rsv_is_empty(&my_rsv->rsv_window)))
1816 my_rsv = NULL;
1817
1816 bitmap_bh = ext4_read_block_bitmap(sb, group_no); 1818 bitmap_bh = ext4_read_block_bitmap(sb, group_no);
1817 if (!bitmap_bh) 1819 if (!bitmap_bh)
1818 goto io_error; 1820 goto io_error;
@@ -1845,7 +1847,7 @@ retry_alloc:
1845 * free blocks is less than half of the reservation 1847 * free blocks is less than half of the reservation
1846 * window size. 1848 * window size.
1847 */ 1849 */
1848 if (free_blocks <= (windowsz/2)) 1850 if (my_rsv && (free_blocks <= (windowsz/2)))
1849 continue; 1851 continue;
1850 1852
1851 brelse(bitmap_bh); 1853 brelse(bitmap_bh);