From c7f140a00f7030ce38924a46e114fe7d16b12a07 Mon Sep 17 00:00:00 2001 From: Christian Schwarz Date: Sat, 1 Jul 2017 18:21:18 +0200 Subject: [PATCH] zfs: support destroy --- zfs/versions.go | 19 +++++++++++++++++++ zfs/zfs.go | 22 ++++++++++++++++++++++ 2 files changed, 41 insertions(+) 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 + +}