]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xen: port block device access to file
authorChristian Brauner <brauner@kernel.org>
Tue, 23 Jan 2024 13:26:28 +0000 (14:26 +0100)
committerChristian Brauner <brauner@kernel.org>
Sun, 25 Feb 2024 11:05:23 +0000 (12:05 +0100)
Link: https://lore.kernel.org/r/20240123-vfs-bdev-file-v2-11-adbd023e19cc@kernel.org
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
drivers/block/xen-blkback/blkback.c
drivers/block/xen-blkback/common.h
drivers/block/xen-blkback/xenbus.c

index 4defd7f387c786b937b445e3f7b8615fc733075c..944576d582fb14145e64822118aaebfc0df343fe 100644 (file)
@@ -465,7 +465,7 @@ static int xen_vbd_translate(struct phys_req *req, struct xen_blkif *blkif,
        }
 
        req->dev  = vbd->pdevice;
-       req->bdev = vbd->bdev_handle->bdev;
+       req->bdev = file_bdev(vbd->bdev_file);
        rc = 0;
 
  out:
@@ -969,7 +969,7 @@ static int dispatch_discard_io(struct xen_blkif_ring *ring,
        int err = 0;
        int status = BLKIF_RSP_OKAY;
        struct xen_blkif *blkif = ring->blkif;
-       struct block_device *bdev = blkif->vbd.bdev_handle->bdev;
+       struct block_device *bdev = file_bdev(blkif->vbd.bdev_file);
        struct phys_req preq;
 
        xen_blkif_get(blkif);
index 1432c83183d098eab8865a8f9186dcd194170493..b427d54bc1205ec2903a01d51bd87511e619041e 100644 (file)
@@ -221,7 +221,7 @@ struct xen_vbd {
        unsigned char           type;
        /* phys device that this vbd maps to. */
        u32                     pdevice;
-       struct bdev_handle      *bdev_handle;
+       struct file             *bdev_file;
        /* Cached size parameter. */
        sector_t                size;
        unsigned int            flush_support:1;
@@ -360,7 +360,7 @@ struct pending_req {
 };
 
 
-#define vbd_sz(_v)     bdev_nr_sectors((_v)->bdev_handle->bdev)
+#define vbd_sz(_v)     bdev_nr_sectors(file_bdev((_v)->bdev_file))
 
 #define xen_blkif_get(_b) (atomic_inc(&(_b)->refcnt))
 #define xen_blkif_put(_b)                              \
index e34219ea2b058c47d7464be4ce64d18c81d0e3f2..0621878940ae57c5fcd3425cfc80dadd757e82c3 100644 (file)
@@ -81,7 +81,7 @@ static void xen_update_blkif_status(struct xen_blkif *blkif)
        int i;
 
        /* Not ready to connect? */
-       if (!blkif->rings || !blkif->rings[0].irq || !blkif->vbd.bdev_handle)
+       if (!blkif->rings || !blkif->rings[0].irq || !blkif->vbd.bdev_file)
                return;
 
        /* Already connected? */
@@ -99,13 +99,12 @@ static void xen_update_blkif_status(struct xen_blkif *blkif)
                return;
        }
 
-       err = sync_blockdev(blkif->vbd.bdev_handle->bdev);
+       err = sync_blockdev(file_bdev(blkif->vbd.bdev_file));
        if (err) {
                xenbus_dev_error(blkif->be->dev, err, "block flush");
                return;
        }
-       invalidate_inode_pages2(
-                       blkif->vbd.bdev_handle->bdev->bd_inode->i_mapping);
+       invalidate_inode_pages2(blkif->vbd.bdev_file->f_mapping);
 
        for (i = 0; i < blkif->nr_rings; i++) {
                ring = &blkif->rings[i];
@@ -473,9 +472,9 @@ static void xenvbd_sysfs_delif(struct xenbus_device *dev)
 
 static void xen_vbd_free(struct xen_vbd *vbd)
 {
-       if (vbd->bdev_handle)
-               bdev_release(vbd->bdev_handle);
-       vbd->bdev_handle = NULL;
+       if (vbd->bdev_file)
+               fput(vbd->bdev_file);
+       vbd->bdev_file = NULL;
 }
 
 static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle,
@@ -483,7 +482,7 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle,
                          int cdrom)
 {
        struct xen_vbd *vbd;
-       struct bdev_handle *bdev_handle;
+       struct file *bdev_file;
 
        vbd = &blkif->vbd;
        vbd->handle   = handle;
@@ -492,17 +491,17 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle,
 
        vbd->pdevice  = MKDEV(major, minor);
 
-       bdev_handle = bdev_open_by_dev(vbd->pdevice, vbd->readonly ?
+       bdev_file = bdev_file_open_by_dev(vbd->pdevice, vbd->readonly ?
                                 BLK_OPEN_READ : BLK_OPEN_WRITE, NULL, NULL);
 
-       if (IS_ERR(bdev_handle)) {
+       if (IS_ERR(bdev_file)) {
                pr_warn("xen_vbd_create: device %08x could not be opened\n",
                        vbd->pdevice);
                return -ENOENT;
        }
 
-       vbd->bdev_handle = bdev_handle;
-       if (vbd->bdev_handle->bdev->bd_disk == NULL) {
+       vbd->bdev_file = bdev_file;
+       if (file_bdev(vbd->bdev_file)->bd_disk == NULL) {
                pr_warn("xen_vbd_create: device %08x doesn't exist\n",
                        vbd->pdevice);
                xen_vbd_free(vbd);
@@ -510,14 +509,14 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle,
        }
        vbd->size = vbd_sz(vbd);
 
-       if (cdrom || disk_to_cdi(vbd->bdev_handle->bdev->bd_disk))
+       if (cdrom || disk_to_cdi(file_bdev(vbd->bdev_file)->bd_disk))
                vbd->type |= VDISK_CDROM;
-       if (vbd->bdev_handle->bdev->bd_disk->flags & GENHD_FL_REMOVABLE)
+       if (file_bdev(vbd->bdev_file)->bd_disk->flags & GENHD_FL_REMOVABLE)
                vbd->type |= VDISK_REMOVABLE;
 
-       if (bdev_write_cache(bdev_handle->bdev))
+       if (bdev_write_cache(file_bdev(bdev_file)))
                vbd->flush_support = true;
-       if (bdev_max_secure_erase_sectors(bdev_handle->bdev))
+       if (bdev_max_secure_erase_sectors(file_bdev(bdev_file)))
                vbd->discard_secure = true;
 
        pr_debug("Successful creation of handle=%04x (dom=%u)\n",
@@ -570,7 +569,7 @@ static void xen_blkbk_discard(struct xenbus_transaction xbt, struct backend_info
        struct xen_blkif *blkif = be->blkif;
        int err;
        int state = 0;
-       struct block_device *bdev = be->blkif->vbd.bdev_handle->bdev;
+       struct block_device *bdev = file_bdev(be->blkif->vbd.bdev_file);
 
        if (!xenbus_read_unsigned(dev->nodename, "discard-enable", 1))
                return;
@@ -932,7 +931,7 @@ again:
        }
        err = xenbus_printf(xbt, dev->nodename, "sector-size", "%lu",
                            (unsigned long)bdev_logical_block_size(
-                                       be->blkif->vbd.bdev_handle->bdev));
+                                       file_bdev(be->blkif->vbd.bdev_file)));
        if (err) {
                xenbus_dev_fatal(dev, err, "writing %s/sector-size",
                                 dev->nodename);
@@ -940,7 +939,7 @@ again:
        }
        err = xenbus_printf(xbt, dev->nodename, "physical-sector-size", "%u",
                            bdev_physical_block_size(
-                                       be->blkif->vbd.bdev_handle->bdev));
+                                       file_bdev(be->blkif->vbd.bdev_file)));
        if (err)
                xenbus_dev_error(dev, err, "writing %s/physical-sector-size",
                                 dev->nodename);