From 0a4e793a3da9ba6d20bccfb83f7c48e20a76d895 Mon Sep 17 00:00:00 2001 From: Sebastiaan van Stijn Date: Mon, 4 Dec 2017 17:02:52 -0800 Subject: [PATCH] Allow existing setups to continue using d_type Even though it's highly discouraged, there are existing installs that are running overlay/overlay2 on filesystems without d_type support. This patch allows the daemon to start in such cases, instead of refusing to start without an option to override. For fresh installs, backing filesystems without d_type support will still cause the overlay/overlay2 drivers to be marked as "unsupported", and skipped during the automatic selection. This feature is only to keep backward compatibility, but will be removed at some point. Signed-off-by: Sebastiaan van Stijn --- daemon/graphdriver/driver.go | 12 ++++++++++++ daemon/graphdriver/overlay/overlay.go | 6 +++++- daemon/graphdriver/overlay2/overlay.go | 6 +++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/daemon/graphdriver/driver.go b/daemon/graphdriver/driver.go index 721f6609e9..ceb49b9818 100644 --- a/daemon/graphdriver/driver.go +++ b/daemon/graphdriver/driver.go @@ -277,6 +277,18 @@ func scanPriorDrivers(root string) map[string]bool { return driversMap } +// IsInitialized checks if the driver's home-directory exists and is non-empty. +func IsInitialized(driverHome string) bool { + _, err := os.Stat(driverHome) + if os.IsNotExist(err) { + return false + } + if err != nil { + logrus.Warnf("graphdriver.IsInitialized: stat failed: %v", err) + } + return !isEmptyDir(driverHome) +} + // isEmptyDir checks if a directory is empty. It is used to check if prior // storage-driver directories exist. If an error occurs, it also assumes the // directory is not empty (which preserves the behavior _before_ this check diff --git a/daemon/graphdriver/overlay/overlay.go b/daemon/graphdriver/overlay/overlay.go index b148431863..fce775ea6b 100644 --- a/daemon/graphdriver/overlay/overlay.go +++ b/daemon/graphdriver/overlay/overlay.go @@ -148,7 +148,11 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap return nil, err } if !supportsDType { - return nil, overlayutils.ErrDTypeNotSupported("overlay", backingFs) + if !graphdriver.IsInitialized(home) { + return nil, overlayutils.ErrDTypeNotSupported("overlay", backingFs) + } + // allow running without d_type only for existing setups (#27443) + logrus.Warn(overlayutils.ErrDTypeNotSupported("overlay", backingFs)) } rootUID, rootGID, err := idtools.GetRootUIDGID(uidMaps, gidMaps) diff --git a/daemon/graphdriver/overlay2/overlay.go b/daemon/graphdriver/overlay2/overlay.go index ea707a0af6..f1731ea935 100644 --- a/daemon/graphdriver/overlay2/overlay.go +++ b/daemon/graphdriver/overlay2/overlay.go @@ -184,7 +184,11 @@ func Init(home string, options []string, uidMaps, gidMaps []idtools.IDMap) (grap return nil, err } if !supportsDType { - return nil, overlayutils.ErrDTypeNotSupported("overlay2", backingFs) + if !graphdriver.IsInitialized(home) { + return nil, overlayutils.ErrDTypeNotSupported("overlay2", backingFs) + } + // allow running without d_type only for existing setups (#27443) + logrus.Warn(overlayutils.ErrDTypeNotSupported("overlay2", backingFs)) } rootUID, rootGID, err := idtools.GetRootUIDGID(uidMaps, gidMaps)