]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
vds: Add physical block support
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Tue, 31 Jan 2017 20:34:08 +0000 (12:34 -0800)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 6 Apr 2017 07:13:46 +0000 (00:13 -0700)
Version 1.2 of the virtual IO device protocol added physical block
support.  Start sending the underlaying physical block device size.

Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
Reviewed-by: Shannon Nelson <shannon.nelson@oracle.com>
Reviewed-by: Rob Gardner <rob.gardner@oracle.com>
Orabug: 19420123
Signed-off-by: Allen Pais <allen.pais@oracle.com>
drivers/block/vds/vds.h
drivers/block/vds/vds_blk.c
drivers/block/vds/vds_io.c
drivers/block/vds/vds_io.h
drivers/block/vds/vds_main.c
drivers/block/vds/vds_reg.c

index 32474291508fe7b75d4f4f514b6639d504c74e8e..362c78ca3535dab7de03bf5abaf428092ecdd099 100644 (file)
@@ -42,6 +42,7 @@ struct vds_port {
        u64                     max_xfer_size;
        u64                     vdisk_size;
        u32                     vdisk_bsize;
+       u32                     vdisk_phy_bsize;
        u32                     msglen;
        u64                     seq;
        const char              *path;
index 38c762c5a1c419f9fe72fd2d39e7ba0222eda898..9cc1635f3dee9a496c13726be7d5f0979f3342b1 100644 (file)
@@ -19,8 +19,8 @@ static int vds_blk_init(struct vds_port *port)
 
        port->vdisk_bsize = bdev_logical_block_size(bdev);
        port->vdisk_size = i_size_read(bdev->bd_inode) / port->vdisk_bsize;
-       port->max_xfer_size = to_bytes(blk_queue_get_max_sectors(
-                             bdev_get_queue(bdev), 0)) / port->vdisk_bsize;
+       port->max_xfer_size = vds_io_max_xfer_size(port, bdev);
+       port->vdisk_phy_bsize = bdev_physical_block_size(bdev);
 
        port->be_data = bdev;
 
index f8473ad0d797da0f0d993ac1f6ab2a038451a839..1315cb5fb6cd2cc0b7b457cea57d94c141910aac 100644 (file)
@@ -689,8 +689,9 @@ int vds_be_init(struct vds_port *port)
                        udelay(VDS_DEV_DELAY);
                }
 
-       vdsdbg(HS, "vdisk_blk_sz=%u vdisk_sz=%llu max_xfer_sz=%llu\n",
-              port->vdisk_bsize, port->vdisk_size, port->max_xfer_size);
+       vdsdbg(HS, "vdisk_blk_sz=%u vdisk_sz=%llu vdisk_phy_blk_sz=%u max_xfer_sz=%llu\n",
+              port->vdisk_bsize, port->vdisk_size, port->vdisk_phy_bsize,
+              port->max_xfer_size);
 
        if (!(port->vdisk_bsize && port->vdisk_size && port->max_xfer_size)) {
                rv = -EINVAL;
@@ -747,3 +748,13 @@ void vds_be_fini(struct vds_port *port)
        }
        vds_be_wunlock(port);
 }
+
+int vds_io_max_xfer_size(struct vds_port *port, struct block_device *bdev)
+{
+       unsigned max_sect = blk_queue_get_max_sectors(bdev_get_queue(bdev), 0);
+
+       if (max_sect == 0)
+               return 0;
+
+       return to_bytes(max_sect) / port->vdisk_bsize;
+}
index 4789297393071e629fd884344fcc21c967017258..643eb6f4556a090b0720e765dec9340077aa253d 100644 (file)
@@ -53,6 +53,8 @@ void vds_io_enq(struct vds_io *io);
 void vds_io_wait(struct vds_io *io);
 void vds_io_done(struct vds_io *io);
 
+int vds_io_max_xfer_size(struct vds_port *port, struct block_device *bdev);
+
 void *vds_get(struct vds_port *port, sector_t offset, u64 size);
 int vds_clear(struct vds_port *port, sector_t offset, u64 size);
 int vds_read(struct vds_port *port, void *addr, sector_t offset, u64 size);
index d0655da88b35487e3fe0b5d406a2c500c8e32a60..9119864d20a5afa20869ef78fe72d1f020cfabe5 100644 (file)
@@ -181,6 +181,7 @@ static int vds_handle_attr(struct vio_driver_state *vio, void *arg)
        port->xfer_mode = pkt->xfer_mode;
 
        pkt->vdisk_block_size = port->vdisk_bsize;
+       pkt->phys_block_size = port->vdisk_phy_bsize;
 
        /* XXX OBP doesn't seem to honor max_xfer_size */
        pkt->max_xfer_size = port->max_xfer_size;
@@ -191,9 +192,9 @@ static int vds_handle_attr(struct vio_driver_state *vio, void *arg)
        pkt->tag.stype = VIO_SUBTYPE_ACK;
        pkt->tag.sid = vio_send_sid(vio);
 
-       vdsdbg(HS, "SEND ATTR dksz[%llu] blksz[%u] max_xfer[%llu] ops[%llx]\n",
+       vdsdbg(HS, "SEND ATTR dksz[%llu] blksz[%u] max_xfer[%llu] ops[%llx] physz[%u]\n",
               pkt->vdisk_size, pkt->vdisk_block_size,
-              pkt->max_xfer_size, pkt->operations);
+              pkt->max_xfer_size, pkt->operations, pkt->phys_block_size);
 
        return vio_ldc_send(vio, pkt, sizeof(*pkt));
 }
index cf7c157ff52c0588910744eca1487f8f12da9458..fd8e94fd2ea4313ac809d588fe7e3727526bb8d9 100644 (file)
@@ -7,18 +7,31 @@
 #include "vds.h"
 #include "vds_io.h"
 
+/* Default logical and physical block size */
+#define VDS_DEFAULT_BLK_SIZE   512
+
 static int vds_reg_init(struct vds_port *port)
 {
        struct file *file;
+       struct block_device *bdev;
 
        file = filp_open(port->path, O_RDWR | O_EXCL | O_LARGEFILE, 0);
        if (IS_ERR(file))
                return (int)PTR_ERR(file);
 
-       port->vdisk_bsize = 512;
+       bdev = file->f_inode->i_sb->s_bdev;
+       if (bdev) {
+               port->vdisk_bsize = bdev_logical_block_size(bdev);
+               port->vdisk_phy_bsize = bdev_physical_block_size(bdev);
+               port->max_xfer_size = vds_io_max_xfer_size(port, bdev);
+       } else {
+               port->vdisk_bsize = VDS_DEFAULT_BLK_SIZE;
+               port->vdisk_phy_bsize = VDS_DEFAULT_BLK_SIZE;
+               port->max_xfer_size = 1024;
+       }
+
        port->vdisk_size = i_size_read(file_inode(file)) /
-                                      port->vdisk_bsize;
-       port->max_xfer_size = 1024;
+                          port->vdisk_bsize;
 
        port->be_data = file;