Skip to content

Commit

Permalink
btrfs: remove the BUG_ON() inside extent_range_clear_dirty_for_io()
Browse files Browse the repository at this point in the history
Previously we had a BUG_ON() inside extent_range_clear_dirty_for_io(), as
we expected all involved folios to be still locked, thus no folio should be
missing.

However for extent_range_clear_dirty_for_io() itself, we can skip the
missing folio and handle the remaining ones, and return an error if
there is anything wrong.

Remove the BUG_ON() and let the caller to handle the error.
In the caller we do not have a quick way to cleanup the error, but all
the compression routines would handle the missing folio as an error and
properly error out, so we only need to do an ASSERT() for developers,
while for non-debug build the compression routine would handle the
error correctly.

Signed-off-by: Qu Wenruo <[email protected]>
Signed-off-by: David Sterba <[email protected]>
  • Loading branch information
adam900710 authored and kdave committed Jul 3, 2024
1 parent 66372c0 commit f6dc71f
Showing 1 changed file with 20 additions and 6 deletions.
26 changes: 20 additions & 6 deletions fs/btrfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -867,19 +867,24 @@ static inline void inode_should_defrag(struct btrfs_inode *inode,
btrfs_add_inode_defrag(NULL, inode, small_write);
}

static void extent_range_clear_dirty_for_io(struct inode *inode, u64 start, u64 end)
static int extent_range_clear_dirty_for_io(struct inode *inode, u64 start, u64 end)
{
unsigned long index = start >> PAGE_SHIFT;
unsigned long end_index = end >> PAGE_SHIFT;
struct page *page;
int ret = 0;

while (index <= end_index) {
for (unsigned long index = start >> PAGE_SHIFT;
index <= end_index; index++) {
page = find_get_page(inode->i_mapping, index);
BUG_ON(!page); /* Pages should be in the extent_io_tree */
if (unlikely(!page)) {
if (!ret)
ret = -ENOENT;
continue;
}
clear_page_dirty_for_io(page);
put_page(page);
index++;
}
return ret;
}

/*
Expand Down Expand Up @@ -923,7 +928,16 @@ static void compress_file_range(struct btrfs_work *work)
* Otherwise applications with the file mmap'd can wander in and change
* the page contents while we are compressing them.
*/
extent_range_clear_dirty_for_io(&inode->vfs_inode, start, end);
ret = extent_range_clear_dirty_for_io(&inode->vfs_inode, start, end);

/*
* All the folios should have been locked thus no failure.
*
* And even if some folios are missing, btrfs_compress_folios()
* would handle them correctly, so here just do an ASSERT() check for
* early logic errors.
*/
ASSERT(ret == 0);

/*
* We need to save i_size before now because it could change in between
Expand Down

0 comments on commit f6dc71f

Please sign in to comment.