From e8a87120d459dfeffee5474c3253e787d38b2ac0 Mon Sep 17 00:00:00 2001 From: unclejack Date: Thu, 29 May 2014 22:55:59 +0300 Subject: [PATCH] block aufs on incompatible file systems Docker-DCO-1.1-Signed-off-by: Cristian Staretu (github: unclejack) --- daemon/graphdriver/aufs/aufs.go | 27 ++++++++++++++++++++++----- daemon/graphdriver/driver.go | 9 +++++---- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/daemon/graphdriver/aufs/aufs.go b/daemon/graphdriver/aufs/aufs.go index 2b7aa1b68a..a8d728bbb8 100644 --- a/daemon/graphdriver/aufs/aufs.go +++ b/daemon/graphdriver/aufs/aufs.go @@ -23,20 +23,23 @@ package aufs import ( "bufio" "fmt" - "github.com/dotcloud/docker/archive" - "github.com/dotcloud/docker/daemon/graphdriver" - "github.com/dotcloud/docker/pkg/label" - mountpk "github.com/dotcloud/docker/pkg/mount" - "github.com/dotcloud/docker/utils" "os" "os/exec" "path" "strings" "sync" + "syscall" + + "github.com/dotcloud/docker/archive" + "github.com/dotcloud/docker/daemon/graphdriver" + "github.com/dotcloud/docker/pkg/label" + mountpk "github.com/dotcloud/docker/pkg/mount" + "github.com/dotcloud/docker/utils" ) var ( ErrAufsNotSupported = fmt.Errorf("AUFS was not found in /proc/filesystems") + IncompatibleFSMagic = []int64{0x9123683E /*btrfs*/, 0x61756673 /*AUFS*/} ) func init() { @@ -56,6 +59,20 @@ func Init(root string) (graphdriver.Driver, error) { if err := supportsAufs(); err != nil { return nil, graphdriver.ErrNotSupported } + + rootdir := path.Dir(root) + + var buf syscall.Statfs_t + if err := syscall.Statfs(rootdir, &buf); err != nil { + return nil, fmt.Errorf("Couldn't stat the root directory: %s", err) + } + + for _, magic := range IncompatibleFSMagic { + if int64(buf.Type) == magic { + return nil, graphdriver.ErrIncompatibleFS + } + } + paths := []string{ "mnt", "diff", diff --git a/daemon/graphdriver/driver.go b/daemon/graphdriver/driver.go index a3039e0309..33965ccae6 100644 --- a/daemon/graphdriver/driver.go +++ b/daemon/graphdriver/driver.go @@ -44,8 +44,9 @@ var ( "vfs", } - ErrNotSupported = errors.New("driver not supported") - ErrPrerequisites = errors.New("Prerequisites for driver not satisfied (wrong filesystem?)") + ErrNotSupported = errors.New("driver not supported") + ErrPrerequisites = errors.New("prerequisites for driver not satisfied (wrong filesystem?)") + ErrIncompatibleFS = fmt.Errorf("backing file system is unsupported for this graph driver") ) func init() { @@ -79,7 +80,7 @@ func New(root string) (driver Driver, err error) { for _, name := range priority { driver, err = GetDriver(name, root) if err != nil { - if err == ErrNotSupported || err == ErrPrerequisites { + if err == ErrNotSupported || err == ErrPrerequisites || err == ErrIncompatibleFS { continue } return nil, err @@ -90,7 +91,7 @@ func New(root string) (driver Driver, err error) { // Check all registered drivers if no priority driver is found for _, initFunc := range drivers { if driver, err = initFunc(root); err != nil { - if err == ErrNotSupported || err == ErrPrerequisites { + if err == ErrNotSupported || err == ErrPrerequisites || err == ErrIncompatibleFS { continue } return nil, err