Merge tag 'libnvdimm-for-5.17' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdim...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 12 Jan 2022 23:46:11 +0000 (15:46 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 12 Jan 2022 23:46:11 +0000 (15:46 -0800)
Pull dax and libnvdimm updates from Dan Williams:
 "The bulk of this is a rework of the dax_operations API after
  discovering the obstacles it posed to the work-in-progress DAX+reflink
  support for XFS and other copy-on-write filesystem mechanics.

  Primarily the need to plumb a block_device through the API to handle
  partition offsets was a sticking point and Christoph untangled that
  dependency in addition to other cleanups to make landing the
  DAX+reflink support easier.

  The DAX_PMEM_COMPAT option has been around for 4 years and not only
  are distributions shipping userspace that understand the current
  configuration API, but some are not even bothering to turn this option
  on anymore, so it seems a good time to remove it per the deprecation
  schedule. Recall that this was added after the device-dax subsystem
  moved from /sys/class/dax to /sys/bus/dax for its sysfs organization.
  All recent functionality depends on /sys/bus/dax.

  Some other miscellaneous cleanups and reflink prep patches are
  included as well.

  Summary:

   - Simplify the dax_operations API:

      - Eliminate bdev_dax_pgoff() in favor of the filesystem
        maintaining and applying a partition offset to all its DAX iomap
        operations.

      - Remove wrappers and device-mapper stacked callbacks for
        ->copy_from_iter() and ->copy_to_iter() in favor of moving
        block_device relative offset responsibility to the
        dax_direct_access() caller.

      - Remove the need for an @bdev in filesystem-DAX infrastructure

      - Remove unused uio helpers copy_from_iter_flushcache() and
        copy_mc_to_iter() as only the non-check_copy_size() versions are
        used for DAX.

   - Prepare XFS for the pending (next merge window) DAX+reflink support

   - Remove deprecated DEV_DAX_PMEM_COMPAT support

   - Cleanup a straggling misuse of the GUID api"

* tag 'libnvdimm-for-5.17' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm: (38 commits)
  iomap: Fix error handling in iomap_zero_iter()
  ACPI: NFIT: Import GUID before use
  dax: remove the copy_from_iter and copy_to_iter methods
  dax: remove the DAXDEV_F_SYNC flag
  dax: simplify dax_synchronous and set_dax_synchronous
  uio: remove copy_from_iter_flushcache() and copy_mc_to_iter()
  iomap: turn the byte variable in iomap_zero_iter into a ssize_t
  memremap: remove support for external pgmap refcounts
  fsdax: don't require CONFIG_BLOCK
  iomap: build the block based code conditionally
  dax: fix up some of the block device related ifdefs
  fsdax: shift partition offset handling into the file systems
  dax: return the partition offset from fs_dax_get_by_bdev
  iomap: add a IOMAP_DAX flag
  xfs: pass the mapping flags to xfs_bmbt_to_iomap
  xfs: use xfs_direct_write_iomap_ops for DAX zeroing
  xfs: move dax device handling into xfs_{alloc,free}_buftarg
  ext4: cleanup the dax handling in ext4_fill_super
  ext2: cleanup the dax handling in ext2_fill_super
  fsdax: decouple zeroing from the iomap buffered I/O code
  ...

15 files changed:
1  2 
drivers/md/dm.c
fs/erofs/data.c
fs/erofs/internal.h
fs/erofs/super.c
fs/ext4/ext4.h
fs/ext4/inode.c
fs/ext4/super.c
fs/fuse/virtio_fs.c
fs/iomap/buffered-io.c
fs/xfs/xfs_aops.c
fs/xfs/xfs_iops.c
fs/xfs/xfs_reflink.c
fs/xfs/xfs_super.c
include/linux/iomap.h
include/linux/uio.h

diff --cc drivers/md/dm.c
Simple merge
diff --cc fs/erofs/data.c
Simple merge
Simple merge
@@@ -264,10 -309,10 +264,10 @@@ static int erofs_init_devices(struct su
                                          sb->s_type);
                if (IS_ERR(bdev)) {
                        err = PTR_ERR(bdev);
 -                      goto err_out;
 +                      break;
                }
                dif->bdev = bdev;
-               dif->dax_dev = fs_dax_get_by_bdev(bdev);
+               dif->dax_dev = fs_dax_get_by_bdev(bdev, &dif->dax_part_off);
                dif->blocks = le32_to_cpu(dis->blocks);
                dif->mapped_blkaddr = le32_to_cpu(dis->mapped_blkaddr);
                sbi->total_blocks += dif->blocks;
diff --cc fs/ext4/ext4.h
Simple merge
diff --cc fs/ext4/inode.c
Simple merge
diff --cc fs/ext4/super.c
@@@ -4320,48 -3876,15 +4320,48 @@@ static void ext4_setup_csum_trigger(str
        sbi->s_journal_triggers[type].tr_triggers.t_frozen = trigger;
  }
  
 -static int ext4_fill_super(struct super_block *sb, void *data, int silent)
 +static void ext4_free_sbi(struct ext4_sb_info *sbi)
 +{
 +      if (!sbi)
 +              return;
 +
 +      kfree(sbi->s_blockgroup_lock);
 +      fs_put_dax(sbi->s_daxdev);
 +      kfree(sbi);
 +}
 +
 +static struct ext4_sb_info *ext4_alloc_sbi(struct super_block *sb)
 +{
 +      struct ext4_sb_info *sbi;
 +
 +      sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
 +      if (!sbi)
 +              return NULL;
 +
-       sbi->s_daxdev = fs_dax_get_by_bdev(sb->s_bdev);
++      sbi->s_daxdev = fs_dax_get_by_bdev(sb->s_bdev, &sbi->s_dax_part_off);
 +
 +      sbi->s_blockgroup_lock =
 +              kzalloc(sizeof(struct blockgroup_lock), GFP_KERNEL);
 +
 +      if (!sbi->s_blockgroup_lock)
 +              goto err_out;
 +
 +      sb->s_fs_info = sbi;
 +      sbi->s_sb = sb;
 +      return sbi;
 +err_out:
 +      fs_put_dax(sbi->s_daxdev);
 +      kfree(sbi);
 +      return NULL;
 +}
 +
 +static int __ext4_fill_super(struct fs_context *fc, struct super_block *sb)
  {
 -      char *orig_data = kstrdup(data, GFP_KERNEL);
        struct buffer_head *bh, **group_desc;
        struct ext4_super_block *es = NULL;
 -      struct ext4_sb_info *sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
 +      struct ext4_sb_info *sbi = EXT4_SB(sb);
        struct flex_groups **flex_groups;
        ext4_fsblk_t block;
 -      ext4_fsblk_t sb_block = get_sb_block(&data);
        ext4_fsblk_t logical_sb_block;
        unsigned long offset = 0;
        unsigned long def_mount_opts;
Simple merge
@@@ -908,32 -882,19 +907,23 @@@ static loff_t iomap_zero_iter(struct io
                return length;
  
        do {
 -              unsigned offset = offset_in_page(pos);
 -              ssize_t bytes = min_t(u64, PAGE_SIZE - offset, length);
 -              struct page *page;
 +              struct folio *folio;
                int status;
 +              size_t offset;
 +              size_t bytes = min_t(u64, SIZE_MAX, length);
  
-               if (IS_DAX(iter->inode)) {
-                       s64 tmp = dax_iomap_zero(pos, bytes, iomap);
-                       if (tmp < 0)
-                               return tmp;
-                       bytes = tmp;
-                       goto good;
-               }
 -              status = iomap_write_begin(iter, pos, bytes, &page);
 +              status = iomap_write_begin(iter, pos, bytes, &folio);
                if (status)
                        return status;
  
 -              zero_user(page, offset, bytes);
 -              mark_page_accessed(page);
 +              offset = offset_in_folio(folio, pos);
 +              if (bytes > folio_size(folio) - offset)
 +                      bytes = folio_size(folio) - offset;
  
 -              bytes = iomap_write_end(iter, pos, bytes, bytes, page);
 +              folio_zero_range(folio, offset, bytes);
 +              folio_mark_accessed(folio);
 +
 +              bytes = iomap_write_end(iter, pos, bytes, bytes, folio);
- good:
                if (WARN_ON_ONCE(bytes == 0))
                        return -EIO;
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge