func (b *Provider) DestroyVolume(vol volume.Volume) error { zvol, err := b.owns(vol) if err != nil { return err } if vol.IsSnapshot() { if err := syscall.Unmount(vol.Location(), 0); err != nil { return err } os.Remove(vol.Location()) } if err := zvol.dataset.Destroy(zfs.DestroyForceUmount); err != nil { for i := 0; i < 5 && err != nil && IsDatasetBusyError(err); i++ { // sometimes zfs will claim to be busy as if files are still open even when all container processes are dead. // usually this goes away, so retry a few times. time.Sleep(1 * time.Second) err = zvol.dataset.Destroy(zfs.DestroyForceUmount) } if err != nil { return err } } os.Remove(zvol.basemount) delete(b.volumes, vol.Info().ID) return nil }