]> git.proxmox.com Git - mirror_ubuntu-disco-kernel.git/blobdiff - fs/xfs/xfs_super.c
Merge branch 'work.mount' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[mirror_ubuntu-disco-kernel.git] / fs / xfs / xfs_super.c
index 7bc25d62cdc624df66460e4f89312c115242d46b..c996f4ae4a5f293199ede0d0137329cc0919418b 100644 (file)
@@ -714,17 +714,26 @@ STATIC void
 xfs_close_devices(
        struct xfs_mount        *mp)
 {
+       struct dax_device *dax_ddev = mp->m_ddev_targp->bt_daxdev;
+
        if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) {
                struct block_device *logdev = mp->m_logdev_targp->bt_bdev;
+               struct dax_device *dax_logdev = mp->m_logdev_targp->bt_daxdev;
+
                xfs_free_buftarg(mp, mp->m_logdev_targp);
                xfs_blkdev_put(logdev);
+               fs_put_dax(dax_logdev);
        }
        if (mp->m_rtdev_targp) {
                struct block_device *rtdev = mp->m_rtdev_targp->bt_bdev;
+               struct dax_device *dax_rtdev = mp->m_rtdev_targp->bt_daxdev;
+
                xfs_free_buftarg(mp, mp->m_rtdev_targp);
                xfs_blkdev_put(rtdev);
+               fs_put_dax(dax_rtdev);
        }
        xfs_free_buftarg(mp, mp->m_ddev_targp);
+       fs_put_dax(dax_ddev);
 }
 
 /*
@@ -742,6 +751,8 @@ xfs_open_devices(
        struct xfs_mount        *mp)
 {
        struct block_device     *ddev = mp->m_super->s_bdev;
+       struct dax_device       *dax_ddev = fs_dax_get_by_bdev(ddev);
+       struct dax_device       *dax_logdev = NULL, *dax_rtdev = NULL;
        struct block_device     *logdev = NULL, *rtdev = NULL;
        int                     error;
 
@@ -752,6 +763,7 @@ xfs_open_devices(
                error = xfs_blkdev_get(mp, mp->m_logname, &logdev);
                if (error)
                        goto out;
+               dax_logdev = fs_dax_get_by_bdev(logdev);
        }
 
        if (mp->m_rtname) {
@@ -765,24 +777,25 @@ xfs_open_devices(
                        error = -EINVAL;
                        goto out_close_rtdev;
                }
+               dax_rtdev = fs_dax_get_by_bdev(rtdev);
        }
 
        /*
         * Setup xfs_mount buffer target pointers
         */
        error = -ENOMEM;
-       mp->m_ddev_targp = xfs_alloc_buftarg(mp, ddev);
+       mp->m_ddev_targp = xfs_alloc_buftarg(mp, ddev, dax_ddev);
        if (!mp->m_ddev_targp)
                goto out_close_rtdev;
 
        if (rtdev) {
-               mp->m_rtdev_targp = xfs_alloc_buftarg(mp, rtdev);
+               mp->m_rtdev_targp = xfs_alloc_buftarg(mp, rtdev, dax_rtdev);
                if (!mp->m_rtdev_targp)
                        goto out_free_ddev_targ;
        }
 
        if (logdev && logdev != ddev) {
-               mp->m_logdev_targp = xfs_alloc_buftarg(mp, logdev);
+               mp->m_logdev_targp = xfs_alloc_buftarg(mp, logdev, dax_logdev);
                if (!mp->m_logdev_targp)
                        goto out_free_rtdev_targ;
        } else {
@@ -798,10 +811,14 @@ xfs_open_devices(
        xfs_free_buftarg(mp, mp->m_ddev_targp);
  out_close_rtdev:
        xfs_blkdev_put(rtdev);
+       fs_put_dax(dax_rtdev);
  out_close_logdev:
-       if (logdev && logdev != ddev)
+       if (logdev && logdev != ddev) {
                xfs_blkdev_put(logdev);
+               fs_put_dax(dax_logdev);
+       }
  out:
+       fs_put_dax(dax_ddev);
        return error;
 }
 
@@ -1220,7 +1237,7 @@ xfs_test_remount_options(
        tmp_mp->m_super = sb;
        error = xfs_parseargs(tmp_mp, options);
        xfs_free_fsname(tmp_mp);
-       kfree(tmp_mp);
+       kmem_free(tmp_mp);
 
        return error;
 }