Merge tag 'for-6.0-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 9 Sep 2022 11:54:19 +0000 (07:54 -0400)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 9 Sep 2022 11:54:19 +0000 (07:54 -0400)
Pull btrfs fixes from David Sterba:
 "A few more fixes to zoned mode and one regression fix for chunk limit:

    - Zoned mode fixes:
        - fix how wait/wake up is done when finishing zone
        - fix zone append limit in emulated mode
        - fix mount on devices with conventional zones

   - fix regression, user settable data chunk limit got accidentally
     lowered and causes allocation problems on some profiles (raid0,
     raid1)"

* tag 'for-6.0-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux:
  btrfs: fix the max chunk size and stripe length calculation
  btrfs: zoned: fix mounting with conventional zones
  btrfs: zoned: set pseudo max append zone limit in zone emulation mode
  btrfs: zoned: fix API misuse of zone finish waiting

1  2 
fs/btrfs/disk-io.c
fs/btrfs/inode.c

diff --combined fs/btrfs/disk-io.c
index 820b1f1e6b6723dbd6ffcb4da6255331c319a26e,129711773ae51b2ec4e8907b08b6c831b9208ad4..1af28b066b42a1a54c78951de8a0839b6a545532
@@@ -785,28 -785,28 +785,28 @@@ void btrfs_submit_metadata_bio(struct i
  }
  
  #ifdef CONFIG_MIGRATION
 -static int btree_migratepage(struct address_space *mapping,
 -                      struct page *newpage, struct page *page,
 -                      enum migrate_mode mode)
 +static int btree_migrate_folio(struct address_space *mapping,
 +              struct folio *dst, struct folio *src, enum migrate_mode mode)
  {
        /*
         * we can't safely write a btree page from here,
         * we haven't done the locking hook
         */
 -      if (PageDirty(page))
 +      if (folio_test_dirty(src))
                return -EAGAIN;
        /*
         * Buffers may be managed in a filesystem specific way.
         * We must have no buffers or drop them.
         */
 -      if (page_has_private(page) &&
 -          !try_to_release_page(page, GFP_KERNEL))
 +      if (folio_get_private(src) &&
 +          !filemap_release_folio(src, GFP_KERNEL))
                return -EAGAIN;
 -      return migrate_page(mapping, newpage, page, mode);
 +      return migrate_folio(mapping, dst, src, mode);
  }
 +#else
 +#define btree_migrate_folio NULL
  #endif
  
 -
  static int btree_writepages(struct address_space *mapping,
                            struct writeback_control *wbc)
  {
@@@ -906,8 -906,10 +906,8 @@@ static const struct address_space_opera
        .writepages     = btree_writepages,
        .release_folio  = btree_release_folio,
        .invalidate_folio = btree_invalidate_folio,
 -#ifdef CONFIG_MIGRATION
 -      .migratepage    = btree_migratepage,
 -#endif
 -      .dirty_folio = btree_dirty_folio,
 +      .migrate_folio  = btree_migrate_folio,
 +      .dirty_folio    = btree_dirty_folio,
  };
  
  struct extent_buffer *btrfs_find_create_tree_block(
@@@ -3068,7 -3070,6 +3068,6 @@@ void btrfs_init_fs_info(struct btrfs_fs
        init_waitqueue_head(&fs_info->transaction_blocked_wait);
        init_waitqueue_head(&fs_info->async_submit_wait);
        init_waitqueue_head(&fs_info->delayed_iputs_wait);
-       init_waitqueue_head(&fs_info->zone_finish_wait);
  
        /* Usable values until the real ones are cached from the superblock */
        fs_info->nodesize = 4096;
diff --combined fs/btrfs/inode.c
index ad250892028d6e0387ff8ad101e0ee2a9b9452f2,a95bac0c3e20e95d496bce2f057611b7f6a13d9f..1372210869b14cda075d3e10fb583ac98d2d4a07
@@@ -487,7 -487,7 +487,7 @@@ struct async_chunk 
        struct page *locked_page;
        u64 start;
        u64 end;
 -      unsigned int write_flags;
 +      blk_opf_t write_flags;
        struct list_head extents;
        struct cgroup_subsys_state *blkcg_css;
        struct btrfs_work work;
@@@ -1522,7 -1522,7 +1522,7 @@@ static int cow_file_range_async(struct 
        int i;
        bool should_compress;
        unsigned nofs_flag;
 -      const unsigned int write_flags = wbc_to_write_flags(wbc);
 +      const blk_opf_t write_flags = wbc_to_write_flags(wbc);
  
        unlock_extent(&inode->io_tree, start, end);
  
@@@ -1644,10 -1644,9 +1644,9 @@@ static noinline int run_delalloc_zoned(
                        done_offset = end;
  
                if (done_offset == start) {
-                       struct btrfs_fs_info *info = inode->root->fs_info;
-                       wait_var_event(&info->zone_finish_wait,
-                                      !test_bit(BTRFS_FS_NEED_ZONE_FINISH, &info->flags));
+                       wait_on_bit_io(&inode->root->fs_info->flags,
+                                      BTRFS_FS_NEED_ZONE_FINISH,
+                                      TASK_UNINTERRUPTIBLE);
                        continue;
                }
  
@@@ -8247,8 -8246,7 +8246,8 @@@ ssize_t btrfs_dio_rw(struct kiocb *iocb
        struct btrfs_dio_data data;
  
        return iomap_dio_rw(iocb, iter, &btrfs_dio_iomap_ops, &btrfs_dio_ops,
 -                          IOMAP_DIO_PARTIAL, &data, done_before);
 +                          IOMAP_DIO_PARTIAL | IOMAP_DIO_NOSYNC,
 +                          &data, done_before);
  }
  
  static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
@@@ -8326,24 -8324,30 +8325,24 @@@ static bool btrfs_release_folio(struct 
  }
  
  #ifdef CONFIG_MIGRATION
 -static int btrfs_migratepage(struct address_space *mapping,
 -                           struct page *newpage, struct page *page,
 +static int btrfs_migrate_folio(struct address_space *mapping,
 +                           struct folio *dst, struct folio *src,
                             enum migrate_mode mode)
  {
 -      int ret;
 +      int ret = filemap_migrate_folio(mapping, dst, src, mode);
  
 -      ret = migrate_page_move_mapping(mapping, newpage, page, 0);
        if (ret != MIGRATEPAGE_SUCCESS)
                return ret;
  
 -      if (page_has_private(page))
 -              attach_page_private(newpage, detach_page_private(page));
 -
 -      if (PageOrdered(page)) {
 -              ClearPageOrdered(page);
 -              SetPageOrdered(newpage);
 +      if (folio_test_ordered(src)) {
 +              folio_clear_ordered(src);
 +              folio_set_ordered(dst);
        }
  
 -      if (mode != MIGRATE_SYNC_NO_COPY)
 -              migrate_page_copy(newpage, page);
 -      else
 -              migrate_page_states(newpage, page);
        return MIGRATEPAGE_SUCCESS;
  }
 +#else
 +#define btrfs_migrate_folio NULL
  #endif
  
  static void btrfs_invalidate_folio(struct folio *folio, size_t offset,
@@@ -11481,7 -11485,9 +11480,7 @@@ static const struct address_space_opera
        .direct_IO      = noop_direct_IO,
        .invalidate_folio = btrfs_invalidate_folio,
        .release_folio  = btrfs_release_folio,
 -#ifdef CONFIG_MIGRATION
 -      .migratepage    = btrfs_migratepage,
 -#endif
 +      .migrate_folio  = btrfs_migrate_folio,
        .dirty_folio    = filemap_dirty_folio,
        .error_remove_page = generic_error_remove_page,
        .swap_activate  = btrfs_swap_activate,