[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

sanity check

From: Don Mulvey
Subject: sanity check
Date: Mon, 5 Nov 2001 11:04:55 -0600

Hi Andrew,

As you know, I have been playing a bit with libparted and trying to run
through evms partition discovery by making libparted calls.   I have a bit
of code from the discovery piece that I wanted to show you.    In the
following code, a segment manager has been called by the evms engine to
discover partitions on a disk and create a partition list.   The code is
passed a storage object (type==disk) and is suppose to use the i/o routines
and geometry info provided by the disk storage object.   Ok?   The approach
is to build a PedDevice with the same info as the disk storage object and
then continue with the partition discovery process.   So,  I first get a
PedDevice from libparted and then fill in information  from the storage
object; most importantly:  geometry, size and read/write routines.    Then,
I call libparted to malloc a PedDisk,  ident the partition scheme, probe
the partition tables and attach a list of partitions to the PedDisk ...
that I hope to get back.    Currently, I am getting as far as read_table()
( in disk_dos.c  ) but then failing on partition checks.  I think it is due
to reported geometry and invalid partition allignment.   However,  I have a
very simple partition scheme, cylinder allingment, etc. and believe I am
simply not telling parted the correct info ... someplace.   The test disk
(C=827,H=64,S=63)  has 3 logical drives in an extended partition.
Libparted coughs right away ... doesnt like the extended partition record
in the mbr.    The  extended  starts (0,1,1)  and ends (8,63,63).   Could
you take a look and tell me if I am crazy or not?     Thanks,  Don

    sprintf(disk_name, "/dev/%s", ld->name);   // ld==disk storage object ... 
ld->name == hda, hdb, etc
    disk_pdata->ped_device = ped_device_get(disk_name);
    if (disk_pdata->ped_device) {  // disk_pdata == ld private data

        struct plugin_functions_s  *fncs = (struct plugin_functions_s 

        EvmsSpecific               *evms = (EvmsSpecific 

        evms->object      = (void *) ld;
        evms->size        = ld->size;
        evms->read        = fncs->read;
        evms->write       = fncs->write;

        disk_pdata->ped_device->open_count = 1;
        disk_pdata->ped_device->cylinders = ld->geometry.cylinders;
        disk_pdata->ped_device->heads     = ld->geometry.heads;
        disk_pdata->ped_device->sectors   = ld->geometry.sectors_per_track;
        disk_pdata->ped_device->geom_known = 1;
        disk_pdata->ped_device->length     = ld->size;

        disk_pdata->ped_disk = ped_disk_new (disk_pdata->ped_device);
        if (disk_pdata->ped_disk){
            parted_do_print(disk_pdata->ped_device, disk_pdata->ped_disk);
        else {
            LOG_ERROR("error, ped_disk_new() failed\n");
            rc = -ENODEV;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]