@@ -1209,10 +1209,10 @@ static void ext4_da_page_release_reservation(struct page *page,
do {
unsigned int next_off = curr_off + bh->b_size;
- if ((offset <= curr_off) && (buffer_delay(bh))) {
+ if ((offset <= curr_off) && buffer_delay(bh) &&
+ !buffer_da_mapped(bh)) {
to_release++;
clear_buffer_delay(bh);
- clear_buffer_da_mapped(bh);
}
curr_off = next_off;
} while ((bh = bh->b_this_page) != head);
@@ -2544,6 +2544,7 @@ static void ext4_da_invalidatepage(struct page *page, unsigned long offset)
* Drop reserved blocks
*/
BUG_ON(!PageLocked(page));
+ down_write(&EXT4_I(page->mapping->host)->i_data_sem);
if (!page_has_buffers(page))
goto out;
@@ -2552,6 +2553,7 @@ static void ext4_da_invalidatepage(struct page *page, unsigned long offset)
out:
ext4_invalidatepage(page, offset);
+ up_write(&EXT4_I(page->mapping->host)->i_data_sem);
return;
}