Unionfs: handle partial copyup errors gracefully
authorErez Zadok <ezk@cs.sunysb.edu>
Tue, 13 Jan 2009 04:03:15 +0000 (23:03 -0500)
committerErez Zadok <ezk@cs.sunysb.edu>
Tue, 13 Jan 2009 04:03:15 +0000 (23:03 -0500)
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 6f0e2c838b78e97804b7ed134761f9c1d923e375..7a562288a79b95e28001e79e54cb26515289bc03 100644 (file)
@@ -513,8 +513,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)) {