]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sunvdc: Add support for setting physical sector size
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Wed, 1 Feb 2017 19:09:26 +0000 (14:09 -0500)
committerChuck Anderson <chuck.anderson@oracle.com>
Thu, 6 Apr 2017 07:13:44 +0000 (00:13 -0700)
Physical sector size is supported in v1.2 of the vDisk protocol and
should be set if available.  If protocol version 1.2 is used and the
physical disk size is unavailable, then the disk is considered busy.

Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(Cherry-pick of upstream f41e54616ca1a199f6c17228f26082ccdaaab3de)

Orabug: 19420123
Signed-off-by: Allen Pais <allen.pais@oracle.com>
drivers/block/sunvdc.c

index d61b7ea943719fdfd8416e7306addffa8bd18b82..b43ee6f613c6689d185a5b1ff25f45159d98747f 100644 (file)
@@ -36,6 +36,7 @@ MODULE_LICENSE("GPL");
 MODULE_VERSION(DRV_MODULE_VERSION);
 
 #define VDC_TX_RING_SIZE       512
+#define VDC_DEFAULT_BLK_SIZE   512
 
 #define WAITING_FOR_LINK_UP    0x01
 #define WAITING_FOR_TX_SPACE   0x02
@@ -78,6 +79,7 @@ struct vdc_port {
        u32                     vdisk_size;
        u8                      vdisk_type;
        u8                      vdisk_mtype;
+       u32                     vdisk_phys_blksz;
 
        u8                      flags;
 
@@ -262,6 +264,11 @@ static int vdc_handle_attr(struct vio_driver_state *vio, void *arg)
                if (pkt->max_xfer_size < port->max_xfer_size)
                        port->max_xfer_size = pkt->max_xfer_size;
                port->vdisk_block_size = pkt->vdisk_block_size;
+
+               port->vdisk_phys_blksz = VDC_DEFAULT_BLK_SIZE;
+               if (vdc_version_supported(port, 1, 2))
+                       port->vdisk_phys_blksz = pkt->phys_block_size;
+
                return 0;
        } else {
                printk(KERN_ERR PFX "%s: Attribute NACK\n", vio->name);
@@ -932,6 +939,12 @@ static int probe_disk(struct vdc_port *port)
        if (err)
                return err;
 
+       /* Using version 1.2 means vdisk_phys_blksz should be set unless the
+        * disk is reserved by another system.
+        */
+       if (vdc_version_supported(port, 1, 2) && !port->vdisk_phys_blksz)
+               return -ENODEV;
+
        if (vdc_version_supported(port, 1, 1)) {
                /* vdisk_size should be set during the handshake, if it wasn't
                 * then the underlying disk is reserved by another system
@@ -1011,6 +1024,8 @@ static int probe_disk(struct vdc_port *port)
                }
        }
 
+       blk_queue_physical_block_size(q, port->vdisk_phys_blksz);
+
        pr_info(PFX "%s: %u sectors (%u MB) protocol %d.%d\n",
               g->disk_name,
               port->vdisk_size, (port->vdisk_size >> (20 - 9)),
@@ -1101,7 +1116,7 @@ static int vdc_port_probe(struct vio_dev *vdev, const struct vio_device_id *id)
        if (err)
                goto err_out_free_port;
 
-       port->vdisk_block_size = 512;
+       port->vdisk_block_size = VDC_DEFAULT_BLK_SIZE;
        port->max_xfer_size = ((128 * 1024) / port->vdisk_block_size);
        port->ring_cookies = ((port->max_xfer_size *
                               port->vdisk_block_size) / PAGE_SIZE) + 2;