|
@@ -1330,7 +1330,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;
|
|
@@ -1351,14 +1351,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
|