From 7fab9b8a6054270763508ce88cb06c584cfeb153 Mon Sep 17 00:00:00 2001 From: Darren Stahl Date: Mon, 20 Mar 2017 14:57:07 -0700 Subject: [PATCH] Windows: Fix reference counting in graphdriver Signed-off-by: Darren Stahl --- daemon/graphdriver/windows/windows.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/daemon/graphdriver/windows/windows.go b/daemon/graphdriver/windows/windows.go index 35b40e398c..2103f2b9e9 100644 --- a/daemon/graphdriver/windows/windows.go +++ b/daemon/graphdriver/windows/windows.go @@ -370,6 +370,9 @@ func (d *Driver) Get(id, mountLabel string) (string, error) { mountPath, err := hcsshim.GetLayerMountPath(d.info, rID) if err != nil { d.ctr.Decrement(rID) + if err := hcsshim.UnprepareLayer(d.info, rID); err != nil { + logrus.Warnf("Failed to Unprepare %s: %s", id, err) + } if err2 := hcsshim.DeactivateLayer(d.info, rID); err2 != nil { logrus.Warnf("Failed to Deactivate %s: %s", id, err) } @@ -402,9 +405,15 @@ func (d *Driver) Put(id string) error { return nil } d.cacheMu.Lock() + _, exists := d.cache[rID] delete(d.cache, rID) d.cacheMu.Unlock() + // If the cache was not populated, then the layer was left unprepared and deactivated + if !exists { + return nil + } + if err := hcsshim.UnprepareLayer(d.info, rID); err != nil { return err }