Sophie

Sophie

distrib > Mandriva > 2010.0 > x86_64 > media > main-testing-src > by-pkgid > 96f7fe61071df56dd93e28c9f384387d > files > 1

unionfs-1.4-5mdv2010.0.src.rpm

diff -p -up linux-2.6.26/fs/unionfs/inode.c.orig linux-2.6.26/fs/unionfs/inode.c
--- linux-2.6.26/fs/unionfs/inode.c.orig	2008-09-04 15:39:27.000000000 -0300
+++ linux-2.6.26/fs/unionfs/inode.c	2008-09-04 15:44:19.000000000 -0300
@@ -78,15 +78,14 @@ static int unionfs_create(struct inode *
 		struct dentry *hidden_dir_dentry;
 		struct iattr newattrs;
 
-		mutex_lock(&whiteout_dentry->d_inode->i_mutex);
 		newattrs.ia_valid = ATTR_CTIME | ATTR_ATIME
-		    | ATTR_MTIME | ATTR_UID | ATTR_GID | ATTR_FORCE
-		    | ATTR_KILL_SUID | ATTR_KILL_SGID;
+		    | ATTR_MTIME | ATTR_UID | ATTR_GID | ATTR_FORCE;
 
-		newattrs.ia_mode = mode & ~current->fs->umask;
+		newattrs.ia_mode = mode & ~(current->fs->umask|S_ISUID|S_ISGID);
 		newattrs.ia_uid = current->fsuid;
 		newattrs.ia_gid = current->fsgid;
 
+		mutex_lock(&whiteout_dentry->d_inode->i_mutex);
 		if (whiteout_dentry->d_inode->i_size != 0) {
 			newattrs.ia_valid |= ATTR_SIZE;
 			newattrs.ia_size = 0;
@@ -911,6 +910,9 @@ static int unionfs_setattr(struct dentry
 	bend = dbend(dentry);
 	inode = dentry->d_inode;
 
+	if (ia->ia_valid & (ATTR_KILL_SUID | ATTR_KILL_SGID))
+		ia->ia_valid &= ~ATTR_MODE;
+
 	for (bindex = bstart; (bindex <= bend) || (bindex == bstart); bindex++) {
 		hidden_dentry = dtohd_index(dentry, bindex);
 		if (!hidden_dentry)