From f58a9c452eda3803284f528df173b81a8c811a43 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Thu, 12 Jul 2018 18:32:06 +0200 Subject: [PATCH] fuse-overlayfs: skip whiteouts when comparing hardlinks during a rename Signed-off-by: Giuseppe Scrivano --- main.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/main.c b/main.c index 6c3c902..eb832b4 100644 --- a/main.c +++ b/main.c @@ -2481,7 +2481,7 @@ ovl_rename (fuse_req_t req, fuse_ino_t parent, const char *name, } } - if (destnode != NULL && node_dirp (destnode)) + if (destnode != NULL && !destnode->whiteout && node_dirp (destnode)) { errno = EISDIR; goto error; @@ -2490,7 +2490,7 @@ ovl_rename (fuse_req_t req, fuse_ino_t parent, const char *name, rm = hash_lookup (destpnode->children, &key); if (rm) { - if (rm->ino == node->ino) + if (!rm->whiteout && rm->ino == node->ino) { fuse_reply_err (req, 0); return; @@ -2562,6 +2562,8 @@ ovl_rename (fuse_req_t req, fuse_ino_t parent, const char *name, } else { + unlinkat (destfd, newname, 0); + /* Try to create the whiteout atomically, if it fails do the rename+mknod separately. */ ret = syscall (SYS_renameat2, srcfd, name, destfd,