Hello,

here is another nastiness.

When a new inode is created, ext3_new_inode sets the EXT3_STATE_NEW
flag, which tells ext3_do_update_inode to zero out the inode before
filling in the inode's data. When a file is created in a directory with
a default acl, the new inode inherits the directory's default acl; this
generates attributes. The attributes are created before
ext3_do_update_inode is called to write out the inode. In case of
in-inode attributes, the new inode's attributes are written, and then
zeroed out again by ext3_do_update_inode. Bad thing.

Fix this by recognizing the EXT3_STATE_NEW case in
ext3_xattr_set_handle, and zeroing out the inode there already when
necessary.

Signed-off-by: Andreas Gruenbacher <[EMAIL PROTECTED]>

Index: linux-2.6.11-latest/fs/ext3/xattr.c
===================================================================
--- linux-2.6.11-latest.orig/fs/ext3/xattr.c
+++ linux-2.6.11-latest/fs/ext3/xattr.c
@@ -954,6 +954,13 @@ ext3_xattr_set_handle(handle_t *handle, 
        error = ext3_get_inode_loc(inode, &is.iloc);
        if (error)
                goto cleanup;
+
+       if (EXT3_I(inode)->i_state & EXT3_STATE_NEW) {
+               struct ext3_inode *raw_inode = ext3_raw_inode(&is.iloc);
+               memset(raw_inode, 0, EXT3_SB(inode->i_sb)->s_inode_size);
+               EXT3_I(inode)->i_state &= ~EXT3_STATE_NEW;
+       }
+
        error = ext3_xattr_ibody_find(inode, &i, &is);
        if (error)
                goto cleanup;


-- 
Andreas Gruenbacher <[EMAIL PROTECTED]>
SUSE Labs, SUSE LINUX GMBH

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to