From 5e4574526d4a38d897e76407dc291d366ed15b33 Mon Sep 17 00:00:00 2001 From: Danny Milosavljevic Date: Wed, 31 Jul 2019 13:04:03 +0200 Subject: [PATCH] Use fewer modprobes Signed-off-by: Danny Milosavljevic (cherry picked from commit 074eca1d796d0863a8c71d4707f6d8767fd19fa9) Signed-off-by: Akihiro Suda --- daemon/graphdriver/devmapper/deviceset.go | 10 ++++++++-- daemon/graphdriver/overlay/overlay.go | 13 +++++++++---- daemon/graphdriver/overlay2/overlay.go | 13 +++++++++---- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/daemon/graphdriver/devmapper/deviceset.go b/daemon/graphdriver/devmapper/deviceset.go index 30bbfd8533..f1e7223e06 100644 --- a/daemon/graphdriver/devmapper/deviceset.go +++ b/daemon/graphdriver/devmapper/deviceset.go @@ -540,8 +540,14 @@ func xfsSupported() error { return err // error text is descriptive enough } - // Check if kernel supports xfs filesystem or not. - exec.Command("modprobe", "xfs").Run() + mountTarget, err := ioutil.TempDir("", "supportsXFS") + if err != nil { + return errors.Wrapf(err, "error checking for xfs support") + } + + /* The mounting will fail--after the module has been loaded.*/ + defer os.RemoveAll(mountTarget) + unix.Mount("none", mountTarget, "xfs", 0, "") f, err := os.Open("/proc/filesystems") if err != nil { diff --git a/daemon/graphdriver/overlay/overlay.go b/daemon/graphdriver/overlay/overlay.go index 08c05e192f..eda0d7cd53 100644 --- a/daemon/graphdriver/overlay/overlay.go +++ b/daemon/graphdriver/overlay/overlay.go @@ -8,7 +8,6 @@ import ( "io" "io/ioutil" "os" - "os/exec" "path" "path/filepath" "strconv" @@ -201,9 +200,15 @@ func parseOptions(options []string) (*overlayOptions, error) { } func supportsOverlay() error { - // We can try to modprobe overlay first before looking at - // proc/filesystems for when overlay is supported - exec.Command("modprobe", "overlay").Run() + // Access overlay filesystem so that Linux loads it (if possible). + mountTarget, err := ioutil.TempDir("", "supportsOverlay") + if err != nil { + logrus.WithError(err).WithField("storage-driver", "overlay2").Error("could not create temporary directory, so assuming that 'overlay' is not supported") + return graphdriver.ErrNotSupported + } + /* The mounting will fail--after the module has been loaded.*/ + defer os.RemoveAll(mountTarget) + unix.Mount("overlay", mountTarget, "overlay", 0, "") f, err := os.Open("/proc/filesystems") if err != nil { diff --git a/daemon/graphdriver/overlay2/overlay.go b/daemon/graphdriver/overlay2/overlay.go index eedf5b73ae..781d472776 100644 --- a/daemon/graphdriver/overlay2/overlay.go +++ b/daemon/graphdriver/overlay2/overlay.go @@ -10,7 +10,6 @@ import ( "io" "io/ioutil" "os" - "os/exec" "path" "path/filepath" "strconv" @@ -276,9 +275,15 @@ func parseOptions(options []string) (*overlayOptions, error) { } func supportsOverlay() error { - // We can try to modprobe overlay first before looking at - // proc/filesystems for when overlay is supported - exec.Command("modprobe", "overlay").Run() + // Access overlay filesystem so that Linux loads it (if possible). + mountTarget, err := ioutil.TempDir("", "supportsOverlay2") + if err != nil { + logrus.WithError(err).WithField("storage-driver", "overlay2").Error("could not create temporary directory, so assuming that 'overlay' is not supported") + return graphdriver.ErrNotSupported + } + /* The mounting will fail--after the module has been loaded.*/ + defer os.RemoveAll(mountTarget) + unix.Mount("overlay", mountTarget, "overlay", 0, "") f, err := os.Open("/proc/filesystems") if err != nil {