diff -ruN linux-2.6.18/fs/unionfs/inode.c linux-2.6.18-modified/fs/unionfs/inode.c --- linux-2.6.18/fs/unionfs/inode.c 2007-08-20 16:23:45 +0400 +++ linux-2.6.18-modified/fs/unionfs/inode.c 2007-08-20 16:20:44 +0400 @@ -85,7 +85,12 @@ newattrs.ia_mode = mode & ~current->fs->umask; newattrs.ia_uid = current->fsuid; - newattrs.ia_gid = current->fsgid; + else if (parent->i_mode & S_ISGID) { + newattrs.i_gid = parent->i_gid; + if (S_ISDIR(mode)) + mode |= S_ISGID; + } else + newattrs.ia_gid = current->fsgid; if (wh_dentry->d_inode->i_size != 0) { newattrs.ia_valid |= ATTR_SIZE;