https://bugzilla.redhat.com/show_bug.cgi?id=1430679
As it turns out some file headers (e.g. ext4) may be larger/longer than
the 512 bytes of zeros being written prior to a pvcreate, so let's write
out 2048 bytes similar to how the pvcreate sources would peek at the first
4 sectors of the device.
Make sure there is at enough bytes on the device to clear before doing
doing the clear - just to be sure.
Signed-off-by: John Ferlan <jferlan(a)redhat.com>
---
src/storage/storage_backend_logical.c | 22 +++++++++++++++++++++-
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/src/storage/storage_backend_logical.c
b/src/storage/storage_backend_logical.c
index 29d63b1..9ca6fd4 100644
--- a/src/storage/storage_backend_logical.c
+++ b/src/storage/storage_backend_logical.c
@@ -93,7 +93,8 @@ static int
virStorageBackendLogicalInitializeDevice(const char *path)
{
int fd = -1;
- char zeros[PV_BLANK_SECTOR_SIZE] = {0};
+ char zeros[4 * PV_BLANK_SECTOR_SIZE] = {0};
+ off_t size;
int ret = -1;
virCommandPtr pvcmd = NULL;
@@ -107,6 +108,25 @@ virStorageBackendLogicalInitializeDevice(const char *path)
return -1;
}
+ if ((size = lseek(fd, 0, SEEK_END)) == (off_t)-1) {
+ virReportSystemError(errno,
+ _("failed to seek to end of %s"), path);
+ goto cleanup;
+ }
+
+ if (size < 4 * PV_BLANK_SECTOR_SIZE) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
+ _("cannot initialize '%s' detected size='%lu'
less "
+ "than minimum required='%d"),
+ path, size, 4 * PV_BLANK_SECTOR_SIZE);
+ goto cleanup;
+ }
+ if ((size = lseek(fd, 0, SEEK_SET)) == (off_t)-1) {
+ virReportSystemError(errno,
+ _("failed to seek to start of %s"), path);
+ goto cleanup;
+ }
+
if (safewrite(fd, zeros, sizeof(zeros)) < 0) {
virReportSystemError(errno, _("cannot clear device header of
'%s'"),
path);
--
2.9.3