@@ -1456,6 +1456,31 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO
1456
1456
return "" , err
1457
1457
}
1458
1458
1459
+ // user namespace requires this to move a directory from lower to upper.
1460
+ rootUID , rootGID , err := idtools .GetRootUIDGID (options .UidMaps , options .GidMaps )
1461
+ if err != nil {
1462
+ return "" , err
1463
+ }
1464
+
1465
+ mergedDir := d .getMergedDir (id , dir , inAdditionalStore )
1466
+ // Attempt to create the merged dir if it doesn't exist, but don't chown an already existing directory (it might be in an additional store)
1467
+ if err := idtools .MkdirAllAndChownNew (mergedDir , 0o700 , idtools.IDPair {UID : rootUID , GID : rootGID }); err != nil && ! os .IsExist (err ) {
1468
+ return "" , err
1469
+ }
1470
+
1471
+ if count := d .ctr .Increment (mergedDir ); count > 1 {
1472
+ return mergedDir , nil
1473
+ }
1474
+ defer func () {
1475
+ if retErr != nil {
1476
+ if c := d .ctr .Decrement (mergedDir ); c <= 0 {
1477
+ if mntErr := unix .Unmount (mergedDir , 0 ); mntErr != nil {
1478
+ logrus .Errorf ("Unmounting %v: %v" , mergedDir , mntErr )
1479
+ }
1480
+ }
1481
+ }
1482
+ }()
1483
+
1459
1484
readWrite := ! inAdditionalStore
1460
1485
1461
1486
if ! d .SupportsShifting () || options .DisableShifting {
@@ -1575,7 +1600,7 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO
1575
1600
return "" , fmt .Errorf ("cannot mount a composefs layer as writeable" )
1576
1601
}
1577
1602
1578
- dest := filepath .Join (composeFsLayersDir , fmt . Sprintf ( "%d" , i ))
1603
+ dest := filepath .Join (composeFsLayersDir , strconv . Itoa ( i ))
1579
1604
if err := os .MkdirAll (dest , 0o700 ); err != nil {
1580
1605
return "" , err
1581
1606
}
@@ -1683,12 +1708,6 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO
1683
1708
optsList = append (optsList , "metacopy=on" , "redirect_dir=on" )
1684
1709
}
1685
1710
1686
- // user namespace requires this to move a directory from lower to upper.
1687
- rootUID , rootGID , err := idtools .GetRootUIDGID (options .UidMaps , options .GidMaps )
1688
- if err != nil {
1689
- return "" , err
1690
- }
1691
-
1692
1711
if len (absLowers ) == 0 {
1693
1712
absLowers = append (absLowers , path .Join (dir , "empty" ))
1694
1713
}
@@ -1703,26 +1722,6 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO
1703
1722
}
1704
1723
}
1705
1724
1706
- mergedDir := d .getMergedDir (id , dir , inAdditionalStore )
1707
- // Attempt to create the merged dir only if it doesn't exist.
1708
- if err := fileutils .Exists (mergedDir ); err != nil && os .IsNotExist (err ) {
1709
- if err := idtools .MkdirAllAs (mergedDir , 0o700 , rootUID , rootGID ); err != nil && ! os .IsExist (err ) {
1710
- return "" , err
1711
- }
1712
- }
1713
- if count := d .ctr .Increment (mergedDir ); count > 1 {
1714
- return mergedDir , nil
1715
- }
1716
- defer func () {
1717
- if retErr != nil {
1718
- if c := d .ctr .Decrement (mergedDir ); c <= 0 {
1719
- if mntErr := unix .Unmount (mergedDir , 0 ); mntErr != nil {
1720
- logrus .Errorf ("Unmounting %v: %v" , mergedDir , mntErr )
1721
- }
1722
- }
1723
- }
1724
- }()
1725
-
1726
1725
workdir := path .Join (dir , "work" )
1727
1726
1728
1727
if d .options .mountProgram == "" && unshare .IsRootless () {
@@ -2128,24 +2127,16 @@ func (d *Driver) DiffGetter(id string) (_ graphdriver.FileGetCloser, Err error)
2128
2127
for _ , diffDir := range diffDirs {
2129
2128
// diffDir has the form $GRAPH_ROOT/overlay/$ID/diff, so grab the $ID from the parent directory
2130
2129
id := path .Base (path .Dir (diffDir ))
2131
- composefsBlob := d .getComposefsData (id )
2132
- if fileutils .Exists (composefsBlob ) != nil {
2130
+ composefsData := d .getComposefsData (id )
2131
+ if fileutils .Exists (composefsData ) != nil {
2133
2132
// not a composefs layer, ignore it
2134
2133
continue
2135
2134
}
2136
- dir , err := os .MkdirTemp (d .runhome , "composefs-mnt" )
2137
- if err != nil {
2138
- return nil , err
2139
- }
2140
- if err := mountComposefsBlob (composefsBlob , dir ); err != nil {
2141
- return nil , err
2142
- }
2143
- fd , err := os .Open (dir )
2135
+ fd , err := openComposefsMount (composefsData )
2144
2136
if err != nil {
2145
2137
return nil , err
2146
2138
}
2147
- composefsMounts [diffDir ] = fd
2148
- _ = unix .Unmount (dir , unix .MNT_DETACH )
2139
+ composefsMounts [diffDir ] = os .NewFile (uintptr (fd ), composefsData )
2149
2140
}
2150
2141
return & overlayFileGetter {diffDirs : diffDirs , composefsMounts : composefsMounts }, nil
2151
2142
}
0 commit comments