Skip to content

Commit

Permalink
btrfs: convert super block writes to folio in wait_dev_supers()
Browse files Browse the repository at this point in the history
This is a direct conversion from pages to folios, assuming single page
folio.  Also removes a few calls to compound_head() and calls to
obsolete APIs.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
  • Loading branch information
Matthew Wilcox (Oracle) authored and David Sterba committed May 7, 2024
1 parent 8fde439 commit c94b734
Showing 1 changed file with 12 additions and 11 deletions.
23 changes: 12 additions & 11 deletions fs/btrfs/disk-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -3833,8 +3833,7 @@ static int write_dev_supers(struct btrfs_device *device,
* Wait for write completion of superblocks done by write_dev_supers,
* @max_mirrors same for write and wait phases.
*
* Return number of errors when page is not found or not marked up to
* date.
* Return number of errors when folio is not found or not marked up to date.
*/
static int wait_dev_supers(struct btrfs_device *device, int max_mirrors)
{
Expand All @@ -3848,7 +3847,7 @@ static int wait_dev_supers(struct btrfs_device *device, int max_mirrors)
max_mirrors = BTRFS_SUPER_MIRROR_MAX;

for (i = 0; i < max_mirrors; i++) {
struct page *page;
struct folio *folio;

ret = btrfs_sb_log_location(device, i, READ, &bytenr);
if (ret == -ENOENT) {
Expand All @@ -3863,27 +3862,29 @@ static int wait_dev_supers(struct btrfs_device *device, int max_mirrors)
device->commit_total_bytes)
break;

page = find_get_page(device->bdev->bd_inode->i_mapping,
bytenr >> PAGE_SHIFT);
if (!page) {
folio = filemap_get_folio(device->bdev->bd_inode->i_mapping,
bytenr >> PAGE_SHIFT);
if (IS_ERR(folio)) {
errors++;
if (i == 0)
primary_failed = true;
continue;
}
/* Page is submitted locked and unlocked once the IO completes */
wait_on_page_locked(page);
if (PageError(page)) {
ASSERT(folio_order(folio) == 0);

/* Folio will be unlocked once the write completes. */
folio_wait_locked(folio);
if (folio_test_error(folio)) {
errors++;
if (i == 0)
primary_failed = true;
}

/* Drop our reference */
put_page(page);
folio_put(folio);

/* Drop the reference from the writing run */
put_page(page);
folio_put(folio);
}

/* log error, force error return */
Expand Down

0 comments on commit c94b734

Please sign in to comment.