From 2569af9a00179074aac52e19ed0adbda0a12dc59 Mon Sep 17 00:00:00 2001 From: Daniel J Walsh Date: Wed, 25 Jul 2018 16:31:54 -0400 Subject: [PATCH] Fix overlay to handle mountopt properly We need to translate the mount options into flags or data, so this PR makes the parse code public so we can use it in containers/storage. Signed-off-by: Daniel J Walsh --- drivers/overlay/overlay.go | 15 ++++++++------- pkg/mount/flags.go | 6 +++--- pkg/mount/mount.go | 4 ++-- pkg/mount/mount_unix_test.go | 2 +- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/drivers/overlay/overlay.go b/drivers/overlay/overlay.go index d2f7c373ae..c59544aab1 100644 --- a/drivers/overlay/overlay.go +++ b/drivers/overlay/overlay.go @@ -706,8 +706,11 @@ func (d *Driver) Get(id, mountLabel string) (_ string, retErr error) { workDir := path.Join(dir, "work") opts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", strings.Join(absLowers, ":"), diffDir, workDir) + if d.options.mountOptions != "" { + opts = fmt.Sprintf("%s,%s", d.options.mountOptions, opts) + } mountData := label.FormatMountLabel(opts, mountLabel) - mount := unix.Mount + mountFunc := unix.Mount mountTarget := mergedDir pageSize := unix.Getpagesize() @@ -719,28 +722,26 @@ func (d *Driver) Get(id, mountLabel string) (_ string, retErr error) { if len(mountData) > pageSize || d.options.mountProgram != "" { //FIXME: We need to figure out to get this to work with additional stores opts = fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", strings.Join(relLowers, ":"), path.Join(id, "diff"), path.Join(id, "work")) - if d.options.mountOptions != "" { - opts = fmt.Sprintf("%s,%s", d.options.mountOptions, opts) - } mountData = label.FormatMountLabel(opts, mountLabel) if len(mountData) > pageSize { return "", fmt.Errorf("cannot mount layer, mount label too large %d", len(mountData)) } if d.options.mountProgram != "" { - mount = func(source string, target string, mType string, flags uintptr, label string) error { + mountFunc = func(source string, target string, mType string, flags uintptr, label string) error { mountProgram := exec.Command(d.options.mountProgram, "-o", label, target) mountProgram.Dir = d.home return mountProgram.Run() } } else { - mount = func(source string, target string, mType string, flags uintptr, label string) error { + mountFunc = func(source string, target string, mType string, flags uintptr, label string) error { return mountFrom(d.home, source, target, mType, flags, label) } } mountTarget = path.Join(id, "merged") } - if err := mount("overlay", mountTarget, "overlay", 0, mountData); err != nil { + flags, data := mount.ParseOptions(mountData) + if err := mountFunc("overlay", mountTarget, "overlay", uintptr(flags), data); err != nil { return "", fmt.Errorf("error creating overlay mount to %s: %v", mountTarget, err) } diff --git a/pkg/mount/flags.go b/pkg/mount/flags.go index 607dbed43a..07a0f4847c 100644 --- a/pkg/mount/flags.go +++ b/pkg/mount/flags.go @@ -111,9 +111,9 @@ func MergeTmpfsOptions(options []string) ([]string, error) { return newOptions, nil } -// Parse fstab type mount options into mount() flags +// ParseOptions parses fstab type mount options into mount() flags // and device specific data -func parseOptions(options string) (int, string) { +func ParseOptions(options string) (int, string) { var ( flag int data []string @@ -138,7 +138,7 @@ func parseOptions(options string) (int, string) { // ParseTmpfsOptions parse fstab type mount options into flags and data func ParseTmpfsOptions(options string) (int, string, error) { - flags, data := parseOptions(options) + flags, data := ParseOptions(options) for _, o := range strings.Split(data, ",") { opt := strings.SplitN(o, "=", 2) if !validFlags[opt[0]] { diff --git a/pkg/mount/mount.go b/pkg/mount/mount.go index d3caa16bda..7197448da0 100644 --- a/pkg/mount/mount.go +++ b/pkg/mount/mount.go @@ -39,7 +39,7 @@ func Mounted(mountpoint string) (bool, error) { // specified like the mount or fstab unix commands: "opt1=val1,opt2=val2". See // flags.go for supported option flags. func Mount(device, target, mType, options string) error { - flag, _ := parseOptions(options) + flag, _ := ParseOptions(options) if flag&REMOUNT != REMOUNT { if mounted, err := Mounted(target); err != nil || mounted { return err @@ -53,7 +53,7 @@ func Mount(device, target, mType, options string) error { // specified like the mount or fstab unix commands: "opt1=val1,opt2=val2". See // flags.go for supported option flags. func ForceMount(device, target, mType, options string) error { - flag, data := parseOptions(options) + flag, data := ParseOptions(options) return mount(device, target, mType, uintptr(flag), data) } diff --git a/pkg/mount/mount_unix_test.go b/pkg/mount/mount_unix_test.go index 253aff3b8e..b66f4fb52d 100644 --- a/pkg/mount/mount_unix_test.go +++ b/pkg/mount/mount_unix_test.go @@ -11,7 +11,7 @@ import ( func TestMountOptionsParsing(t *testing.T) { options := "noatime,ro,size=10k" - flag, data := parseOptions(options) + flag, data := ParseOptions(options) if data != "size=10k" { t.Fatalf("Expected size=10 got %s", data)