btrfs: convert super block writes to folio in write_dev_supers()
[sfrench/cifs-2.6.git] / fs / btrfs / disk-io.c
index 5e2293c5b74734f7721871d91c04793ad7fe6116..9e8d0b86d3e0f444d5e38e3a18acf6ef90314768 100644 (file)
@@ -3734,13 +3734,13 @@ struct btrfs_super_block *btrfs_read_dev_super(struct block_device *bdev)
 
 /*
  * Write superblock @sb to the @device. Do not wait for completion, all the
- * pages we use for writing are locked.
+ * folios we use for writing are locked.
  *
  * Write @max_mirrors copies of the superblock, where 0 means default that fit
  * the expected device size at commit time. Note that max_mirrors must be
  * same for write and wait phases.
  *
- * Return number of errors when page is not found or submission fails.
+ * Return number of errors when folio is not found or submission fails.
  */
 static int write_dev_supers(struct btrfs_device *device,
                            struct btrfs_super_block *sb, int max_mirrors)
@@ -3759,9 +3759,10 @@ static int write_dev_supers(struct btrfs_device *device,
        shash->tfm = fs_info->csum_shash;
 
        for (i = 0; i < max_mirrors; i++) {
-               struct page *page;
+               struct folio *folio;
                struct bio *bio;
                struct btrfs_super_block *disk_super;
+               size_t offset;
 
                bytenr_orig = btrfs_sb_offset(i);
                ret = btrfs_sb_log_location(device, i, WRITE, &bytenr);
@@ -3784,20 +3785,23 @@ static int write_dev_supers(struct btrfs_device *device,
                                    BTRFS_SUPER_INFO_SIZE - BTRFS_CSUM_SIZE,
                                    sb->csum);
 
-               page = find_or_create_page(mapping, bytenr >> PAGE_SHIFT,
-                                          GFP_NOFS);
-               if (!page) {
+               folio = __filemap_get_folio(mapping, bytenr >> PAGE_SHIFT,
+                                           FGP_LOCK | FGP_ACCESSED | FGP_CREAT,
+                                           GFP_NOFS);
+               if (IS_ERR(folio)) {
                        btrfs_err(device->fs_info,
                            "couldn't get super block page for bytenr %llu",
                            bytenr);
                        errors++;
                        continue;
                }
+               ASSERT(folio_order(folio) == 0);
 
                /* Bump the refcount for wait_dev_supers() */
-               get_page(page);
+               folio_get(folio);
 
-               disk_super = page_address(page);
+               offset = offset_in_folio(folio, bytenr);
+               disk_super = folio_address(folio) + offset;
                memcpy(disk_super, sb, BTRFS_SUPER_INFO_SIZE);
 
                /*
@@ -3811,8 +3815,7 @@ static int write_dev_supers(struct btrfs_device *device,
                bio->bi_iter.bi_sector = bytenr >> SECTOR_SHIFT;
                bio->bi_private = device;
                bio->bi_end_io = btrfs_end_super_write;
-               __bio_add_page(bio, page, BTRFS_SUPER_INFO_SIZE,
-                              offset_in_page(bytenr));
+               bio_add_folio_nofail(bio, folio, BTRFS_SUPER_INFO_SIZE, offset);
 
                /*
                 * We FUA only the first super block.  The others we allow to