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) {
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;
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;
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) {
ret = storageBackendVolWipePloop(vol, algorithm);
} else {
ret = storageBackendVolWipeLocalFile(vol->target.path, algorithm,
- vol->target.allocation);
+ vol->target.allocation, false);
}
return ret;