- Make dataset destroy returns meaningful error if dataset contains children
- Implementation of recursive dataset destroy DestroyRecursive()
This commit is contained in:
parent
fe306ffc28
commit
65eb260be4
|
@ -1 +1,2 @@
|
||||||
.gitconfig
|
.gitconfig
|
||||||
|
*.sublime-*
|
||||||
|
|
34
zfs.go
34
zfs.go
|
@ -156,7 +156,20 @@ func (d *Dataset) Close() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Destroys the dataset. The caller must make sure that the filesystem
|
||||||
|
// isn't mounted, and that there are no active dependents. Set Defer argument
|
||||||
|
// to true to defer destruction for when dataset is not in use.
|
||||||
func (d *Dataset) Destroy(Defer bool) (err error) {
|
func (d *Dataset) Destroy(Defer bool) (err error) {
|
||||||
|
if len(d.Children) > 0 {
|
||||||
|
path, e := d.Path()
|
||||||
|
if e != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
dsType, e := d.GetProperty(ZFSPropType)
|
||||||
|
err = errors.New("Cannot destroy dataset " + path +
|
||||||
|
": " + dsType.Value + " has children")
|
||||||
|
return
|
||||||
|
}
|
||||||
if d.list != nil {
|
if d.list != nil {
|
||||||
if ec := C.zfs_destroy(d.list.zh, boolean_t(Defer)); ec != 0 {
|
if ec := C.zfs_destroy(d.list.zh, boolean_t(Defer)); ec != 0 {
|
||||||
err = LastError()
|
err = LastError()
|
||||||
|
@ -167,6 +180,23 @@ func (d *Dataset) Destroy(Defer bool) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Recursively destroy children of dataset and dataset.
|
||||||
|
func (d *Dataset) DestroyRecursive() (err error) {
|
||||||
|
if len(d.Children) > 0 {
|
||||||
|
for _, c := range d.Children {
|
||||||
|
if err = c.DestroyRecursive(); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// close handle to destroyed child dataset
|
||||||
|
c.Close()
|
||||||
|
}
|
||||||
|
// clear closed children array
|
||||||
|
d.Children = make([]Dataset, 0)
|
||||||
|
}
|
||||||
|
err = d.Destroy(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Dataset) Pool() (p Pool, err error) {
|
func (d *Dataset) Pool() (p Pool, err error) {
|
||||||
if d.list == nil {
|
if d.list == nil {
|
||||||
err = errors.New(msgDatasetIsNil)
|
err = errors.New(msgDatasetIsNil)
|
||||||
|
@ -259,7 +289,7 @@ func (d *Dataset) Clone(target string, props map[ZFSProp]Property) (rd Dataset,
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create dataset snapshot
|
// Create dataset snapshot. Set recur to true to snapshot child datasets.
|
||||||
func DatasetSnapshot(path string, recur bool, props map[ZFSProp]Property) (rd Dataset, err error) {
|
func DatasetSnapshot(path string, recur bool, props map[ZFSProp]Property) (rd Dataset, err error) {
|
||||||
var cprops *C.nvlist_t
|
var cprops *C.nvlist_t
|
||||||
if cprops, err = datasetPropertiesTo_nvlist(props); err != nil {
|
if cprops, err = datasetPropertiesTo_nvlist(props); err != nil {
|
||||||
|
@ -285,6 +315,7 @@ func (d *Dataset) Path() (path string, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Rollabck dataset snapshot
|
||||||
func (d *Dataset) Rollback(snap *Dataset, force bool) (err error) {
|
func (d *Dataset) Rollback(snap *Dataset, force bool) (err error) {
|
||||||
if d.list == nil {
|
if d.list == nil {
|
||||||
err = errors.New(msgDatasetIsNil)
|
err = errors.New(msgDatasetIsNil)
|
||||||
|
@ -297,6 +328,7 @@ func (d *Dataset) Rollback(snap *Dataset, force bool) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Rename dataset
|
||||||
func (d *Dataset) Rename(newname string, recur,
|
func (d *Dataset) Rename(newname string, recur,
|
||||||
force_umount bool) (err error) {
|
force_umount bool) (err error) {
|
||||||
if d.list == nil {
|
if d.list == nil {
|
||||||
|
|
Loading…
Reference in New Issue