mirror of
https://github.com/containers/fuse-overlayfs.git
synced 2025-09-07 14:21:36 -04:00
Merge pull request #445 from giuseppe/fix-lookup-lower-layers-of-freshly-created-dir
main: lookup upperdir only for created directories
This commit is contained in:
commit
e8532dce73
60
main.c
60
main.c
@ -1526,6 +1526,7 @@ make_ovl_node (struct ovl_data *lo, const char *path, struct ovl_layer *layer, c
|
|||||||
struct ovl_layer *it;
|
struct ovl_layer *it;
|
||||||
cleanup_free char *npath = NULL;
|
cleanup_free char *npath = NULL;
|
||||||
char whiteout_path[PATH_MAX];
|
char whiteout_path[PATH_MAX];
|
||||||
|
bool stop_lookup = false;
|
||||||
|
|
||||||
npath = strdup (ret->path);
|
npath = strdup (ret->path);
|
||||||
if (npath == NULL)
|
if (npath == NULL)
|
||||||
@ -1536,13 +1537,16 @@ make_ovl_node (struct ovl_data *lo, const char *path, struct ovl_layer *layer, c
|
|||||||
else
|
else
|
||||||
strconcat3 (whiteout_path, PATH_MAX, "/.wh.", name, NULL);
|
strconcat3 (whiteout_path, PATH_MAX, "/.wh.", name, NULL);
|
||||||
|
|
||||||
for (it = layer; it; it = it->next)
|
for (it = layer; it && ! stop_lookup; it = it->next)
|
||||||
{
|
{
|
||||||
ssize_t s;
|
ssize_t s;
|
||||||
cleanup_free char *val = NULL;
|
cleanup_free char *val = NULL;
|
||||||
cleanup_free char *origin = NULL;
|
cleanup_free char *origin = NULL;
|
||||||
cleanup_close int fd = -1;
|
cleanup_close int fd = -1;
|
||||||
|
|
||||||
|
if (parent && parent->last_layer == it)
|
||||||
|
stop_lookup = true;
|
||||||
|
|
||||||
if (dir_p)
|
if (dir_p)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
@ -4982,42 +4986,6 @@ ovl_readlink (fuse_req_t req, fuse_ino_t ino)
|
|||||||
fuse_reply_readlink (req, buf);
|
fuse_reply_readlink (req, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
hide_all (struct ovl_data *lo, struct ovl_node *node)
|
|
||||||
{
|
|
||||||
struct ovl_node **nodes;
|
|
||||||
size_t i, nodes_size;
|
|
||||||
|
|
||||||
node = reload_dir (lo, node);
|
|
||||||
if (node == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
nodes_size = hash_get_n_entries (node->children) + 2;
|
|
||||||
nodes = malloc (sizeof (struct ovl_node *) * nodes_size);
|
|
||||||
if (nodes == NULL)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
nodes_size = hash_get_entries (node->children, (void **) nodes, nodes_size);
|
|
||||||
for (i = 0; i < nodes_size; i++)
|
|
||||||
{
|
|
||||||
struct ovl_node *it;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
it = nodes[i];
|
|
||||||
ret = create_whiteout (lo, node, it->name, false, true);
|
|
||||||
node_free (it);
|
|
||||||
|
|
||||||
if (ret < 0)
|
|
||||||
{
|
|
||||||
free (nodes);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
free (nodes);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ovl_mknod (fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode, dev_t rdev)
|
ovl_mknod (fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode, dev_t rdev)
|
||||||
{
|
{
|
||||||
@ -5239,21 +5207,9 @@ ovl_mkdir (fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parent_upperdir_only)
|
node->last_layer = get_upper_layer (lo);
|
||||||
{
|
if (get_timeout (lo) > 0)
|
||||||
node->last_layer = pnode->last_layer;
|
node->loaded = 1;
|
||||||
if (get_timeout (lo) > 0)
|
|
||||||
node->loaded = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = hide_all (lo, node);
|
|
||||||
if (ret < 0)
|
|
||||||
{
|
|
||||||
fuse_reply_err (req, errno);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
memset (&e, 0, sizeof (e));
|
memset (&e, 0, sizeof (e));
|
||||||
|
|
||||||
|
@ -258,3 +258,18 @@ fuse-overlayfs -o lowerdir=lower,upperdir=upper,workdir=workdir merged
|
|||||||
stat merged/foo
|
stat merged/foo
|
||||||
|
|
||||||
umount merged
|
umount merged
|
||||||
|
|
||||||
|
# https://github.com/containers/fuse-overlayfs/issues/444
|
||||||
|
|
||||||
|
rm -rf lower upper workdir merged
|
||||||
|
mkdir lower upper workdir merged
|
||||||
|
|
||||||
|
mkdir -p lower/base/test/test1
|
||||||
|
touch lower/base/test/test1/test1-file
|
||||||
|
|
||||||
|
fuse-overlayfs -o lowerdir=lower,upperdir=upper,workdir=workdir merged
|
||||||
|
|
||||||
|
mv merged/base/test/test1 merged/base/test/tmp
|
||||||
|
cp -r merged/base/test/tmp merged/base/test/test1
|
||||||
|
|
||||||
|
umount merged
|
||||||
|
Loading…
x
Reference in New Issue
Block a user