@@ -493,7 +493,7 @@ func (c *Config) GetOverlay2() Overlay2 {
493493 panic (fmt .Sprintf ("Overlay2 cannot be set when --overlay=true" ))
494494 }
495495 // Using a deprecated flag, honor it to avoid breaking users.
496- return Overlay2 {rootMount : true , subMounts : true , medium : "memory" }
496+ return Overlay2 {rootMount : true , subMounts : true , medium : OverlayMediumMemory () }
497497 }
498498 return c .Overlay2
499499}
@@ -844,49 +844,82 @@ func (g HostFifo) AllowOpen() bool {
844844 return g & HostFifoOpen != 0
845845}
846846
847- // OverlayMedium describes how overlay medium is configured .
848- type OverlayMedium string
847+ // OverlayMediumType describes types of overlay medium.
848+ type OverlayMediumType string
849849
850850const (
851851 // NoOverlay indicates that no overlay will be applied.
852- NoOverlay = OverlayMedium ("" )
852+ NoOverlay = OverlayMediumType ("" )
853853
854854 // MemoryOverlay indicates that the overlay is backed by app memory.
855- MemoryOverlay = OverlayMedium ("memory" )
855+ MemoryOverlay = OverlayMediumType ("memory" )
856856
857857 // SelfOverlay indicates that the overlaid mount is backed by itself.
858- SelfOverlay = OverlayMedium ("self" )
858+ SelfOverlay = OverlayMediumType ("self" )
859+
860+ AnonOverlay = OverlayMediumType ("dir" )
859861
860- // AnonOverlayPrefix is the prefix that users should specify in the
862+ // anonOverlayPrefix is the prefix that users should specify in the
861863 // config for the anonymous overlay.
862- AnonOverlayPrefix = "dir="
864+ anonOverlayPrefix = "dir="
863865)
864866
867+ // OverlayMedium describes how overlay medium is configured.
868+ type OverlayMedium struct {
869+ medium OverlayMediumType
870+ // Set iff medium is AnonOverlay.
871+ dir string
872+ }
873+
874+ func OverlayMediumNoOverlay () OverlayMedium {
875+ return OverlayMedium {medium : NoOverlay }
876+ }
877+
878+ func OverlayMediumMemory () OverlayMedium {
879+ return OverlayMedium {medium : MemoryOverlay }
880+ }
881+
865882// String returns a human-readable string representing the overlay medium config.
866883func (m OverlayMedium ) String () string {
867- return string (m )
884+ switch m .medium {
885+ case NoOverlay , MemoryOverlay , SelfOverlay :
886+ return string (m .medium )
887+ case AnonOverlay :
888+ return fmt .Sprintf ("%s=%s" , AnonOverlay , m .dir )
889+ default :
890+ panic (fmt .Sprintf ("Invalid overlay medium %q" , m .medium ))
891+ }
868892}
869893
870894// Set sets the value. Set(String()) should be idempotent.
871895func (m * OverlayMedium ) Set (v string ) error {
872- switch OverlayMedium (v ) {
873- case NoOverlay , MemoryOverlay , SelfOverlay : // OK
896+ switch OverlayMediumType (v ) {
897+ case NoOverlay , MemoryOverlay , SelfOverlay :
898+ {
899+ * m = OverlayMedium {medium : OverlayMediumType (v ), dir : "" }
900+ return nil
901+ }
874902 default :
875- if ! strings .HasPrefix (v , AnonOverlayPrefix ) {
903+ if ! strings .HasPrefix (v , anonOverlayPrefix ) {
876904 return fmt .Errorf ("unexpected medium: %q" , v )
877905 }
878- if hostFileDir := strings .TrimPrefix (v , AnonOverlayPrefix ); ! filepath .IsAbs (hostFileDir ) {
906+ hostFileDir := strings .TrimPrefix (v , anonOverlayPrefix )
907+ if ! filepath .IsAbs (hostFileDir ) {
879908 return fmt .Errorf ("overlay host file directory should be an absolute path, got %q" , hostFileDir )
880909 }
910+ * m = OverlayMedium {medium : OverlayMediumType (v ), dir : hostFileDir }
881911 }
882- * m = OverlayMedium (v )
883912 return nil
884913}
885914
915+ func (m OverlayMedium ) MediumType () OverlayMediumType {
916+ return m .medium
917+ }
918+
886919// IsBackedByAnon indicates whether the overlaid mount is backed by a host file
887920// in an anonymous directory.
888921func (m OverlayMedium ) IsBackedByAnon () bool {
889- return strings . HasPrefix ( string ( m ), AnonOverlayPrefix )
922+ return m . medium == AnonOverlay
890923}
891924
892925// HostFileDir indicates the directory in which the overlay-backing host file
@@ -895,9 +928,9 @@ func (m OverlayMedium) IsBackedByAnon() bool {
895928// Precondition: m.IsBackedByAnon().
896929func (m OverlayMedium ) HostFileDir () string {
897930 if ! m .IsBackedByAnon () {
898- panic (fmt .Sprintf ("anonymous overlay medium = %q does not have %v prefix" , m , AnonOverlayPrefix ))
931+ panic (fmt .Sprintf ("anonymous overlay medium = %q does not have %v prefix" , m , anonOverlayPrefix ))
899932 }
900- return strings . TrimPrefix ( string ( m ), AnonOverlayPrefix )
933+ return m . dir
901934}
902935
903936// Overlay2 holds the configuration for setting up overlay filesystems for the
@@ -910,15 +943,15 @@ type Overlay2 struct {
910943
911944func defaultOverlay2 () * Overlay2 {
912945 // Rootfs overlay is enabled by default and backed by a file in rootfs itself.
913- return & Overlay2 {rootMount : true , subMounts : false , medium : SelfOverlay }
946+ return & Overlay2 {rootMount : true , subMounts : false , medium : OverlayMedium { medium : SelfOverlay } }
914947}
915948
916949// Set implements flag.Value. Set(String()) should be idempotent.
917950func (o * Overlay2 ) Set (v string ) error {
918951 if v == "none" {
919952 o .rootMount = false
920953 o .subMounts = false
921- o .medium = NoOverlay
954+ o .medium = OverlayMediumNoOverlay ()
922955 return nil
923956 }
924957 vs := strings .Split (v , ":" )
@@ -963,21 +996,21 @@ func (o Overlay2) String() string {
963996
964997// Enabled returns true if the overlay option is enabled for any mounts.
965998func (o * Overlay2 ) Enabled () bool {
966- return o .medium != NoOverlay
999+ return o .medium . medium != NoOverlay
9671000}
9681001
9691002// RootOverlayMedium returns the overlay medium config of the root mount.
9701003func (o * Overlay2 ) RootOverlayMedium () OverlayMedium {
9711004 if ! o .rootMount {
972- return NoOverlay
1005+ return OverlayMediumNoOverlay ()
9731006 }
9741007 return o .medium
9751008}
9761009
9771010// SubMountOverlayMedium returns the overlay medium config of submounts.
9781011func (o * Overlay2 ) SubMountOverlayMedium () OverlayMedium {
9791012 if ! o .subMounts {
980- return NoOverlay
1013+ return OverlayMediumNoOverlay ()
9811014 }
9821015 return o .medium
9831016}
0 commit comments