Skip to content

Commit 0c9cfdd

Browse files
authored
Merge pull request #569 from andyzhangx/force-umount
fix: use force unmount to fix umount failure
2 parents c103561 + ebd4efd commit 0c9cfdd

File tree

6 files changed

+48
-9
lines changed

6 files changed

+48
-9
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ replace (
473473
k8s.io/kubelet => k8s.io/kubelet v0.26.0
474474
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.26.0
475475
k8s.io/metrics => k8s.io/metrics v0.26.0
476-
k8s.io/mount-utils => k8s.io/mount-utils v0.0.0-20221216112627-49433b159e95
476+
k8s.io/mount-utils => k8s.io/mount-utils v0.0.0-20230103133730-1df1a57439e2
477477
k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.26.0
478478
k8s.io/repo-infra => k8s.io/repo-infra v0.0.1-alpha.1
479479
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.26.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,8 +448,8 @@ k8s.io/kubectl v0.26.0 h1:xmrzoKR9CyNdzxBmXV7jW9Ln8WMrwRK6hGbbf69o4T0=
448448
k8s.io/kubectl v0.26.0/go.mod h1:eInP0b+U9XUJWSYeU9XZnTA+cVYuWyl3iYPGtru0qhQ=
449449
k8s.io/kubernetes v1.26.0 h1:fL8VMr4xlfTazPORLhz5fsvO5I3bsFpmynVxZTH1ItQ=
450450
k8s.io/kubernetes v1.26.0/go.mod h1:z0aCJwn6DxzB/dDiWLbQaJO5jWOR2qoaCMnmSAx45XM=
451-
k8s.io/mount-utils v0.0.0-20221216112627-49433b159e95 h1:dnn7wb0OaHJNhfsNm266QD0XTUdFZ2so93bfJZpEeUA=
452-
k8s.io/mount-utils v0.0.0-20221216112627-49433b159e95/go.mod h1:au99w4FWU5ZWelLb3Yx6kJc8RZ387IyWVM9tN65Yhxo=
451+
k8s.io/mount-utils v0.0.0-20230103133730-1df1a57439e2 h1:kfACKquxtsEA7XXDy+iC92lg/1stK0UtzAhf7R2Y8Fc=
452+
k8s.io/mount-utils v0.0.0-20230103133730-1df1a57439e2/go.mod h1:au99w4FWU5ZWelLb3Yx6kJc8RZ387IyWVM9tN65Yhxo=
453453
k8s.io/pod-security-admission v0.26.0 h1:XBG/uyP2cYwSFr5IWAQ1IIArxMYARJKzEzSmP4ZbC1s=
454454
k8s.io/pod-security-admission v0.26.0/go.mod h1:HQHvpCrn6KQLKRUqFvWkHCVKet3X62fn2F3j5anYiEM=
455455
k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=

pkg/mounter/safe_mounter_unix.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,20 @@ limitations under the License.
2020
package mounter
2121

2222
import (
23+
"runtime"
24+
2325
mount "k8s.io/mount-utils"
2426
utilexec "k8s.io/utils/exec"
2527
)
2628

2729
func NewSafeMounter(removeSMBMappingDuringUnmount bool) (*mount.SafeFormatAndMount, error) {
30+
mounter := mount.New("")
31+
if runtime.GOOS == "linux" {
32+
// MounterForceUnmounter is only implemented on Linux now
33+
mounter = mounter.(mount.MounterForceUnmounter)
34+
}
2835
return &mount.SafeFormatAndMount{
29-
Interface: mount.New(""),
36+
Interface: mounter,
3037
Exec: utilexec.New(),
3138
}, nil
3239
}

pkg/smb/smb_common_linux.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,13 @@ limitations under the License.
2020
package smb
2121

2222
import (
23+
"fmt"
2324
"os"
25+
"os/exec"
26+
"strings"
27+
"time"
2428

29+
"k8s.io/klog/v2"
2530
mount "k8s.io/mount-utils"
2631
)
2732

@@ -34,7 +39,21 @@ func CleanupSMBMountPoint(m *mount.SafeFormatAndMount, target string, extensiveM
3439
}
3540

3641
func CleanupMountPoint(m *mount.SafeFormatAndMount, target string, extensiveMountCheck bool) error {
37-
return mount.CleanupMountPoint(target, m, extensiveMountCheck)
42+
var err error
43+
extensiveMountPointCheck := true
44+
forceUnmounter, ok := m.Interface.(mount.MounterForceUnmounter)
45+
if ok {
46+
klog.V(2).Infof("force unmount on %s", target)
47+
err = mount.CleanupMountWithForce(target, forceUnmounter, extensiveMountPointCheck, 30*time.Second)
48+
} else {
49+
err = mount.CleanupMountPoint(target, m.Interface, extensiveMountPointCheck)
50+
}
51+
52+
if err != nil && strings.Contains(err.Error(), "target is busy") {
53+
klog.Warningf("unmount on %s failed with %v, try lazy unmount", target, err)
54+
err = forceUmount(target)
55+
}
56+
return err
3857
}
3958

4059
func preparePublishPath(path string, m *mount.SafeFormatAndMount) error {
@@ -48,3 +67,12 @@ func prepareStagePath(path string, m *mount.SafeFormatAndMount) error {
4867
func Mkdir(m *mount.SafeFormatAndMount, name string, perm os.FileMode) error {
4968
return os.Mkdir(name, perm)
5069
}
70+
71+
func forceUmount(path string) error {
72+
cmd := exec.Command("umount", "-lf", path)
73+
out, cmderr := cmd.CombinedOutput()
74+
if cmderr != nil {
75+
return fmt.Errorf("lazy unmount on %s failed with %v, output: %s", path, cmderr, string(out))
76+
}
77+
return nil
78+
}

vendor/k8s.io/mount-utils/mount_linux.go

Lines changed: 6 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/modules.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,7 +1038,7 @@ k8s.io/kubernetes/test/e2e/testing-manifests
10381038
k8s.io/kubernetes/test/utils
10391039
k8s.io/kubernetes/test/utils/image
10401040
k8s.io/kubernetes/test/utils/kubeconfig
1041-
# k8s.io/mount-utils v0.26.0 => k8s.io/mount-utils v0.0.0-20221216112627-49433b159e95
1041+
# k8s.io/mount-utils v0.26.0 => k8s.io/mount-utils v0.0.0-20230103133730-1df1a57439e2
10421042
## explicit; go 1.19
10431043
k8s.io/mount-utils
10441044
# k8s.io/pod-security-admission v0.0.0 => k8s.io/pod-security-admission v0.26.0
@@ -1438,7 +1438,7 @@ sigs.k8s.io/yaml
14381438
# k8s.io/kubelet => k8s.io/kubelet v0.26.0
14391439
# k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.26.0
14401440
# k8s.io/metrics => k8s.io/metrics v0.26.0
1441-
# k8s.io/mount-utils => k8s.io/mount-utils v0.0.0-20221216112627-49433b159e95
1441+
# k8s.io/mount-utils => k8s.io/mount-utils v0.0.0-20230103133730-1df1a57439e2
14421442
# k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.26.0
14431443
# k8s.io/repo-infra => k8s.io/repo-infra v0.0.1-alpha.1
14441444
# k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.26.0

0 commit comments

Comments
 (0)