func (devices *RbdSet) deleteImage(info *DevInfo) error { var snapshot *rbd.Snapshot // remove image imgName := devices.getRbdImageName(info.Hash) img := rbd.GetImage(devices.ioctx, imgName) if err := img.Remove(); err != nil { log.Errorf("Rbd delete image %s failed: %v", imgName, err) return err } // hash's parent snapName := devices.getRbdSnapName(info.Hash) baseImgName := devices.getRbdImageName(info.BaseHash) parentImg := rbd.GetImage(devices.ioctx, baseImgName) if err := parentImg.Open(snapName); err != nil { log.Errorf("Rbd open image %s with snap %s failed: %v", baseImgName, snapName, err) return err } else { snapshot = parentImg.GetSnapshot(snapName) } defer parentImg.Close() // protect snapshot if err := snapshot.Unprotect(); err != nil { log.Errorf("Rbd unprotect snapshot %s failed: %v", snapName, err) return err } // remove snapshot if err := snapshot.Remove(); err != nil { log.Errorf("Rbd remove snapshot %s failed: %v", snapName, err) } // unregister it if err := devices.unRegisterDevice(info); err != nil { return err } return nil }