Use SafeChown rather then chown for volumes on NFS

NFS Servers will thrown ENOTSUPP error if you attempt to
chown a directory to the same UID and GID as the directory
already has. If volumes are stored on NFS directories this
throws an ugly error and then works on the next try.

Bottom line don't chown directories that already have the correct
UID and GID.

Fixes: https://github.com/containers/podman/issues/14766

[NO NEW TESTS NEEDED] Difficult to setup an NFS Server in testing.

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
Daniel J Walsh
2022-07-06 07:23:36 -04:00
committed by Matthew Heon
parent 17dbce2fb0
commit 183fdea5f5

View File

@ -16,6 +16,7 @@ import (
"github.com/containers/podman/v4/libpod/events" "github.com/containers/podman/v4/libpod/events"
volplugin "github.com/containers/podman/v4/libpod/plugin" volplugin "github.com/containers/podman/v4/libpod/plugin"
"github.com/containers/storage/drivers/quota" "github.com/containers/storage/drivers/quota"
"github.com/containers/storage/pkg/idtools"
"github.com/containers/storage/pkg/stringid" "github.com/containers/storage/pkg/stringid"
pluginapi "github.com/docker/go-plugins-helpers/volume" pluginapi "github.com/docker/go-plugins-helpers/volume"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
@ -101,14 +102,14 @@ func (r *Runtime) newVolume(noCreatePluginVolume bool, options ...VolumeCreateOp
if err := os.MkdirAll(volPathRoot, 0700); err != nil { if err := os.MkdirAll(volPathRoot, 0700); err != nil {
return nil, fmt.Errorf("creating volume directory %q: %w", volPathRoot, err) return nil, fmt.Errorf("creating volume directory %q: %w", volPathRoot, err)
} }
if err := os.Chown(volPathRoot, volume.config.UID, volume.config.GID); err != nil { if err := idtools.SafeChown(volPathRoot, volume.config.UID, volume.config.GID); err != nil {
return nil, fmt.Errorf("chowning volume directory %q to %d:%d: %w", volPathRoot, volume.config.UID, volume.config.GID, err) return nil, fmt.Errorf("chowning volume directory %q to %d:%d: %w", volPathRoot, volume.config.UID, volume.config.GID, err)
} }
fullVolPath := filepath.Join(volPathRoot, "_data") fullVolPath := filepath.Join(volPathRoot, "_data")
if err := os.MkdirAll(fullVolPath, 0755); err != nil { if err := os.MkdirAll(fullVolPath, 0755); err != nil {
return nil, fmt.Errorf("creating volume directory %q: %w", fullVolPath, err) return nil, fmt.Errorf("creating volume directory %q: %w", fullVolPath, err)
} }
if err := os.Chown(fullVolPath, volume.config.UID, volume.config.GID); err != nil { if err := idtools.SafeChown(fullVolPath, volume.config.UID, volume.config.GID); err != nil {
return nil, fmt.Errorf("chowning volume directory %q to %d:%d: %w", fullVolPath, volume.config.UID, volume.config.GID, err) return nil, fmt.Errorf("chowning volume directory %q to %d:%d: %w", fullVolPath, volume.config.UID, volume.config.GID, err)
} }
if err := LabelVolumePath(fullVolPath); err != nil { if err := LabelVolumePath(fullVolPath); err != nil {