> > > - check the dir permission by 'ls -ld / /rw /ro /rw/tmp /ro/tmp'
> > yes all ok, all branches has 755 and all tmp has 777
> 
> Let me make sure about /tmp.
> Is its permission 0777 or 1777?

If your /rw/tmp is 1777, it may be the trigger of this aufs bug and
please try this patch.


Junjiro Okajima

----------------------------------------------------------------------

--- vfsub.c     2007/06/13 08:35:57     1.21
+++ vfsub.c     2007/06/14 13:32:17
@@ -654,9 +654,6 @@ int vfsub_unlink(struct inode *dir, stru
                .dentry = dentry
        };
 
-#ifndef CONFIG_AUFS_DLGT
-       call_unlink(&args);
-#else
        if (!dlgt)
                call_unlink(&args);
        else {
@@ -665,7 +662,7 @@ int vfsub_unlink(struct inode *dir, stru
                if (unlikely(wkq_err))
                        err = wkq_err;
        }
-#endif
+
        return err;
 }
 
--- whout.c     2007/06/14 11:16:41     1.51
+++ whout.c     2007/06/14 13:56:47
@@ -239,6 +239,22 @@ int rename_whtmp(struct dentry *dentry, 
 
 /* ---------------------------------------------------------------------- */
 
+static int do_unlink_wh(struct inode *h_dir, struct dentry *wh_dentry, int 
dlgt)
+{
+       LKTRTrace("hi%lu, wh %.*s\n", h_dir->i_ino, DLNPair(wh_dentry));
+       AuDebugOn(!wh_dentry->d_inode
+                 || !S_ISREG(wh_dentry->d_inode->i_mode));
+       IMustLock(h_dir);
+
+       /* forces superio when the dir has a sticky bit */
+       if (!dlgt
+           && (h_dir->i_mode & S_ISVTX)
+           && wh_dentry->d_inode->i_uid != current->fsuid)
+               dlgt = 1;
+
+       return vfsub_unlink(h_dir, wh_dentry, dlgt);
+}
+
 int au_unlink_wh_dentry(struct inode *hidden_dir, struct dentry *wh_dentry,
                        struct dentry *dentry, int dlgt)
 {
@@ -251,7 +267,7 @@ int au_unlink_wh_dentry(struct inode *hi
                  || !S_ISREG(wh_dentry->d_inode->i_mode));
        IMustLock(hidden_dir);
 
-       err = vfsub_unlink(hidden_dir, wh_dentry, dlgt);
+       err = do_unlink_wh(hidden_dir, wh_dentry, dlgt);
        //if (LktrCond) err = -1; // unavailable
        if (!err && dentry)
                set_dbwh(dentry, -1);
@@ -277,7 +293,7 @@ static int unlink_wh_name(struct dentry 
        if (!IS_ERR(hidden_dentry)) {
                err = 0;
                if (hidden_dentry->d_inode)
-                       err = vfsub_unlink(hidden_dir, hidden_dentry,
+                       err = do_unlink_wh(hidden_dir, hidden_dentry,
                                           lkup->dlgt);
                dput(hidden_dentry);
        } else
@@ -624,7 +640,7 @@ static struct dentry *do_diropq(struct d
        } else {
                AuDebugOn(/* !S_ISDIR(dentry->d_inode->i_mode)
                           * ||  */!opq_dentry->d_inode);
-               err = vfsub_unlink(hidden_dir, opq_dentry, lkup.dlgt);
+               err = do_unlink_wh(hidden_dir, opq_dentry, lkup.dlgt);
                //if (LktrCond) err = -1;
                if (!err)
                        set_dbdiropq(dentry, -1);

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/

Reply via email to