@@ -7,18 +7,17 @@ import (
77 "io/fs"
88 "os"
99 "path/filepath"
10- "syscall"
1110 "time"
1211
1312 corev1 "k8s.io/api/core/v1"
1413 "k8s.io/apimachinery/pkg/util/wait"
1514 "k8s.io/klog/v2"
16- "k8s.io/mount-utils"
1715
1816 "github.com/awslabs/aws-s3-csi-driver/pkg/driver/node/credentialprovider"
1917 "github.com/awslabs/aws-s3-csi-driver/pkg/driver/node/envprovider"
2018 "github.com/awslabs/aws-s3-csi-driver/pkg/driver/node/targetpath"
2119 "github.com/awslabs/aws-s3-csi-driver/pkg/mountpoint"
20+ mpmounter "github.com/awslabs/aws-s3-csi-driver/pkg/mountpoint/mounter"
2221 "github.com/awslabs/aws-s3-csi-driver/pkg/mountpoint/mountoptions"
2322 "github.com/awslabs/aws-s3-csi-driver/pkg/podmounter/mppod"
2423 "github.com/awslabs/aws-s3-csi-driver/pkg/podmounter/mppod/watcher"
@@ -33,21 +32,21 @@ const targetDirPerm = fs.FileMode(0755)
3332
3433// mountSyscall is the function that performs `mount` operation for given `target` with given Mountpoint `args`.
3534// It returns mounted FUSE file descriptor as a result.
36- // This is mainly exposed for testing, in production platform-native function (`mountSyscallDefault `) will be used.
35+ // This is mainly exposed for testing, in production platform-native function (`mpmounter.Mount `) will be used.
3736type mountSyscall func (target string , args mountpoint.Args ) (fd int , err error )
3837
3938// A PodMounter is a [Mounter] that mounts Mountpoint on pre-created Kubernetes Pod running in the same node.
4039type PodMounter struct {
4140 podWatcher * watcher.Watcher
42- mount mount. Interface
41+ mount * mpmounter. Mounter
4342 kubeletPath string
4443 mountSyscall mountSyscall
4544 kubernetesVersion string
4645 credProvider * credentialprovider.Provider
4746}
4847
4948// NewPodMounter creates a new [PodMounter] with given Kubernetes client.
50- func NewPodMounter (podWatcher * watcher.Watcher , credProvider * credentialprovider.Provider , mount mount. Interface , mountSyscall mountSyscall , kubernetesVersion string ) (* PodMounter , error ) {
49+ func NewPodMounter (podWatcher * watcher.Watcher , credProvider * credentialprovider.Provider , mount * mpmounter. Mounter , mountSyscall mountSyscall , kubernetesVersion string ) (* PodMounter , error ) {
5150 return & PodMounter {
5251 podWatcher : podWatcher ,
5352 credProvider : credProvider ,
@@ -77,14 +76,12 @@ func (pm *PodMounter) Mount(ctx context.Context, bucketName string, target strin
7776
7877 podID := credentialCtx .PodID
7978
80- err = pm .verifyOrSetupMountTarget (target )
81- if err != nil {
82- return fmt .Errorf ("Failed to verify target path can be used as a mount point %q: %w" , target , err )
83- }
84-
8579 isMountPoint , err := pm .IsMountPoint (target )
8680 if err != nil {
87- return fmt .Errorf ("Could not check if %q is already a mount point: %w" , target , err )
81+ err = pm .verifyOrSetupMountTarget (target , err )
82+ if err != nil {
83+ return fmt .Errorf ("Failed to verify target path can be used as a mount point %q: %w" , target , err )
84+ }
8885 }
8986
9087 // TODO: If `target` is a `systemd`-mounted Mountpoint, this would return an error,
@@ -232,8 +229,7 @@ func (pm *PodMounter) Unmount(ctx context.Context, target string, credentialCtx
232229
233230// IsMountPoint returns whether given `target` is a `mount-s3` mount.
234231func (pm * PodMounter ) IsMountPoint (target string ) (bool , error ) {
235- // TODO: Can we just use regular `IsMountPoint` check from `mounter` with containerization?
236- return isMountPoint (pm .mount , target )
232+ return pm .mount .CheckMountPoint (target )
237233}
238234
239235// waitForMountpointPod waints until Mountpoint Pod for given `podID` and `volumeName` is in `Running` state.
@@ -300,7 +296,7 @@ func (pm *PodMounter) waitForMount(parentCtx context.Context, target, podName, p
300296
301297// closeFUSEDevFD closes given FUSE file descriptor.
302298func (pm * PodMounter ) closeFUSEDevFD (fd int ) {
303- err := syscall . Close (fd )
299+ err := mpmounter . CloseFD (fd )
304300 if err != nil {
305301 klog .V (4 ).Infof ("Mount: Failed to close /dev/fuse file descriptor %d: %v\n " , fd , err )
306302 }
@@ -309,20 +305,15 @@ func (pm *PodMounter) closeFUSEDevFD(fd int) {
309305// verifyOrSetupMountTarget checks target path for existence and corrupted mount error.
310306// If the target dir does not exists it tries to create it.
311307// If the target dir is corrupted (decided with `mount.IsCorruptedMnt`) it tries to unmount it to have a clean mount.
312- func (pm * PodMounter ) verifyOrSetupMountTarget (target string ) error {
313- err := verifyMountPointStatx (target )
314- if err == nil {
315- return nil
316- }
317-
308+ func (pm * PodMounter ) verifyOrSetupMountTarget (target string , err error ) error {
318309 if errors .Is (err , fs .ErrNotExist ) {
319310 klog .V (5 ).Infof ("Target path does not exists %s, trying to create" , target )
320311 if err := os .MkdirAll (target , targetDirPerm ); err != nil {
321312 return fmt .Errorf ("Failed to create target directory: %w" , err )
322313 }
323314
324315 return nil
325- } else if mount .IsCorruptedMnt (err ) {
316+ } else if pm . mount .IsMountPointCorrupted (err ) {
326317 klog .V (4 ).Infof ("Target path %q is a corrupted mount. Trying to unmount" , target )
327318 if unmountErr := pm .unmountTarget (target ); unmountErr != nil {
328319 klog .V (4 ).Infof ("Failed to unmount target path %q: %v, original failure of stat: %v" , target , unmountErr , err )
@@ -332,6 +323,7 @@ func (pm *PodMounter) verifyOrSetupMountTarget(target string) error {
332323 return nil
333324 }
334325
326+ // Some other error that we cannot recover from, just propagate it.
335327 return err
336328}
337329
@@ -358,13 +350,17 @@ func (pm *PodMounter) podPath(pod *corev1.Pod) string {
358350 return filepath .Join (pm .kubeletPath , "pods" , string (pod .UID ))
359351}
360352
361- // mountSyscallWithDefault delegates to `mountSyscall` if set, or fallbacks to platform-native `mountSyscallDefault `.
353+ // mountSyscallWithDefault delegates to `mountSyscall` if set, or fallbacks to platform-native `mpmounter.Mount `.
362354func (pm * PodMounter ) mountSyscallWithDefault (target string , args mountpoint.Args ) (int , error ) {
363355 if pm .mountSyscall != nil {
364356 return pm .mountSyscall (target , args )
365357 }
366358
367- return pm .mountSyscallDefault (target , args )
359+ opts := mpmounter.MountOptions {
360+ ReadOnly : args .Has (mountpoint .ArgReadOnly ),
361+ AllowOther : args .Has (mountpoint .ArgAllowOther ) || args .Has (mountpoint .ArgAllowRoot ),
362+ }
363+ return pm .mount .Mount (target , opts )
368364}
369365
370366// unmountTarget calls `unmount` syscall on `target`.
0 commit comments