Skip to content

Commit 7908bb8

Browse files
Merge pull request #2069 from giuseppe/composefs-do-not-make-mount-visible
composefs fixes
2 parents 8ec73ca + 05df80e commit 7908bb8

File tree

3 files changed

+53
-50
lines changed

3 files changed

+53
-50
lines changed

drivers/overlay/composefs.go

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -137,54 +137,62 @@ func hasACL(path string) (bool, error) {
137137
return binary.LittleEndian.Uint32(flags)&LCFS_EROFS_FLAGS_HAS_ACL != 0, nil
138138
}
139139

140-
func mountComposefsBlob(dataDir, mountPoint string) error {
140+
func openComposefsMount(dataDir string) (int, error) {
141141
blobFile := getComposefsBlob(dataDir)
142142
loop, err := loopback.AttachLoopDeviceRO(blobFile)
143143
if err != nil {
144-
return err
144+
return -1, err
145145
}
146146
defer loop.Close()
147147

148148
hasACL, err := hasACL(blobFile)
149149
if err != nil {
150-
return err
150+
return -1, err
151151
}
152152

153153
fsfd, err := unix.Fsopen("erofs", 0)
154154
if err != nil {
155-
return fmt.Errorf("failed to open erofs filesystem: %w", err)
155+
return -1, fmt.Errorf("failed to open erofs filesystem: %w", err)
156156
}
157157
defer unix.Close(fsfd)
158158

159159
if err := unix.FsconfigSetString(fsfd, "source", loop.Name()); err != nil {
160-
return fmt.Errorf("failed to set source for erofs filesystem: %w", err)
160+
return -1, fmt.Errorf("failed to set source for erofs filesystem: %w", err)
161161
}
162162

163163
if err := unix.FsconfigSetFlag(fsfd, "ro"); err != nil {
164-
return fmt.Errorf("failed to set erofs filesystem read-only: %w", err)
164+
return -1, fmt.Errorf("failed to set erofs filesystem read-only: %w", err)
165165
}
166166

167167
if !hasACL {
168168
if err := unix.FsconfigSetFlag(fsfd, "noacl"); err != nil {
169-
return fmt.Errorf("failed to set noacl for erofs filesystem: %w", err)
169+
return -1, fmt.Errorf("failed to set noacl for erofs filesystem: %w", err)
170170
}
171171
}
172172

173173
if err := unix.FsconfigCreate(fsfd); err != nil {
174174
buffer := make([]byte, 4096)
175175
if n, _ := unix.Read(fsfd, buffer); n > 0 {
176-
return fmt.Errorf("failed to create erofs filesystem: %s: %w", string(buffer[:n]), err)
176+
return -1, fmt.Errorf("failed to create erofs filesystem: %s: %w", string(buffer[:n]), err)
177177
}
178-
return fmt.Errorf("failed to create erofs filesystem: %w", err)
178+
return -1, fmt.Errorf("failed to create erofs filesystem: %w", err)
179179
}
180180

181181
mfd, err := unix.Fsmount(fsfd, 0, unix.MOUNT_ATTR_RDONLY)
182182
if err != nil {
183183
buffer := make([]byte, 4096)
184184
if n, _ := unix.Read(fsfd, buffer); n > 0 {
185-
return fmt.Errorf("failed to mount erofs filesystem: %s: %w", string(buffer[:n]), err)
185+
return -1, fmt.Errorf("failed to mount erofs filesystem: %s: %w", string(buffer[:n]), err)
186186
}
187-
return fmt.Errorf("failed to mount erofs filesystem: %w", err)
187+
return -1, fmt.Errorf("failed to mount erofs filesystem: %w", err)
188+
}
189+
return mfd, nil
190+
}
191+
192+
func mountComposefsBlob(dataDir, mountPoint string) error {
193+
mfd, err := openComposefsMount(dataDir)
194+
if err != nil {
195+
return err
188196
}
189197
defer unix.Close(mfd)
190198

drivers/overlay/overlay.go

Lines changed: 30 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1456,6 +1456,31 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO
14561456
return "", err
14571457
}
14581458

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+
14591484
readWrite := !inAdditionalStore
14601485

14611486
if !d.SupportsShifting() || options.DisableShifting {
@@ -1575,7 +1600,7 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO
15751600
return "", fmt.Errorf("cannot mount a composefs layer as writeable")
15761601
}
15771602

1578-
dest := filepath.Join(composeFsLayersDir, fmt.Sprintf("%d", i))
1603+
dest := filepath.Join(composeFsLayersDir, strconv.Itoa(i))
15791604
if err := os.MkdirAll(dest, 0o700); err != nil {
15801605
return "", err
15811606
}
@@ -1683,12 +1708,6 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO
16831708
optsList = append(optsList, "metacopy=on", "redirect_dir=on")
16841709
}
16851710

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-
16921711
if len(absLowers) == 0 {
16931712
absLowers = append(absLowers, path.Join(dir, "empty"))
16941713
}
@@ -1703,26 +1722,6 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO
17031722
}
17041723
}
17051724

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-
17261725
workdir := path.Join(dir, "work")
17271726

17281727
if d.options.mountProgram == "" && unshare.IsRootless() {
@@ -2128,24 +2127,16 @@ func (d *Driver) DiffGetter(id string) (_ graphdriver.FileGetCloser, Err error)
21282127
for _, diffDir := range diffDirs {
21292128
// diffDir has the form $GRAPH_ROOT/overlay/$ID/diff, so grab the $ID from the parent directory
21302129
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 {
21332132
// not a composefs layer, ignore it
21342133
continue
21352134
}
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)
21442136
if err != nil {
21452137
return nil, err
21462138
}
2147-
composefsMounts[diffDir] = fd
2148-
_ = unix.Unmount(dir, unix.MNT_DETACH)
2139+
composefsMounts[diffDir] = os.NewFile(uintptr(fd), composefsData)
21492140
}
21502141
return &overlayFileGetter{diffDirs: diffDirs, composefsMounts: composefsMounts}, nil
21512142
}

drivers/overlay/overlay_nocgo.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import (
77
"fmt"
88
)
99

10+
func openComposefsMount(dataDir string) (int, error) {
11+
return 0, fmt.Errorf("composefs not supported on this build")
12+
}
13+
1014
func getComposeFsHelper() (string, error) {
1115
return "", fmt.Errorf("composefs not supported on this build")
1216
}

0 commit comments

Comments
 (0)