This is a note to let you know that I've just added the patch titled

    sunvdc: compute vdisk geometry from capacity

to the 3.10-stable tree which can be found at:
    
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     sunvdc-compute-vdisk-geometry-from-capacity.patch
and it can be found in the queue-3.10 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <[email protected]> know about it.


>From foo@baz Tue Nov 18 09:08:47 PST 2014
From: Allen Pais <[email protected]>
Date: Fri, 19 Sep 2014 09:42:26 -0400
Subject: sunvdc: compute vdisk geometry from capacity

From: Allen Pais <[email protected]>

[ Upstream commit de5b73f08468b4fc5e2f6d1505f650262622f78b ]

The LDom diskserver doesn't return reliable geometry data. In addition,
the types for all fields in the vio_disk_geom are u16, which were being
truncated in the cast into the u8's of the Linux struct hd_geometry.

Modify vdc_getgeo() to compute the geometry from the disk's capacity in a
manner consistent with xen-blkfront::blkif_getgeo().

Signed-off-by: Dwight Engen <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
---
 drivers/block/sunvdc.c |   23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

--- a/drivers/block/sunvdc.c
+++ b/drivers/block/sunvdc.c
@@ -70,7 +70,6 @@ struct vdc_port {
 
        char                    disk_name[32];
 
-       struct vio_disk_geom    geom;
        struct vio_disk_vtoc    label;
 };
 
@@ -103,11 +102,15 @@ static inline u32 vdc_tx_dring_avail(str
 static int vdc_getgeo(struct block_device *bdev, struct hd_geometry *geo)
 {
        struct gendisk *disk = bdev->bd_disk;
-       struct vdc_port *port = disk->private_data;
+       sector_t nsect = get_capacity(disk);
+       sector_t cylinders = nsect;
 
-       geo->heads = (u8) port->geom.num_hd;
-       geo->sectors = (u8) port->geom.num_sec;
-       geo->cylinders = port->geom.num_cyl;
+       geo->heads = 0xff;
+       geo->sectors = 0x3f;
+       sector_div(cylinders, geo->heads * geo->sectors);
+       geo->cylinders = cylinders;
+       if ((sector_t)(geo->cylinders + 1) * geo->heads * geo->sectors < nsect)
+               geo->cylinders = 0xffff;
 
        return 0;
 }
@@ -714,16 +717,18 @@ static int probe_disk(struct vdc_port *p
                if (port->vdisk_size == -1)
                        return -ENODEV;
        } else {
+               struct vio_disk_geom geom;
+
                err = generic_request(port, VD_OP_GET_DISKGEOM,
-                                     &port->geom, sizeof(port->geom));
+                                     &geom, sizeof(geom));
                if (err < 0) {
                        printk(KERN_ERR PFX "VD_OP_GET_DISKGEOM returns "
                               "error %d\n", err);
                        return err;
                }
-               port->vdisk_size = ((u64)port->geom.num_cyl *
-                                   (u64)port->geom.num_hd *
-                                   (u64)port->geom.num_sec);
+               port->vdisk_size = ((u64)geom.num_cyl *
+                                   (u64)geom.num_hd *
+                                   (u64)geom.num_sec);
        }
 
        q = blk_init_queue(do_vdc_request, &port->vio.lock);


Patches currently in stable-queue which might be from [email protected] are

queue-3.10/sunvdc-compute-vdisk-geometry-from-capacity.patch
queue-3.10/sunvdc-add-cdrom-and-v1.1-protocol-support.patch
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to