fs_put_dax(btp->bt_daxdev, btp->bt_mount);
        /* the main block device is closed by kill_block_super */
        if (btp->bt_bdev != btp->bt_mount->m_super->s_bdev)
 -              bdev_release(btp->bt_bdev_handle);
 +              fput(btp->bt_bdev_file);
- 
-       kmem_free(btp);
+       kfree(btp);
  }
  
  int
  struct xfs_buftarg *
  xfs_alloc_buftarg(
        struct xfs_mount        *mp,
 -      struct bdev_handle      *bdev_handle)
 +      struct file             *bdev_file)
  {
-       xfs_buftarg_t           *btp;
+       struct xfs_buftarg      *btp;
        const struct dax_holder_operations *ops = NULL;
  
  #if defined(CONFIG_FS_DAX) && defined(CONFIG_MEMORY_FAILURE)
        ops = &xfs_dax_holder_operations;
  #endif
-       btp = kmem_zalloc(sizeof(*btp), KM_NOFS);
+       btp = kzalloc(sizeof(*btp), GFP_KERNEL | __GFP_NOFAIL);
  
        btp->bt_mount = mp;
 -      btp->bt_bdev_handle = bdev_handle;
 -      btp->bt_dev = bdev_handle->bdev->bd_dev;
 -      btp->bt_bdev = bdev_handle->bdev;
 +      btp->bt_bdev_file = bdev_file;
 +      btp->bt_bdev = file_bdev(bdev_file);
 +      btp->bt_dev = btp->bt_bdev->bd_dev;
        btp->bt_daxdev = fs_dax_get_by_bdev(btp->bt_bdev, &btp->bt_dax_part_off,
                                            mp, ops);
  
 
   * The latter is derived from the underlying device, and controls direct IO
   * alignment constraints.
   */
- typedef struct xfs_buftarg {
+ struct xfs_buftarg {
        dev_t                   bt_dev;
 -      struct bdev_handle      *bt_bdev_handle;
 +      struct file             *bt_bdev_file;
        struct block_device     *bt_bdev;
        struct dax_device       *bt_daxdev;
+       struct file             *bt_file;
        u64                     bt_dax_part_off;
        struct xfs_mount        *bt_mount;
        unsigned int            bt_meta_sectorsize;