Re: [libvirt] [PATCH] storage: forbid rebuilding existing disk storage pools
On Mon, Nov 14, 2011 at 12:58:08PM +0800, Osier Yang wrote: 于 2011年11月13日 00:19, Guido Günther 写道: which would blow away all volumes. Honor VIR_STORAGE_POOL_BUILD_OVERWRITE to force a rebuild. This was caught by libvirt-tck's storage/110-disk-pool.t. Cheers, -- Guido --- src/storage/storage_backend_disk.c | 72 ++-- 1 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c index 82d6e8a..995ad2f 100644 --- a/src/storage/storage_backend_disk.c +++ b/src/storage/storage_backend_disk.c @@ -335,6 +335,40 @@ virStorageBackendDiskRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED, /** + * Check for a valid disk label (partition table) on device + * + * return: 0 - valid disk label found + *0 - no or unrecognized disk label + *0 - error finding the disk label + */ +static int +virStorageBackendDiskFindLabel(const char* device) +{ +const char *const args[] = { +device, print, --script, NULL, +}; +virCommandPtr cmd = virCommandNew(PARTED); +char *output = NULL; +int ret = -1; + +virCommandAddArgSet(cmd, args); +virCommandAddEnvString(cmd, LC_ALL=C); +virCommandSetOutputBuffer(cmd,output); + +/* if parted succeeds we have a valid partition table */ +ret = virCommandRun(cmd, NULL); +if (ret 0) { +if (strstr (output, unrecognised disk label)) +ret = 1; +} + +virCommandFree(cmd); +VIR_FREE(output); +return ret; +} + + +/** * Write a new partition table header */ static int @@ -342,6 +376,8 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED, virStoragePoolObjPtr pool, unsigned int flags) { +bool ok_to_mklabel = false; +int ret = -1; /* eg parted /dev/sda mklabel msdos */ const char *prog[] = { PARTED, @@ -353,12 +389,40 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED, NULL, }; -virCheckFlags(0, -1); +virCheckFlags(VIR_STORAGE_POOL_BUILD_OVERWRITE | + VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, ret); -if (virRun(prog, NULL) 0) -return -1; +if (flags == (VIR_STORAGE_POOL_BUILD_OVERWRITE | + VIR_STORAGE_POOL_BUILD_NO_OVERWRITE)) { +virStorageReportError(VIR_ERR_OPERATION_INVALID, + _(Overwrite and no overwrite flags + are mutually exclusive)); +goto error; +} -return 0; +if (flags VIR_STORAGE_POOL_BUILD_OVERWRITE) +ok_to_mklabel = true; +else { +int check; + +check = virStorageBackendDiskFindLabel ( +pool-def-source.devices[0].path); +if (check 0) { +ok_to_mklabel = true; +} else if (check 0) { +virStorageReportError(VIR_ERR_OPERATION_FAILED, + _(Error checking for disk label)); +} else { +virStorageReportError(VIR_ERR_OPERATION_INVALID, + _(Disk label already present)); +} +} + +if (ok_to_mklabel) +ret = virRun(prog, NULL); + +error: +return ret; } /** Looks fine, and having the flags is better, ACK Pushed. Thanks. -- Guido -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] storage: forbid rebuilding existing disk storage pools
于 2011年11月13日 00:19, Guido Günther 写道: which would blow away all volumes. Honor VIR_STORAGE_POOL_BUILD_OVERWRITE to force a rebuild. This was caught by libvirt-tck's storage/110-disk-pool.t. Cheers, -- Guido --- src/storage/storage_backend_disk.c | 72 ++-- 1 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c index 82d6e8a..995ad2f 100644 --- a/src/storage/storage_backend_disk.c +++ b/src/storage/storage_backend_disk.c @@ -335,6 +335,40 @@ virStorageBackendDiskRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED, /** + * Check for a valid disk label (partition table) on device + * + * return: 0 - valid disk label found + *0 - no or unrecognized disk label + *0 - error finding the disk label + */ +static int +virStorageBackendDiskFindLabel(const char* device) +{ +const char *const args[] = { +device, print, --script, NULL, +}; +virCommandPtr cmd = virCommandNew(PARTED); +char *output = NULL; +int ret = -1; + +virCommandAddArgSet(cmd, args); +virCommandAddEnvString(cmd, LC_ALL=C); +virCommandSetOutputBuffer(cmd,output); + +/* if parted succeeds we have a valid partition table */ +ret = virCommandRun(cmd, NULL); +if (ret 0) { +if (strstr (output, unrecognised disk label)) +ret = 1; +} + +virCommandFree(cmd); +VIR_FREE(output); +return ret; +} + + +/** * Write a new partition table header */ static int @@ -342,6 +376,8 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED, virStoragePoolObjPtr pool, unsigned int flags) { +bool ok_to_mklabel = false; +int ret = -1; /* eg parted /dev/sda mklabel msdos */ const char *prog[] = { PARTED, @@ -353,12 +389,40 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED, NULL, }; -virCheckFlags(0, -1); +virCheckFlags(VIR_STORAGE_POOL_BUILD_OVERWRITE | + VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, ret); -if (virRun(prog, NULL) 0) -return -1; +if (flags == (VIR_STORAGE_POOL_BUILD_OVERWRITE | + VIR_STORAGE_POOL_BUILD_NO_OVERWRITE)) { +virStorageReportError(VIR_ERR_OPERATION_INVALID, + _(Overwrite and no overwrite flags + are mutually exclusive)); +goto error; +} -return 0; +if (flags VIR_STORAGE_POOL_BUILD_OVERWRITE) +ok_to_mklabel = true; +else { +int check; + +check = virStorageBackendDiskFindLabel ( +pool-def-source.devices[0].path); +if (check 0) { +ok_to_mklabel = true; +} else if (check 0) { +virStorageReportError(VIR_ERR_OPERATION_FAILED, + _(Error checking for disk label)); +} else { +virStorageReportError(VIR_ERR_OPERATION_INVALID, + _(Disk label already present)); +} +} + +if (ok_to_mklabel) +ret = virRun(prog, NULL); + +error: +return ret; } /** Looks fine, and having the flags is better, ACK Osier -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH] storage: forbid rebuilding existing disk storage pools
which would blow away all volumes. Honor VIR_STORAGE_POOL_BUILD_OVERWRITE to force a rebuild. This was caught by libvirt-tck's storage/110-disk-pool.t. Cheers, -- Guido --- src/storage/storage_backend_disk.c | 72 ++-- 1 files changed, 68 insertions(+), 4 deletions(-) diff --git a/src/storage/storage_backend_disk.c b/src/storage/storage_backend_disk.c index 82d6e8a..995ad2f 100644 --- a/src/storage/storage_backend_disk.c +++ b/src/storage/storage_backend_disk.c @@ -335,6 +335,40 @@ virStorageBackendDiskRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED, /** + * Check for a valid disk label (partition table) on device + * + * return: 0 - valid disk label found + *0 - no or unrecognized disk label + *0 - error finding the disk label + */ +static int +virStorageBackendDiskFindLabel(const char* device) +{ +const char *const args[] = { +device, print, --script, NULL, +}; +virCommandPtr cmd = virCommandNew(PARTED); +char *output = NULL; +int ret = -1; + +virCommandAddArgSet(cmd, args); +virCommandAddEnvString(cmd, LC_ALL=C); +virCommandSetOutputBuffer(cmd, output); + +/* if parted succeeds we have a valid partition table */ +ret = virCommandRun(cmd, NULL); +if (ret 0) { +if (strstr (output, unrecognised disk label)) +ret = 1; +} + +virCommandFree(cmd); +VIR_FREE(output); +return ret; +} + + +/** * Write a new partition table header */ static int @@ -342,6 +376,8 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED, virStoragePoolObjPtr pool, unsigned int flags) { +bool ok_to_mklabel = false; +int ret = -1; /* eg parted /dev/sda mklabel msdos */ const char *prog[] = { PARTED, @@ -353,12 +389,40 @@ virStorageBackendDiskBuildPool(virConnectPtr conn ATTRIBUTE_UNUSED, NULL, }; -virCheckFlags(0, -1); +virCheckFlags(VIR_STORAGE_POOL_BUILD_OVERWRITE | + VIR_STORAGE_POOL_BUILD_NO_OVERWRITE, ret); -if (virRun(prog, NULL) 0) -return -1; +if (flags == (VIR_STORAGE_POOL_BUILD_OVERWRITE | + VIR_STORAGE_POOL_BUILD_NO_OVERWRITE)) { +virStorageReportError(VIR_ERR_OPERATION_INVALID, + _(Overwrite and no overwrite flags + are mutually exclusive)); +goto error; +} -return 0; +if (flags VIR_STORAGE_POOL_BUILD_OVERWRITE) +ok_to_mklabel = true; +else { +int check; + +check = virStorageBackendDiskFindLabel ( +pool-def-source.devices[0].path); +if (check 0) { +ok_to_mklabel = true; +} else if (check 0) { +virStorageReportError(VIR_ERR_OPERATION_FAILED, + _(Error checking for disk label)); +} else { +virStorageReportError(VIR_ERR_OPERATION_INVALID, + _(Disk label already present)); +} +} + +if (ok_to_mklabel) +ret = virRun(prog, NULL); + +error: +return ret; } /** -- 1.7.7.1 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list