main: mark directory not loaded on rename

if a whiteout was created as part of a rename operation, mark the
directory content as not loaded so to avoid some optimizations when a
whiteout file must be deleted.

Closes: https://github.com/containers/fuse-overlayfs/issues/279

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:
Giuseppe Scrivano 2021-03-05 15:35:12 +01:00
parent 062ec18711
commit d612d48326
No known key found for this signature in database
GPG Key ID: E4730F97F60286ED
2 changed files with 19 additions and 0 deletions

2
main.c
View File

@ -4555,6 +4555,8 @@ ovl_rename_direct (fuse_req_t req, fuse_ino_t parent, const char *name,
ret = create_whiteout (lo, pnode, name, false, true);
if (ret < 0)
goto error;
pnode->loaded = 0;
}
if (delete_whiteout (lo, destfd, NULL, newname) < 0)

View File

@ -211,3 +211,20 @@ touch merged/a merged/b
chmod 6 merged/a
mv merged/a merged/x
mv merged/b merged/a
# https://github.com/containers/fuse-overlayfs/issues/279
umount -l merged
rm -rf lower upper workdir merged
mkdir lower upper workdir merged
mkdir lower/test
touch lower/test/a.txt
fuse-overlayfs -o lowerdir=lower,upperdir=upper,workdir=workdir merged
(cd merged/test; touch a.txt; mv a.txt a2.txt; touch a3.txt; ln -s a3.txt a.txt)
if test -e upperdir/test/.wh.a.txt; then
echo "whiteout file still exists" >&2
exit 1
fi