aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r--fs/ext4/inode.c74
1 files changed, 54 insertions, 20 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 8dd22eade42c..d1906d9a22de 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -1848,29 +1848,53 @@ static void mpage_da_map_blocks(struct mpage_da_data *mpd)
1848static void mpage_add_bh_to_extent(struct mpage_da_data *mpd, 1848static void mpage_add_bh_to_extent(struct mpage_da_data *mpd,
1849 sector_t logical, struct buffer_head *bh) 1849 sector_t logical, struct buffer_head *bh)
1850{ 1850{
1851 struct buffer_head *lbh = &mpd->lbh;
1852 sector_t next; 1851 sector_t next;
1852 size_t b_size = bh->b_size;
1853 struct buffer_head *lbh = &mpd->lbh;
1854 int nrblocks = lbh->b_size >> mpd->inode->i_blkbits;
1853 1855
1854 next = lbh->b_blocknr + (lbh->b_size >> mpd->inode->i_blkbits); 1856 /* check if thereserved journal credits might overflow */
1855 1857 if (!(EXT4_I(mpd->inode)->i_flags & EXT4_EXTENTS_FL)) {
1858 if (nrblocks >= EXT4_MAX_TRANS_DATA) {
1859 /*
1860 * With non-extent format we are limited by the journal
1861 * credit available. Total credit needed to insert
1862 * nrblocks contiguous blocks is dependent on the
1863 * nrblocks. So limit nrblocks.
1864 */
1865 goto flush_it;
1866 } else if ((nrblocks + (b_size >> mpd->inode->i_blkbits)) >
1867 EXT4_MAX_TRANS_DATA) {
1868 /*
1869 * Adding the new buffer_head would make it cross the
1870 * allowed limit for which we have journal credit
1871 * reserved. So limit the new bh->b_size
1872 */
1873 b_size = (EXT4_MAX_TRANS_DATA - nrblocks) <<
1874 mpd->inode->i_blkbits;
1875 /* we will do mpage_da_submit_io in the next loop */
1876 }
1877 }
1856 /* 1878 /*
1857 * First block in the extent 1879 * First block in the extent
1858 */ 1880 */
1859 if (lbh->b_size == 0) { 1881 if (lbh->b_size == 0) {
1860 lbh->b_blocknr = logical; 1882 lbh->b_blocknr = logical;
1861 lbh->b_size = bh->b_size; 1883 lbh->b_size = b_size;
1862 lbh->b_state = bh->b_state & BH_FLAGS; 1884 lbh->b_state = bh->b_state & BH_FLAGS;
1863 return; 1885 return;
1864 } 1886 }
1865 1887
1888 next = lbh->b_blocknr + nrblocks;
1866 /* 1889 /*
1867 * Can we merge the block to our big extent? 1890 * Can we merge the block to our big extent?
1868 */ 1891 */
1869 if (logical == next && (bh->b_state & BH_FLAGS) == lbh->b_state) { 1892 if (logical == next && (bh->b_state & BH_FLAGS) == lbh->b_state) {
1870 lbh->b_size += bh->b_size; 1893 lbh->b_size += b_size;
1871 return; 1894 return;
1872 } 1895 }
1873 1896
1897flush_it:
1874 /* 1898 /*
1875 * We couldn't merge the block to our extent, so we 1899 * We couldn't merge the block to our extent, so we
1876 * need to flush current extent and start new one 1900 * need to flush current extent and start new one
@@ -2231,17 +2255,29 @@ static int ext4_da_writepage(struct page *page,
2231} 2255}
2232 2256
2233/* 2257/*
2234 * For now just follow the DIO way to estimate the max credits 2258 * This is called via ext4_da_writepages() to
2235 * needed to write out EXT4_MAX_WRITEBACK_PAGES. 2259 * calulate the total number of credits to reserve to fit
2236 * todo: need to calculate the max credits need for 2260 * a single extent allocation into a single transaction,
2237 * extent based files, currently the DIO credits is based on 2261 * ext4_da_writpeages() will loop calling this before
2238 * indirect-blocks mapping way. 2262 * the block allocation.
2239 *
2240 * Probably should have a generic way to calculate credits
2241 * for DIO, writepages, and truncate
2242 */ 2263 */
2243#define EXT4_MAX_WRITEBACK_PAGES DIO_MAX_BLOCKS 2264
2244#define EXT4_MAX_WRITEBACK_CREDITS 25 2265static int ext4_da_writepages_trans_blocks(struct inode *inode)
2266{
2267 int max_blocks = EXT4_I(inode)->i_reserved_data_blocks;
2268
2269 /*
2270 * With non-extent format the journal credit needed to
2271 * insert nrblocks contiguous block is dependent on
2272 * number of contiguous block. So we will limit
2273 * number of contiguous block to a sane value
2274 */
2275 if (!(inode->i_flags & EXT4_EXTENTS_FL) &&
2276 (max_blocks > EXT4_MAX_TRANS_DATA))
2277 max_blocks = EXT4_MAX_TRANS_DATA;
2278
2279 return ext4_chunk_trans_blocks(inode, max_blocks);
2280}
2245 2281
2246static int ext4_da_writepages(struct address_space *mapping, 2282static int ext4_da_writepages(struct address_space *mapping,
2247 struct writeback_control *wbc) 2283 struct writeback_control *wbc)
@@ -2283,7 +2319,7 @@ restart_loop:
2283 * by delalloc 2319 * by delalloc
2284 */ 2320 */
2285 BUG_ON(ext4_should_journal_data(inode)); 2321 BUG_ON(ext4_should_journal_data(inode));
2286 needed_blocks = EXT4_DATA_TRANS_BLOCKS(inode->i_sb); 2322 needed_blocks = ext4_da_writepages_trans_blocks(inode);
2287 2323
2288 /* start a new transaction*/ 2324 /* start a new transaction*/
2289 handle = ext4_journal_start(inode, needed_blocks); 2325 handle = ext4_journal_start(inode, needed_blocks);
@@ -4461,11 +4497,9 @@ int ext4_meta_trans_blocks(struct inode *inode, int nrblocks, int chunk)
4461 * the modification of a single pages into a single transaction, 4497 * the modification of a single pages into a single transaction,
4462 * which may include multiple chunks of block allocations. 4498 * which may include multiple chunks of block allocations.
4463 * 4499 *
4464 * This could be called via ext4_write_begin() or later 4500 * This could be called via ext4_write_begin()
4465 * ext4_da_writepages() in delalyed allocation case.
4466 * 4501 *
4467 * In both case it's possible that we could allocating multiple 4502 * We need to consider the worse case, when
4468 * chunks of blocks. We need to consider the worse case, when
4469 * one new block per extent. 4503 * one new block per extent.
4470 */ 4504 */
4471int ext4_writepage_trans_blocks(struct inode *inode) 4505int ext4_writepage_trans_blocks(struct inode *inode)