static const char *find_nonexistent_disk(void)
{
    static char disk[OS_PATH_MAX];
    char drive[3] = "?:";

    /* Find first non-existent disk, skipping A: and B: (floppies)
       and C: (system) */
    for (drive[0] = 'D'; drive[0] <= 'Z'; drive[0]++)
    {
        os_disk_normalize_path(drive, disk, sizeof(disk));
        if (os_disk_open_raw(disk, OS_DISK_READ) == -ENOENT)
            return disk;
    }

    return NULL;
}
Exemple #2
0
	xml_conf_xpath_result_for_each(xmldisk_set, xmldisk, i)
	{
	    const char *path_prop;
	    const char *node_name;
	    char path[EXA_MAXSIZE_DEVPATH + 1];
	    struct adm_disk *disk;
	    struct adm_node *node;

	    node_name = xml_get_prop(xmldisk, "node");
	    node = adm_cluster_get_node_by_name(node_name);
	    if (!node)
	    {
		set_error(err_desc, -ADMIND_ERR_UNKNOWN_NODENAME,
			  "Node '%s' is not part of the cluster.", node_name);
		xml_conf_xpath_free(xmldisk_set);
		return;
	    }

	    path_prop = xml_get_prop(xmldisk, "path");
	    os_disk_normalize_path(path_prop, path, sizeof(path));

	    exalog_debug("Checking rdev '%s:%s' is not already used", node_name, path);

	    if (info->nb_disks >= NBMAX_DISKS_PER_GROUP)
	    {
		set_error(err_desc, -ADMIND_ERR_TOO_MANY_DISKS_IN_GROUP,
			  "too many disks in group (> %d)", NBMAX_DISKS_PER_GROUP);
		xml_conf_xpath_free(xmldisk_set);
		return;
	    }

	    disk = adm_cluster_get_disk_by_path(node_name, path);
	    if (!disk)
	    {
		set_error(err_desc, -ADMIND_ERR_UNKNOWN_DISK,
			  "disk '%s:%s' is unknown", node_name, path);
		xml_conf_xpath_free(xmldisk_set);
		return;
	    }

	    uuid_copy(&info->disks[info->nb_disks], &disk->uuid);
	    info->nb_disks++;
	}