- 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