diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index 74340542824a41db2a94f2a70025e0f6e65ba6b5..71e21d13982ad83c594cb3ce1a7593f25935aa82 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -1186,9 +1186,13 @@ static int ovl_rename(struct inode *olddir, struct dentry *old, goto out_dput; } } else { - if (!d_is_negative(newdentry) && - (!new_opaque || !ovl_is_whiteout(newdentry))) - goto out_dput; + if (!d_is_negative(newdentry)) { + if (!new_opaque || !ovl_is_whiteout(newdentry)) + goto out_dput; + } else { + if (flags & RENAME_EXCHANGE) + goto out_dput; + } } if (olddentry == trap)