aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chrislusf@users.noreply.github.com>2022-07-15 02:45:31 -0700
committerGitHub <noreply@github.com>2022-07-15 02:45:31 -0700
commit0d9d6168a8c808428c432c3c78453ebb69379606 (patch)
treefbe41a8dd3798f3f564cce546a9b9273d6d16874
parent8987bd95e07881dc440ed5071222ea2428a0f228 (diff)
parent1c4aa8486fd30767a2718528fce985695a7e527f (diff)
downloadseaweedfs-csi-driver-0d9d6168a8c808428c432c3c78453ebb69379606.tar.xz
seaweedfs-csi-driver-0d9d6168a8c808428c432c3c78453ebb69379606.zip
Merge pull request #71 from garenchan/ck-dev1
Fix #70: use bind mount rather than symbolic link
-rw-r--r--pkg/driver/nodeserver.go2
-rw-r--r--pkg/driver/volume.go27
2 files changed, 21 insertions, 8 deletions
diff --git a/pkg/driver/nodeserver.go b/pkg/driver/nodeserver.go
index 5a7206e..6c792c7 100644
--- a/pkg/driver/nodeserver.go
+++ b/pkg/driver/nodeserver.go
@@ -111,7 +111,7 @@ func (ns *NodeServer) NodePublishVolume(ctx context.Context, req *csi.NodePublis
// When pod uses a volume in read-only mode, k8s will automatically
// mount the volume as a read-only file system.
- if err := volume.(*Volume).Publish(targetPath); err != nil {
+ if err := volume.(*Volume).Publish(targetPath, req.GetReadonly()); err != nil {
return nil, status.Error(codes.Internal, err.Error())
}
diff --git a/pkg/driver/volume.go b/pkg/driver/volume.go
index 6a4e86d..fd1e18f 100644
--- a/pkg/driver/volume.go
+++ b/pkg/driver/volume.go
@@ -9,6 +9,7 @@ import (
"github.com/chrislusf/seaweedfs/weed/pb/mount_pb"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
+ "k8s.io/utils/mount"
)
type Volume struct {
@@ -57,13 +58,24 @@ func (vol *Volume) Stage(stagingTargetPath string) error {
return nil
}
-func (vol *Volume) Publish(targetPath string) error {
- if err := os.Remove(targetPath); err != nil && !os.IsNotExist(err) {
+func (vol *Volume) Publish(targetPath string, readOnly bool) error {
+ // check whether it can be mounted
+ if notMnt, err := checkMount(targetPath); err != nil {
return err
+ } else if !notMnt {
+ // maybe already mounted?
+ return nil
}
- if err := os.Symlink(vol.stagingTargetPath, targetPath); err != nil {
- return err
+ // Use bind mount to create an alias of the real mount point.
+ mountOptions := []string{"bind"}
+ if readOnly {
+ mountOptions = append(mountOptions, "ro")
+ }
+
+ mounter := mount.New("")
+ if err := mounter.Mount(vol.stagingTargetPath, targetPath, "", mountOptions); err != nil {
+ return nil
}
vol.targetPaths[targetPath] = true
@@ -98,12 +110,13 @@ func (vol *Volume) Unpublish(targetPath string) error {
return nil
}
- delete(vol.targetPaths, targetPath)
-
- if err := os.Remove(targetPath); err != nil && !os.IsNotExist(err) {
+ // Try unmounting target path and deleting it.
+ mounter := mount.New("")
+ if err := mount.CleanupMountPoint(targetPath, mounter, true); err != nil {
return err
}
+ delete(vol.targetPaths, targetPath)
return nil
}