func (util *RBDUtil) DetachDisk(c rbdCleaner, mntPath string) error { device, cnt, err := mount.GetDeviceNameFromMount(c.mounter, mntPath) if err != nil { return fmt.Errorf("rbd detach disk: failed to get device from mnt: %s\nError: %v", mntPath, err) } if err = c.mounter.Unmount(mntPath); err != nil { return fmt.Errorf("rbd detach disk: failed to umount: %s\nError: %v", mntPath, err) } // if device is no longer used, see if can unmap if cnt <= 1 { // rbd unmap _, err = c.plugin.execCommand("rbd", []string{"unmap", device}) if err != nil { return fmt.Errorf("rbd: failed to unmap device %s:Error: %v", device, err) } // load ceph and image/pool info to remove fencing if err := util.loadRBD(c.rbdBuilder, mntPath); err == nil { // remove rbd lock util.defencing(c) } glog.Infof("rbd: successfully unmap device %s", device) } return nil }
func (util *ISCSIUtil) DetachDisk(c iscsiDiskUnmounter, mntPath string) error { _, cnt, err := mount.GetDeviceNameFromMount(c.mounter, mntPath) if err != nil { glog.Errorf("iscsi detach disk: failed to get device from mnt: %s\nError: %v", mntPath, err) return err } if err = c.mounter.Unmount(mntPath); err != nil { glog.Errorf("iscsi detach disk: failed to unmount: %s\nError: %v", mntPath, err) return err } cnt-- // if device is no longer used, see if need to logout the target if cnt == 0 { device, prefix, err := extractDeviceAndPrefix(mntPath) if err != nil { return err } refCount, err := getDevicePrefixRefCount(c.mounter, prefix) if err == nil && refCount == 0 { // this portal/iqn are no longer referenced, log out // extract portal and iqn from device path portal, iqn, err := extractPortalAndIqn(device) if err != nil { return err } glog.Infof("iscsi: log out target %s iqn %s", portal, iqn) out, err := c.plugin.execCommand("iscsiadm", []string{"-m", "node", "-p", portal, "-T", iqn, "--logout"}) if err != nil { glog.Errorf("iscsi: failed to detach disk Error: %s", string(out)) } } } return nil }
func (util *ISCSIUtil) DetachDisk(c iscsiDiskCleaner, mntPath string) error { device, cnt, err := mount.GetDeviceNameFromMount(c.mounter, mntPath) if err != nil { glog.Errorf("iscsi detach disk: failed to get device from mnt: %s\nError: %v", mntPath, err) return err } if err = c.mounter.Unmount(mntPath); err != nil { glog.Errorf("iscsi detach disk: failed to unmount: %s\nError: %v", mntPath, err) return err } cnt-- // if device is no longer used, see if need to logout the target if cnt == 0 { // strip -lun- from device path ind := strings.LastIndex(device, "-lun-") prefix := device[:(ind - 1)] refCount, err := getDevicePrefixRefCount(c.mounter, prefix) if err == nil && refCount == 0 { // this portal/iqn are no longer referenced, log out // extract portal and iqn from device path ind1 := strings.LastIndex(device, "-iscsi-") portal := device[(len("/dev/disk/by-path/ip-")):ind1] iqn := device[ind1+len("-iscsi-") : ind] glog.Infof("iscsi: log out target %s iqn %s", portal, iqn) out, err := c.plugin.execCommand("iscsiadm", []string{"-m", "node", "-p", portal, "-T", iqn, "--logout"}) if err != nil { glog.Errorf("iscsi: failed to detach disk Error: %s", string(out)) } } } return nil }
// TearDownAt simply deletes everything in the directory. func (f *flexVolumeUnmounter) TearDownAt(dir string) error { if pathExists, pathErr := util.PathExists(dir); pathErr != nil { return fmt.Errorf("Error checking if path exists: %v", pathErr) } else if !pathExists { glog.Warningf("Warning: Unmount skipped because path does not exist: %v", dir) return nil } notmnt, err := f.mounter.IsLikelyNotMountPoint(dir) if err != nil { glog.Errorf("Error checking mount point %s, error: %v", dir, err) return err } if notmnt { return os.Remove(dir) } device, refCount, err := mount.GetDeviceNameFromMount(f.mounter, dir) if err != nil { glog.Errorf("Failed to get reference count for volume: %s", dir) return err } if err := f.manager.unmount(f, dir); err != nil { if !isCmdNotSupportedErr(err) { glog.Errorf("Failed to unmount volume %s", f.volName) return err } // Unmount not supported by the driver. Use core unmount logic. if err := f.mounter.Unmount(dir); err != nil { glog.Errorf("Failed to unmount volume: %s, error: %v", dir, err) return err } } if refCount == 1 { if err := f.manager.detach(f, device); err != nil { if !isCmdNotSupportedErr(err) { glog.Errorf("Failed to teardown volume: %s, error: %v", dir, err) return err } // Teardown not supported by driver. Unmount is good enough. } } notmnt, err = f.mounter.IsLikelyNotMountPoint(dir) if err != nil { glog.Errorf("Error checking mount point %s, error: %v", dir, err) return err } if notmnt { return os.Remove(dir) } return nil }
// TearDownAt simply deletes everything in the directory. func (f *flexVolumeCleaner) TearDownAt(dir string) error { notmnt, err := f.mounter.IsLikelyNotMountPoint(dir) if err != nil { glog.Errorf("Error checking mount point %s, error: %v", dir, err) return err } if notmnt { return os.Remove(dir) } device, refCount, err := mount.GetDeviceNameFromMount(f.mounter, dir) if err != nil { glog.Errorf("Failed to get reference count for volume: %s", dir) return err } if err := f.manager.unmount(f, dir); err != nil { if !isCmdNotSupportedErr(err) { glog.Errorf("Failed to unmount volume %s", f.volName) return err } // Unmount not supported by the driver. Use core unmount logic. if err := f.mounter.Unmount(dir); err != nil { glog.Errorf("Failed to unmount volume: %s, error: %s", dir, err.Error()) return err } } if refCount == 1 { if err := f.manager.detach(f, device); err != nil { if !isCmdNotSupportedErr(err) { glog.Errorf("Failed to teardown volume: %s, error: %s", dir, err.Error()) return err } // Teardown not supported by driver. Unmount is good enough. } } notmnt, err = f.mounter.IsLikelyNotMountPoint(dir) if err != nil { glog.Errorf("Error checking mount point %s, error: %v", dir, err) return err } if notmnt { return os.Remove(dir) } return nil }