Quellcode durchsuchen

Fix overlay use of rootdir and defer

Check for the rootDir first because the mergeDir may not exist if root
is present.

Also fix unmounting in the defer to make sure it does not have a
refcount.

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
Michael Crosby vor 9 Jahren
Ursprung
Commit
36a82c2032
1 geänderte Dateien mit 8 neuen und 9 gelöschten Zeilen
  1. 8 9
      daemon/graphdriver/overlay/overlay.go

+ 8 - 9
daemon/graphdriver/overlay/overlay.go

@@ -333,23 +333,22 @@ func (d *Driver) Get(id string, mountLabel string) (s string, err error) {
 	if _, err := os.Stat(dir); err != nil {
 	if _, err := os.Stat(dir); err != nil {
 		return "", err
 		return "", err
 	}
 	}
+	// If id has a root, just return it
+	rootDir := path.Join(dir, "root")
+	if _, err := os.Stat(rootDir); err == nil {
+		return rootDir, nil
+	}
 	mergedDir := path.Join(dir, "merged")
 	mergedDir := path.Join(dir, "merged")
 	if count := d.ctr.Increment(mergedDir); count > 1 {
 	if count := d.ctr.Increment(mergedDir); count > 1 {
 		return mergedDir, nil
 		return mergedDir, nil
 	}
 	}
 	defer func() {
 	defer func() {
 		if err != nil {
 		if err != nil {
-			d.ctr.Decrement(mergedDir)
-			syscall.Unmount(mergedDir, 0)
+			if c := d.ctr.Decrement(mergedDir); c <= 0 {
+				syscall.Unmount(mergedDir, 0)
+			}
 		}
 		}
 	}()
 	}()
-
-	// If id has a root, just return it
-	rootDir := path.Join(dir, "root")
-	if _, err := os.Stat(rootDir); err == nil {
-		return rootDir, nil
-	}
-
 	lowerID, err := ioutil.ReadFile(path.Join(dir, "lower-id"))
 	lowerID, err := ioutil.ReadFile(path.Join(dir, "lower-id"))
 	if err != nil {
 	if err != nil {
 		return "", err
 		return "", err