diff --git a/internal/server/storage/drivers/driver_lvm.go b/internal/server/storage/drivers/driver_lvm.go index e0708073733..4133ffe78bd 100644 --- a/internal/server/storage/drivers/driver_lvm.go +++ b/internal/server/storage/drivers/driver_lvm.go @@ -143,6 +143,7 @@ func (d *lvm) Info() Info { MountedRoot: false, Buckets: !d.isRemote(), Deactivate: d.isRemote(), + ZeroUnpack: !d.usesThinpool(), } } diff --git a/internal/server/storage/drivers/driver_types.go b/internal/server/storage/drivers/driver_types.go index c1d1a377fcc..8a5830ecb84 100644 --- a/internal/server/storage/drivers/driver_types.go +++ b/internal/server/storage/drivers/driver_types.go @@ -19,6 +19,7 @@ type Info struct { IOUring bool // Whether the driver supports io_uring. MountedRoot bool // Whether the pool directory itself is a mount. Deactivate bool // Whether an unmount action is required prior to removing the pool. + ZeroUnpack bool // Whether to write zeroes (no discard) during unpacking. } // VolumeFiller provides a struct for filling a volume. diff --git a/internal/server/storage/drivers/generic_vfs.go b/internal/server/storage/drivers/generic_vfs.go index 4c8cf6aa6f5..4d8b1e053eb 100644 --- a/internal/server/storage/drivers/generic_vfs.go +++ b/internal/server/storage/drivers/generic_vfs.go @@ -350,7 +350,12 @@ func genericVFSCreateVolumeFromMigration(d Driver, initVolume func(vol Volume) ( d.Logger().Debug("Receiving block volume started", logger.Ctx{"volName": volName, "path": path}) defer d.Logger().Debug("Receiving block volume stopped", logger.Ctx{"volName": volName, "path": path}) - _, err = io.Copy(NewSparseFileWrapper(to), fromPipe) + toPipe := io.Writer(to) + if !d.Info().ZeroUnpack { + toPipe = NewSparseFileWrapper(to) + } + + _, err = io.Copy(toPipe, fromPipe) if err != nil { return fmt.Errorf("Error copying from migration connection to %q: %w", path, err) } @@ -816,8 +821,13 @@ func genericVFSBackupUnpack(d Driver, sysOS *sys.OS, vol Volume, snapshots []str } // Copy the data. + toPipe := io.Writer(to) + if !d.Info().ZeroUnpack { + toPipe = NewSparseFileWrapper(to) + } + d.Logger().Debug(logMsg, logger.Ctx{"source": srcFile, "target": targetPath}) - _, err = io.Copy(NewSparseFileWrapper(to), tr) + _, err = io.Copy(toPipe, tr) if err != nil { return err }