From: Erez Zadok Date: Mon, 29 Oct 2007 00:24:39 +0000 (-0400) Subject: Unionfs: delete whiteouts in sticky directories X-Git-Tag: unionfs-2.1.8~8 X-Git-Url: https://git.fsl.cs.sunysb.edu/?a=commitdiff_plain;h=753b576c92043cc81f8c48877bf53994e2ed4e7d;p=unionfs-2.6.31.y.git Unionfs: delete whiteouts in sticky directories This is needed to maintain Unix semantics. Signed-off-by: Erez Zadok --- diff --git a/fs/unionfs/inode.c b/fs/unionfs/inode.c index 6ca52f4863f..f4facf42a9c 100644 --- a/fs/unionfs/inode.c +++ b/fs/unionfs/inode.c @@ -90,6 +90,23 @@ static int unionfs_create(struct inode *parent, struct dentry *dentry, err = vfs_unlink(lower_dir_dentry->d_inode, wh_dentry); unlock_dir(lower_dir_dentry); + /* + * Whiteouts are special files and should be deleted + * no matter what (as if they never existed), in + * order to allow this create operation to succeed. + * This is especially important in sticky + * directories: a whiteout may have been created by + * one user, but the newly created file may be + * created by another user. Therefore, in order to + * maintain Unix semantics, if the vfs_unlink above + * ailed, then we have to try to directly unlink the + * whiteout. Note: in the ODF version of unionfs, + * whiteout are handled much more cleanly. + */ + if (err == -EPERM) { + struct inode *inode = lower_dir_dentry->d_inode; + err = inode->i_op->unlink(inode, wh_dentry); + } if (err) { printk(KERN_ERR "unionfs: create: could not " "unlink whiteout, err = %d\n", err);