layer/mounted_layer.go
500e77ba
 package layer
 
d04fa49a
 import (
 	"io"
 
 	"github.com/docker/docker/pkg/archive"
7a7357da
 	"github.com/docker/docker/pkg/containerfs"
d04fa49a
 )
500e77ba
 
 type mountedLayer struct {
d04fa49a
 	name       string
 	mountID    string
 	initID     string
 	parent     *roLayer
65d79e3e
 	path       string
d04fa49a
 	layerStore *layerStore
 
 	references map[RWLayer]*referencedRWLayer
500e77ba
 }
 
 func (ml *mountedLayer) cacheParent() string {
 	if ml.initID != "" {
 		return ml.initID
 	}
 	if ml.parent != nil {
 		return ml.parent.cacheID
 	}
 	return ""
 }
 
21278efa
 func (ml *mountedLayer) TarStream() (io.ReadCloser, error) {
362369b4
 	return ml.layerStore.driver.Diff(ml.mountID, ml.cacheParent())
 }
 
d04fa49a
 func (ml *mountedLayer) Name() string {
 	return ml.name
500e77ba
 }
 
 func (ml *mountedLayer) Parent() Layer {
 	if ml.parent != nil {
 		return ml.parent
 	}
 
 	// Return a nil interface instead of an interface wrapping a nil
 	// pointer.
 	return nil
 }
 
 func (ml *mountedLayer) Size() (int64, error) {
 	return ml.layerStore.driver.DiffSize(ml.mountID, ml.cacheParent())
 }
d04fa49a
 
 func (ml *mountedLayer) Changes() ([]archive.Change, error) {
 	return ml.layerStore.driver.Changes(ml.mountID, ml.cacheParent())
 }
 
 func (ml *mountedLayer) Metadata() (map[string]string, error) {
 	return ml.layerStore.driver.GetMetadata(ml.mountID)
 }
 
 func (ml *mountedLayer) getReference() RWLayer {
 	ref := &referencedRWLayer{
 		mountedLayer: ml,
 	}
 	ml.references[ref] = ref
 
 	return ref
 }
 
 func (ml *mountedLayer) hasReferences() bool {
 	return len(ml.references) > 0
 }
 
 func (ml *mountedLayer) deleteReference(ref RWLayer) error {
e1949971
 	if _, ok := ml.references[ref]; !ok {
d04fa49a
 		return ErrLayerNotRetained
 	}
 	delete(ml.references, ref)
 	return nil
 }
 
64530c8e
 func (ml *mountedLayer) retakeReference(r RWLayer) {
 	if ref, ok := r.(*referencedRWLayer); ok {
 		ml.references[ref] = ref
 	}
 }
 
d04fa49a
 type referencedRWLayer struct {
 	*mountedLayer
 }
 
7a7357da
 func (rl *referencedRWLayer) Mount(mountLabel string) (containerfs.ContainerFS, error) {
8bb4d31b
 	return rl.layerStore.driver.Get(rl.mountedLayer.mountID, mountLabel)
d04fa49a
 }
 
65d79e3e
 // Unmount decrements the activity count and unmounts the underlying layer
 // Callers should only call `Unmount` once per call to `Mount`, even on error.
d04fa49a
 func (rl *referencedRWLayer) Unmount() error {
8bb4d31b
 	return rl.layerStore.driver.Put(rl.mountedLayer.mountID)
d04fa49a
 }