diff mbox series

[v2,11/34] xen: port block device access to file

Message ID 20240123-vfs-bdev-file-v2-11-adbd023e19cc@kernel.org (mailing list archive)
State New, archived
Headers show
Series Open block devices as files | expand

Commit Message

Christian Brauner Jan. 23, 2024, 1:26 p.m. UTC
Signed-off-by: Christian Brauner <brauner@kernel.org>
---
 drivers/block/xen-blkback/blkback.c |  4 ++--
 drivers/block/xen-blkback/common.h  |  4 ++--
 drivers/block/xen-blkback/xenbus.c  | 37 ++++++++++++++++++-------------------
 3 files changed, 22 insertions(+), 23 deletions(-)

Comments

Jan Kara Jan. 31, 2024, 6:31 p.m. UTC | #1
On Tue 23-01-24 14:26:28, Christian Brauner wrote:
> Signed-off-by: Christian Brauner <brauner@kernel.org>

Looks good. Feel free to add:

Reviewed-by: Jan Kara <jack@suse.cz>

								Honza

> ---
>  drivers/block/xen-blkback/blkback.c |  4 ++--
>  drivers/block/xen-blkback/common.h  |  4 ++--
>  drivers/block/xen-blkback/xenbus.c  | 37 ++++++++++++++++++-------------------
>  3 files changed, 22 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
> index 4defd7f387c7..944576d582fb 100644
> --- a/drivers/block/xen-blkback/blkback.c
> +++ b/drivers/block/xen-blkback/blkback.c
> @@ -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);
> diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
> index 1432c83183d0..b427d54bc120 100644
> --- a/drivers/block/xen-blkback/common.h
> +++ b/drivers/block/xen-blkback/common.h
> @@ -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)				\
> diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
> index e34219ea2b05..0621878940ae 100644
> --- a/drivers/block/xen-blkback/xenbus.c
> +++ b/drivers/block/xen-blkback/xenbus.c
> @@ -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 @@ static void connect(struct backend_info *be)
>  	}
>  	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 @@ static void connect(struct backend_info *be)
>  	}
>  	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);
> 
> -- 
> 2.43.0
>
diff mbox series

Patch

diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c
index 4defd7f387c7..944576d582fb 100644
--- a/drivers/block/xen-blkback/blkback.c
+++ b/drivers/block/xen-blkback/blkback.c
@@ -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);
diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h
index 1432c83183d0..b427d54bc120 100644
--- a/drivers/block/xen-blkback/common.h
+++ b/drivers/block/xen-blkback/common.h
@@ -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)				\
diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
index e34219ea2b05..0621878940ae 100644
--- a/drivers/block/xen-blkback/xenbus.c
+++ b/drivers/block/xen-blkback/xenbus.c
@@ -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 @@  static void connect(struct backend_info *be)
 	}
 	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 @@  static void connect(struct backend_info *be)
 	}
 	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);