mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 21:55:25 +00:00
storage: Extract logical device initialize into a helper
Make the remaining code a bit cleaner. Signed-off-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
71a08b5a5a
commit
d5cc5f8997
@ -81,6 +81,66 @@ virStorageBackendLogicalRemoveDevice(const char *path)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* @path: Path to the device
|
||||
*
|
||||
* Initialize and pvcreate the device.
|
||||
*
|
||||
* Returns 0 on success, -1 on failure with error message set
|
||||
*/
|
||||
static int
|
||||
virStorageBackendLogicalInitializeDevice(const char *path)
|
||||
{
|
||||
int fd = -1;
|
||||
char zeros[PV_BLANK_SECTOR_SIZE] = {0};
|
||||
int ret = -1;
|
||||
virCommandPtr pvcmd = NULL;
|
||||
|
||||
/*
|
||||
* LVM requires that the first sector is blanked if using
|
||||
* a whole disk as a PV. So we just blank them out regardless
|
||||
* rather than trying to figure out if we're a disk or partition
|
||||
*/
|
||||
if ((fd = open(path, O_WRONLY)) < 0) {
|
||||
virReportSystemError(errno, _("cannot open device '%s'"), path);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (safewrite(fd, zeros, sizeof(zeros)) < 0) {
|
||||
virReportSystemError(errno, _("cannot clear device header of '%s'"),
|
||||
path);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (fsync(fd) < 0) {
|
||||
virReportSystemError(errno, _("cannot flush header of device'%s'"),
|
||||
path);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (VIR_CLOSE(fd) < 0) {
|
||||
virReportSystemError(errno, _("cannot close device '%s'"), path);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the physical volume because vgcreate is not
|
||||
* clever enough todo this for us :-(
|
||||
*/
|
||||
pvcmd = virCommandNewArgList(PVCREATE, path, NULL);
|
||||
if (virCommandRun(pvcmd, NULL) < 0)
|
||||
goto cleanup;
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
VIR_FORCE_CLOSE(fd);
|
||||
virCommandFree(pvcmd);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
#define VIR_STORAGE_VOL_LOGICAL_SEGTYPE_STRIPED "striped"
|
||||
#define VIR_STORAGE_VOL_LOGICAL_SEGTYPE_MIRROR "mirror"
|
||||
#define VIR_STORAGE_VOL_LOGICAL_SEGTYPE_RAID "raid"
|
||||
@ -700,65 +760,20 @@ virStorageBackendLogicalBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED,
|
||||
unsigned int flags)
|
||||
{
|
||||
virCommandPtr vgcmd;
|
||||
int fd;
|
||||
char zeros[PV_BLANK_SECTOR_SIZE];
|
||||
int ret = -1;
|
||||
size_t i;
|
||||
|
||||
virCheckFlags(0, -1);
|
||||
|
||||
memset(zeros, 0, sizeof(zeros));
|
||||
|
||||
vgcmd = virCommandNewArgList(VGCREATE, pool->def->source.name, NULL);
|
||||
|
||||
for (i = 0; i < pool->def->source.ndevice; i++) {
|
||||
virCommandPtr pvcmd;
|
||||
/*
|
||||
* LVM requires that the first sector is blanked if using
|
||||
* a whole disk as a PV. So we just blank them out regardless
|
||||
* rather than trying to figure out if we're a disk or partition
|
||||
*/
|
||||
if ((fd = open(pool->def->source.devices[i].path, O_WRONLY)) < 0) {
|
||||
virReportSystemError(errno,
|
||||
_("cannot open device '%s'"),
|
||||
pool->def->source.devices[i].path);
|
||||
goto cleanup;
|
||||
}
|
||||
if (safewrite(fd, zeros, sizeof(zeros)) < 0) {
|
||||
virReportSystemError(errno,
|
||||
_("cannot clear device header of '%s'"),
|
||||
pool->def->source.devices[i].path);
|
||||
VIR_FORCE_CLOSE(fd);
|
||||
goto cleanup;
|
||||
}
|
||||
if (fsync(fd) < 0) {
|
||||
virReportSystemError(errno,
|
||||
_("cannot flush header of device'%s'"),
|
||||
pool->def->source.devices[i].path);
|
||||
VIR_FORCE_CLOSE(fd);
|
||||
goto cleanup;
|
||||
}
|
||||
if (VIR_CLOSE(fd) < 0) {
|
||||
virReportSystemError(errno,
|
||||
_("cannot close device '%s'"),
|
||||
pool->def->source.devices[i].path);
|
||||
goto cleanup;
|
||||
}
|
||||
const char *path = pool->def->source.devices[i].path;
|
||||
|
||||
/*
|
||||
* Initialize the physical volume because vgcreate is not
|
||||
* clever enough todo this for us :-(
|
||||
*/
|
||||
pvcmd = virCommandNewArgList(PVCREATE,
|
||||
pool->def->source.devices[i].path,
|
||||
NULL);
|
||||
if (virCommandRun(pvcmd, NULL) < 0) {
|
||||
virCommandFree(pvcmd);
|
||||
if (virStorageBackendLogicalInitializeDevice(path) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
virCommandFree(pvcmd);
|
||||
|
||||
virCommandAddArg(vgcmd, pool->def->source.devices[i].path);
|
||||
virCommandAddArg(vgcmd, path);
|
||||
}
|
||||
|
||||
/* Now create the volume group itself */
|
||||
|
Loading…
Reference in New Issue
Block a user