From 73114abb7437db2e4625a64377005ddaf8f17840 Mon Sep 17 00:00:00 2001 Message-Id: <73114abb7437db2e4625a64377005ddaf8f17840@dist-git> From: John Ferlan Date: Wed, 26 Apr 2017 08:41:10 -0400 Subject: [PATCH] storage: Modify storageBackendWipeLocal to allow zero from end of device https://bugzilla.redhat.com/show_bug.cgi?id=1439132 Add bool 'zero_end' and logic that would allow a caller to wipe specific portions of a target device either from the beginning (the default) or from the end when zero_end is true. This will allow for this code to wipe out partition table information from a device. (cherry picked from commit 859a2d162ac6dd141539819cfc6157724d12bde6) Signed-off-by: John Ferlan Signed-off-by: Jiri Denemark --- src/storage/storage_util.c | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c index adec9ab6f..8dbdc770e 100644 --- a/src/storage/storage_util.c +++ b/src/storage/storage_util.c @@ -2516,26 +2516,38 @@ static int storageBackendWipeLocal(const char *path, int fd, unsigned long long wipe_len, - size_t writebuf_length) + size_t writebuf_length, + bool zero_end) { int ret = -1, written = 0; unsigned long long remaining = 0; + off_t size; size_t write_size = 0; char *writebuf = NULL; - VIR_DEBUG("wiping start: 0 len: %llu", wipe_len); - if (VIR_ALLOC_N(writebuf, writebuf_length) < 0) goto cleanup; - if (lseek(fd, 0, SEEK_SET) < 0) { - virReportSystemError(errno, - _("Failed to seek to the start in volume " - "with path '%s'"), - path); - goto cleanup; + if (!zero_end) { + if ((size = lseek(fd, 0, SEEK_SET)) < 0) { + virReportSystemError(errno, + _("Failed to seek to the start in volume " + "with path '%s'"), + path); + goto cleanup; + } + } else { + if ((size = lseek(fd, -wipe_len, SEEK_END)) < 0) { + virReportSystemError(errno, + _("Failed to seek to %llu bytes to the end " + "in volume with path '%s'"), + wipe_len, path); + goto cleanup; + } } + VIR_DEBUG("wiping start: %zd len: %llu", (ssize_t) size, wipe_len); + remaining = wipe_len; while (remaining > 0) { @@ -2573,7 +2585,8 @@ storageBackendWipeLocal(const char *path, static int storageBackendVolWipeLocalFile(const char *path, unsigned int algorithm, - unsigned long long allocation) + unsigned long long allocation, + bool zero_end) { int ret = -1, fd = -1; const char *alg_char = NULL; @@ -2648,7 +2661,8 @@ storageBackendVolWipeLocalFile(const char *path, if (S_ISREG(st.st_mode) && st.st_blocks < (st.st_size / DEV_BSIZE)) { ret = storageBackendVolZeroSparseFileLocal(path, st.st_size, fd); } else { - ret = storageBackendWipeLocal(path, fd, allocation, st.st_blksize); + ret = storageBackendWipeLocal(path, fd, allocation, st.st_blksize, + zero_end); } if (ret < 0) goto cleanup; @@ -2686,7 +2700,7 @@ storageBackendVolWipePloop(virStorageVolDefPtr vol, goto cleanup; if (storageBackendVolWipeLocalFile(target_path, algorithm, - vol->target.allocation) < 0) + vol->target.allocation, false) < 0) goto cleanup; if (virFileRemove(disk_desc, 0, 0) < 0) { @@ -2735,7 +2749,7 @@ virStorageBackendVolWipeLocal(virConnectPtr conn ATTRIBUTE_UNUSED, ret = storageBackendVolWipePloop(vol, algorithm); } else { ret = storageBackendVolWipeLocalFile(vol->target.path, algorithm, - vol->target.allocation); + vol->target.allocation, false); } return ret; -- 2.12.2