[libvirt] [PATCH 3/5] disk geometry
Daniel P. Berrange
berrange at redhat.com
Thu Jun 25 09:19:03 UTC 2009
On Wed, Jun 24, 2009 at 11:17:49AM +0200, Henrik Persson wrote:
> Reads the disk geometry to be able to align disk partitions on cylinder boundries.
> Msdos partition tables really like this stuff.
> --- libvirt-0.6.4.org/src/parthelper.c 2009-06-23 13:07:38.167048000 +0200
> +++ libvirt-0.6.4/src/parthelper.c 2009-06-23 17:13:27.636892000 +0200
> @@ -41,14 +41,22 @@
> # define PED_PARTITION_PROTECTED 0
> #endif
>
> +enum diskCommand {
> + DISK_LAYOUT = 0,
> + DISK_GEOMETRY
> +};
> +
> int main(int argc, char **argv)
> {
> PedDevice *dev;
> PedDisk *disk;
> PedPartition *part;
> + int cmd = DISK_LAYOUT;
>
> - if (argc != 2) {
> - fprintf(stderr, "syntax: %s DEVICE\n", argv[0]);
> + if (argc == 3 && !strcmp(argv[2], "-g")) {
> + cmd = DISK_GEOMETRY;
> + } else if (argc != 2) {
> + fprintf(stderr, "syntax: %s DEVICE [-g]\n", argv[0]);
> return 1;
> }
>
> @@ -57,6 +65,15 @@ int main(int argc, char **argv)
> return 2;
> }
>
> + /* return the geometry of the disk and then exit */
> + if(cmd == DISK_GEOMETRY) {
> + printf("%d%c%d%c%d%c%",
> + dev->hw_geom.cylinders, '\0',
> + dev->hw_geom.heads, '\0',
> + dev->hw_geom.sectors, '\0');
> + return 0;
> + }
> +
> if ((disk = ped_disk_new(dev)) == NULL) {
> fprintf(stderr, "unable to access disk %s\n", argv[1]);
> return 2;
> --- libvirt-0.6.4.org/src/storage_conf.h 2009-06-23 16:46:47.946019000 +0200
> +++ libvirt-0.6.4/src/storage_conf.h 2009-06-23 17:38:23.705006000 +0200
> @@ -188,6 +188,13 @@ struct _virStoragePoolSourceDevice {
> virStoragePoolSourceDeviceExtentPtr freeExtents;
> char *path;
> int format; /* Pool specific source format */
> + /* When the source device is a physical disk,
> + the geometry data is needed */
> + struct _geometry {
> + int cyliders;
> + int heads;
> + int sectors;
> + } geometry;
> };
>
>
> --- libvirt-0.6.4.org/src/storage_backend_disk.c 2009-06-23 16:46:47.957024000 +0200
> +++ libvirt-0.6.4/src/storage_backend_disk.c 2009-06-23 17:47:35.118203000 +0200
> @@ -303,6 +303,35 @@ virStorageBackendDiskReadPartitions(virC
> vol);
> }
>
> +static int
> +virStorageBackendDiskMakePoolGeometry(virConnectPtr conn ATTRIBUTE_UNUSED,
> + virStoragePoolObjPtr pool,
> + size_t ntok ATTRIBUTE_UNUSED,
> + char **const groups,
> + void *data ATTRIBUTE_UNUSED)
> +{
> +
> + pool->def->source.devices[0].geometry.cyliders = atoi(groups[0]);
> + pool->def->source.devices[0].geometry.heads = atoi(groups[1]);
> + pool->def->source.devices[0].geometry.sectors = atoi(groups[2]);
> +
> + return 0;
> +}
> +
> +static int
> +virStorageBackendDiskReadGeometry(virConnectPtr conn, virStoragePoolObjPtr pool)
> +{
> + const char *prog[] = {
> + PARTHELPER, pool->def->source.devices[0].path, "-g", NULL,
> + };
> +
> + return virStorageBackendRunProgNul(conn,
> + pool,
> + prog,
> + 3,
> + virStorageBackendDiskMakePoolGeometry,
> + NULL);
> +}
>
> static int
> virStorageBackendDiskRefreshPool(virConnectPtr conn,
> @@ -313,6 +342,10 @@ virStorageBackendDiskRefreshPool(virConn
>
> virStorageBackendWaitForDevices(conn);
>
> + if (virStorageBackendDiskReadGeometry(conn, pool) != 0) {
> + return -1;
> + }
> +
> return virStorageBackendDiskReadPartitions(conn, pool, NULL);
> }
>
Was rather hoping parted did this kind of alignment for us, but it seems
not. ACK to this, since it is internal only and we can change it if
a better way turns up in the future.
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list