]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
btrfs: convert super block writes to folio in wait_dev_supers()
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Sat, 20 Apr 2024 02:49:56 +0000 (03:49 +0100)
committerDavid Sterba <dsterba@suse.com>
Tue, 7 May 2024 19:31:10 +0000 (21:31 +0200)
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>
fs/btrfs/disk-io.c

index e0bdf3ed2449001c0932435ca6f48a71523ad78d..5e2293c5b74734f7721871d91c04793ad7fe6116 100644 (file)
@@ -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)
 {
@@ -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) {
@@ -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 */