Re: Fix ea-in-inode default ACL creation

From: Valdis . Kletnieks
Date: Thu Jan 20 2005 - 14:07:16 EST


On Thu, 20 Jan 2005 19:22:25 +0100, Andreas Gruenbacher said:

> 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 <agruen@xxxxxxx>
>
> 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;

Maybe I'm a total idiot, but I'm failing to see how adding *another* zero
operation (although quite likely needed at that point) is going to help the
fact that we zero something out after we've stored data we want to keep in it.
Is there a missing hunk that *removes* the too-late memset-to-zero in
ext3_do_update_inode?

Attachment: pgp00000.pgp
Description: PGP signature