From c799ba9ab61762c882c888393224f770ca51887c Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Mon, 11 Mar 2024 13:55:02 +0100 Subject: [PATCH] [release-1.45] overlay: create the merged path only if it does not exist follow-up for ccb70a79a69a1a5137ff24720520534bfbcc2316 more information here: https://github.com/containers/storage/issues/1827#issuecomment-1988332922 Addresses: https://issues.redhat.com/browse/ACCELFIX-244 Signed-off-by: Giuseppe Scrivano Signed-off-by: tomsweeneyredhat --- drivers/overlay/overlay.go | 10 ++++++---- tests/overlay-recreate.bats | 5 ++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/overlay/overlay.go b/drivers/overlay/overlay.go index d6abb7628c..15b343d156 100644 --- a/drivers/overlay/overlay.go +++ b/drivers/overlay/overlay.go @@ -1479,9 +1479,11 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO } mergedDir := path.Join(dir, "merged") - // Create the driver merged dir - if err := idtools.MkdirAs(mergedDir, 0700, rootUID, rootGID); err != nil && !os.IsExist(err) { - return "", err + // Attempt to create the merged dir only if it doesn't exist. + if _, err := os.Stat(mergedDir); err != nil && os.IsNotExist(err) { + if err := idtools.MkdirAs(mergedDir, 0o700, rootUID, rootGID); err != nil && !os.IsExist(err) { + return "", err + } } if count := d.ctr.Increment(mergedDir); count > 1 { return mergedDir, nil @@ -1639,7 +1641,7 @@ func (d *Driver) get(id string, disableShifting bool, options graphdriver.MountO // Put unmounts the mount path created for the give id. func (d *Driver) Put(id string) error { - dir, _, inAdditionalStore := d.dir2(id) + dir, inAdditionalStore := d.dir2(id) if _, err := os.Stat(dir); err != nil { return err } diff --git a/tests/overlay-recreate.bats b/tests/overlay-recreate.bats index 038a48810a..c3ebbb3297 100644 --- a/tests/overlay-recreate.bats +++ b/tests/overlay-recreate.bats @@ -18,7 +18,8 @@ load helpers storage unmount "$lowerlayer" storage mount "$midlayer" storage unmount "$midlayer" - storage mount "$upperlayer" + run storage --debug=false mount "$upperlayer" + merged_dir="$output" storage unmount "$upperlayer" # okay, but how about this? rm -v ${TESTDIR}/root/overlay/*/link @@ -27,6 +28,8 @@ load helpers storage unmount "$lowerlayer" storage mount "$midlayer" storage unmount "$midlayer" + # check it works if we delete the merged directory. + rmdir "$merged_dir" storage mount "$upperlayer" storage unmount "$upperlayer" # okay, not bad, kid.