@@ -23,33 +23,58 @@ type releaseableLayer struct {
2323}
2424
2525func (rl * releaseableLayer ) Mount () (string , error ) {
26+ var err error
27+ var mountPath string
2628 if rl .roLayer == nil {
2729 return "" , errors .New ("can not mount an image with no root FS" )
2830 }
29- var err error
3031 mountID := stringid .GenerateRandomID ()
3132 rl .rwLayer , err = rl .layerStore .CreateRWLayer (mountID , rl .roLayer .ChainID (), nil )
3233 if err != nil {
3334 return "" , errors .Wrap (err , "failed to create rwlayer" )
3435 }
3536
36- return rl .rwLayer .Mount ("" )
37+ mountPath , err = rl .rwLayer .Mount ("" )
38+ if err != nil {
39+ // Clean up the layer if we fail to mount it here.
40+ metadata , err := rl .layerStore .ReleaseRWLayer (rl .rwLayer )
41+ layer .LogReleaseMetadata (metadata )
42+ if err != nil {
43+ logrus .Errorf ("Failed to release RWLayer: %s" , err )
44+ }
45+ rl .rwLayer = nil
46+ return "" , err
47+ }
48+
49+ return mountPath , nil
3750}
3851
3952func (rl * releaseableLayer ) Release () error {
40- rl .releaseRWLayer ()
41- return rl .releaseROLayer ()
53+ if err := rl .releaseRWLayer (); err != nil {
54+ // Best effort attempt at releasing read-only layer before returning original error.
55+ rl .releaseROLayer ()
56+ return err
57+ }
58+ if err := rl .releaseROLayer (); err != nil {
59+ return err
60+ }
61+ return nil
4262}
4363
4464func (rl * releaseableLayer ) releaseRWLayer () error {
4565 if rl .rwLayer == nil {
4666 return nil
4767 }
68+ if err := rl .rwLayer .Unmount (); err != nil {
69+ logrus .Errorf ("Failed to unmount RWLayer: %s" , err )
70+ return err
71+ }
4872 metadata , err := rl .layerStore .ReleaseRWLayer (rl .rwLayer )
4973 layer .LogReleaseMetadata (metadata )
5074 if err != nil {
5175 logrus .Errorf ("Failed to release RWLayer: %s" , err )
5276 }
77+ rl .rwLayer = nil
5378 return err
5479}
5580
@@ -59,6 +84,10 @@ func (rl *releaseableLayer) releaseROLayer() error {
5984 }
6085 metadata , err := rl .layerStore .Release (rl .roLayer )
6186 layer .LogReleaseMetadata (metadata )
87+ if err != nil {
88+ logrus .Errorf ("Failed to release ROLayer: %s" , err )
89+ }
90+ rl .roLayer = nil
6291 return err
6392}
6493
0 commit comments