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; }
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++; }