xen: port block device access to file
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>
This commit is contained in:
parent
a34606a9aa
commit
217759bbb9
|
@ -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);
|
||||
|
|
|
@ -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) \
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue