diff --git a/zfs/versions.go b/zfs/versions.go index cf28b34..331ba60 100644 --- a/zfs/versions.go +++ b/zfs/versions.go @@ -112,3 +112,22 @@ func ZFSListFilesystemVersions(fs DatasetPath, filter FilesystemVersionFilter) ( } return } + +func ZFSDestroyFilesystemVersion(filesystem DatasetPath, version FilesystemVersion) (err error) { + + datasetPath := version.ToAbsPath(filesystem) + + // Sanity check... + if strings.IndexAny(datasetPath, "@#") == -1 { + return fmt.Errorf("sanity check failed: no @ character found in dataset path: %s", datasetPath) + } + + err = ZFSDestroy(datasetPath) + if err == nil { + return + } + + // Check for EBUSY, special meaning to us + return + +} diff --git a/zfs/zfs.go b/zfs/zfs.go index 75be8a3..67ba3cb 100644 --- a/zfs/zfs.go +++ b/zfs/zfs.go @@ -182,3 +182,25 @@ func ZFSSet(fs DatasetPath, prop, val string) (err error) { return } + +func ZFSDestroy(dataset string) (err error) { + + cmd := exec.Command(ZFS_BINARY, "destroy", dataset) + + stderr := bytes.NewBuffer(make([]byte, 0, 1024)) + cmd.Stderr = stderr + + if err = cmd.Start(); err != nil { + return err + } + + if err = cmd.Wait(); err != nil { + err = ZFSError{ + Stderr: stderr.Bytes(), + WaitErr: err, + } + } + + return + +}