diff options
| author | Chris Lu <chrislusf@users.noreply.github.com> | 2022-07-15 02:45:31 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-07-15 02:45:31 -0700 |
| commit | 0d9d6168a8c808428c432c3c78453ebb69379606 (patch) | |
| tree | fbe41a8dd3798f3f564cce546a9b9273d6d16874 | |
| parent | 8987bd95e07881dc440ed5071222ea2428a0f228 (diff) | |
| parent | 1c4aa8486fd30767a2718528fce985695a7e527f (diff) | |
| download | seaweedfs-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.go | 2 | ||||
| -rw-r--r-- | pkg/driver/volume.go | 27 |
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 } |
