Unionfs: handle partial copyup errors gracefully
authorErez Zadok <ezk@cs.sunysb.edu>
Fri, 7 Nov 2008 21:50:16 +0000 (16:50 -0500)
committerErez Zadok <ezk@cs.sunysb.edu>
Fri, 12 Aug 2011 02:39:00 +0000 (22:39 -0400)
Don't leave any dentries behind if copying up the inode (or setting its
permission, i.e., using TOMOYO) failed.

CC: Tetsuo Handa <penguin-kernel@i-love.sakura.ne.jp>
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/unionfs/copyup.c

index 3e0a6ab5a246339743cf0ae2401f4682e4675a0f..7613d7bd7c543462a071e2d077d10ef3986790ac 100644 (file)
@@ -527,8 +527,17 @@ out_free:
                dput(old_lower_dentry);
        kfree(symbuf);
 
-       if (err)
+       if (err) {
+               /*
+                * if directory creation succeeded, but inode copyup failed,
+                * then purge new dentries.
+                */
+               if (dbstart(dentry) < old_bstart &&
+                   ibstart(dentry->d_inode) > dbstart(dentry))
+                       __clear(dentry, NULL, old_bstart, old_bend,
+                               unionfs_lower_dentry(dentry), dbstart(dentry));
                goto out;
+       }
        if (!S_ISDIR(dentry->d_inode->i_mode)) {
                unionfs_postcopyup_release(dentry);
                if (!unionfs_lower_inode(dentry->d_inode)) {