build diskmap using libperfstat and odm rather than lspv on 5.x
This commit is contained in:
parent
6c366f4842
commit
61664d00df
|
@ -1474,7 +1474,7 @@ static void diskio_free(void *data)
|
||||||
* need to build a mount point => diskname map.
|
* need to build a mount point => diskname map.
|
||||||
* see 'lspv -l hdisk0' for example.
|
* see 'lspv -l hdisk0' for example.
|
||||||
*/
|
*/
|
||||||
static int create_diskmap(sigar_t *sigar)
|
static int create_diskmap_v4(sigar_t *sigar)
|
||||||
{
|
{
|
||||||
FILE *fp = popen(LSPV_CMD, "r");
|
FILE *fp = popen(LSPV_CMD, "r");
|
||||||
char buffer[BUFSIZ], *ptr;
|
char buffer[BUFSIZ], *ptr;
|
||||||
|
@ -1532,6 +1532,87 @@ static int create_diskmap(sigar_t *sigar)
|
||||||
pclose(fp);
|
pclose(fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int create_diskmap_v5(sigar_t *sigar)
|
||||||
|
{
|
||||||
|
int i, total, num;
|
||||||
|
perfstat_disk_t *disk;
|
||||||
|
perfstat_id_t id;
|
||||||
|
|
||||||
|
sigar_perfstat_init(sigar);
|
||||||
|
if (!sigar->perfstat.disk) {
|
||||||
|
return SIGAR_ENOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
total = sigar->perfstat.disk(NULL, NULL, sizeof(*disk), 0);
|
||||||
|
if (total < 1) {
|
||||||
|
return ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
disk = malloc(total * sizeof(*disk));
|
||||||
|
id.name[0] = '\0';
|
||||||
|
|
||||||
|
num = sigar->perfstat.disk(&id, disk, sizeof(*disk), total);
|
||||||
|
if (num < 1) {
|
||||||
|
free(disk);
|
||||||
|
return ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
sigar->diskmap = sigar_cache_new(25);
|
||||||
|
sigar->diskmap->free_value = diskio_free;
|
||||||
|
|
||||||
|
odm_initialize();
|
||||||
|
|
||||||
|
for (i=0; i<num; i++) {
|
||||||
|
char query[256];
|
||||||
|
struct CuDv *dv, *ptr;
|
||||||
|
struct listinfo info;
|
||||||
|
sigar_cache_entry_t *ent;
|
||||||
|
int j;
|
||||||
|
|
||||||
|
sprintf(query, "parent = '%s'", disk[i].vgname);
|
||||||
|
|
||||||
|
ptr = dv = odm_get_list(CuDv_CLASS, query, &info, 256, 1);
|
||||||
|
if ((int)dv == -1) {
|
||||||
|
continue; /* XXX */
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j=0; j<info.num; j++, ptr++) {
|
||||||
|
struct CuAt *attr;
|
||||||
|
int num, retval;
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
|
if ((attr = getattr(ptr->name, "label", 0, &num))) {
|
||||||
|
retval = stat(attr->value, &sb);
|
||||||
|
ent = sigar_cache_get(sigar->diskmap, FSDEV_ID(sb));
|
||||||
|
|
||||||
|
if (retval == 0) {
|
||||||
|
aix_diskio_t *diskio = malloc(sizeof(*diskio));
|
||||||
|
diskio->name = strdup(disk[i].name);
|
||||||
|
diskio->addr = -1;
|
||||||
|
ent->value = diskio;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(attr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
odm_free_list(dv, &info);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(disk);
|
||||||
|
odm_terminate();
|
||||||
|
|
||||||
|
return SIGAR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int create_diskmap(sigar_t *sigar)
|
||||||
|
{
|
||||||
|
if (create_diskmap_v5(sigar) != SIGAR_OK) {
|
||||||
|
return create_diskmap_v4(sigar);
|
||||||
|
}
|
||||||
|
return SIGAR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static int get_perfstat_disk_metrics(sigar_t *sigar,
|
static int get_perfstat_disk_metrics(sigar_t *sigar,
|
||||||
sigar_file_system_usage_t *fsusage,
|
sigar_file_system_usage_t *fsusage,
|
||||||
aix_diskio_t *diskio)
|
aix_diskio_t *diskio)
|
||||||
|
|
Loading…
Reference in New Issue