rmdir: catch ENOTEMPTY also when deleting a dir from a lower layer

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:
Giuseppe Scrivano 2018-07-12 12:14:54 +02:00
parent 616119093a
commit 996f297f9d
No known key found for this signature in database
GPG Key ID: E4730F97F60286ED

32
main.c
View File

@ -1578,6 +1578,26 @@ do_rm (fuse_req_t req, fuse_ino_t parent, const char *name, bool dirp)
return;
}
if (dirp)
{
size_t c;
/* Re-load the directory. */
node = load_dir (lo, node, node->layer, node->path, node->name);
if (node == NULL)
{
fuse_reply_err (req, errno);
return;
}
c = count_dir_entries (node);
if (c)
{
fuse_reply_err (req, ENOTEMPTY);
return;
}
}
if (node->layer == get_upper_layer (lo))
{
node->hidden_dirfd = node->layer->fd;
@ -1587,25 +1607,15 @@ do_rm (fuse_req_t req, fuse_ino_t parent, const char *name, bool dirp)
else
{
DIR *dp;
size_t c = 0;
int fd;
fd = TEMP_FAILURE_RETRY (openat (get_upper_layer (lo)->fd, node->path, O_DIRECTORY ));
fd = TEMP_FAILURE_RETRY (openat (get_upper_layer (lo)->fd, node->path, O_DIRECTORY));
if (fd < 0)
{
fuse_reply_err (req, errno);
return;
}
if (node->children)
c = count_dir_entries (node);
if (c)
{
close (fd);
fuse_reply_err (req, ENOTEMPTY);
return;
}
if (fd >= 0)
{
dp = fdopendir (fd);