Bug fixes (all for stable kernels) for ext4:
* address corner cases for indirect blocks->extent migration * fix reserved block accounting invalidate_page when page_size != block_size (i.e., ppc or 1k block size file systems) * fix deadlocks when a memcg is under heavy memory pressure * fix fencepost error in lazytime optimization -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQEcBAABCAAGBQJVmW27AAoJEPL5WVaVDYGjmEkIAJsGHVIKur1Kp//FhejSB/wI B0d+UuQt5kdAE3lNxC7lHO1NqIhvnS7eBho+52LG8V4JDRrzTbE1GdbsBhAIk6FW CcsQvsHAI99QJMdqOCachu/+nhCwIINGkxmbumhNaZoJPn6wmGQzCA3Cn5qmnGnK Ctbk6li1HuMXyzbbvxCLfaD/xCUs1NCdufEnRU44i0U4OfaYNpiAhddeGIQ8WMEQ G14l2JvhIfye6fG8lnCzfacFvnT9zvvSGfRO3ZQjC4Az1EogIUbhCPLvq0ebDbPp i4eRfrSRdXmMojqmW/knET8skXQVZVnD7LWuvkue+n47UbTH2c0roTbp4l76W+U= =x8Cc -----END PGP SIGNATURE----- Merge tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4 Pull ext4 bugfixes from Ted Ts'o: "Bug fixes (all for stable kernels) for ext4: - address corner cases for indirect blocks->extent migration - fix reserved block accounting invalidate_page when page_size != block_size (i.e., ppc or 1k block size file systems) - fix deadlocks when a memcg is under heavy memory pressure - fix fencepost error in lazytime optimization" * tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4: ext4: replace open coded nofail allocation in ext4_free_blocks() ext4: correctly migrate a file with a hole at the beginning ext4: be more strict when migrating to non-extent based file ext4: fix reservation release on invalidatepage for delalloc fs ext4: avoid deadlocks in the writeback path by using sb_getblk_gfp bufferhead: Add _gfp version for sb_getblk() ext4: fix fencepost error in lazytime optimization
This commit is contained in:
commit
1c4c7159ed
5 changed files with 47 additions and 21 deletions
|
@ -1323,7 +1323,7 @@ static void ext4_da_page_release_reservation(struct page *page,
|
|||
unsigned int offset,
|
||||
unsigned int length)
|
||||
{
|
||||
int to_release = 0;
|
||||
int to_release = 0, contiguous_blks = 0;
|
||||
struct buffer_head *head, *bh;
|
||||
unsigned int curr_off = 0;
|
||||
struct inode *inode = page->mapping->host;
|
||||
|
@ -1344,14 +1344,23 @@ static void ext4_da_page_release_reservation(struct page *page,
|
|||
|
||||
if ((offset <= curr_off) && (buffer_delay(bh))) {
|
||||
to_release++;
|
||||
contiguous_blks++;
|
||||
clear_buffer_delay(bh);
|
||||
} else if (contiguous_blks) {
|
||||
lblk = page->index <<
|
||||
(PAGE_CACHE_SHIFT - inode->i_blkbits);
|
||||
lblk += (curr_off >> inode->i_blkbits) -
|
||||
contiguous_blks;
|
||||
ext4_es_remove_extent(inode, lblk, contiguous_blks);
|
||||
contiguous_blks = 0;
|
||||
}
|
||||
curr_off = next_off;
|
||||
} while ((bh = bh->b_this_page) != head);
|
||||
|
||||
if (to_release) {
|
||||
if (contiguous_blks) {
|
||||
lblk = page->index << (PAGE_CACHE_SHIFT - inode->i_blkbits);
|
||||
ext4_es_remove_extent(inode, lblk, to_release);
|
||||
lblk += (curr_off >> inode->i_blkbits) - contiguous_blks;
|
||||
ext4_es_remove_extent(inode, lblk, contiguous_blks);
|
||||
}
|
||||
|
||||
/* If we have released all the blocks belonging to a cluster, then we
|
||||
|
@ -4344,7 +4353,12 @@ static void ext4_update_other_inodes_time(struct super_block *sb,
|
|||
int inode_size = EXT4_INODE_SIZE(sb);
|
||||
|
||||
oi.orig_ino = orig_ino;
|
||||
ino = (orig_ino & ~(inodes_per_block - 1)) + 1;
|
||||
/*
|
||||
* Calculate the first inode in the inode table block. Inode
|
||||
* numbers are one-based. That is, the first inode in a block
|
||||
* (assuming 4k blocks and 256 byte inodes) is (n*16 + 1).
|
||||
*/
|
||||
ino = ((orig_ino - 1) & ~(inodes_per_block - 1)) + 1;
|
||||
for (i = 0; i < inodes_per_block; i++, ino++, buf += inode_size) {
|
||||
if (ino == orig_ino)
|
||||
continue;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue