OOT: sharing about my research about why stat and ls show difference used block count upon a file

Manish Katiyar mkatiyar at gmail.com
Sat Jul 2 16:13:17 EDT 2011


2011/7/2 Mulyadi Santosa <mulyadi.santosa at gmail.com>:
> Hi Joao! :)
>
> 2011/7/2 João Eduardo Luís <jecluis at gmail.com>:
>> Hello.
>>
>> Nice post. I had never noticed that. And I am able to reproduce the ls-stat behavior on a debian box with ext4 fs and no SELinux, or any other ACL's whatsoever.
>
> OK, so far I can conclude it's not 100% reproducible on every
> case...and it looks it is indeed due to enabled ACL and/or
> SELinux...hmmmmmm
>
>
>> You state:
>>
>>> But my friend pointed that stat was accouting extra blocks that might (I say "might" because my friend is not so sure) contain metadata such as SELinux and ACL.

Hi,

After reading a bit of ext3 code, I'm now fairly sure the blocks
allocated for extended attributes are counted as i_blocks (which stat
returns) for an inode. Extented attributes for an inode can either
reside in the inode or can at max span 1 filesystem block{size.}.  The
extra allocated block number for the inode is stored in i_file_acl
field of the inode.

As an example, kernel has various code paths which given a symlink
tries to determine whether the symlink is a fast or a slow one. "fast"
means the path is less than 64 bytes long and resides in inode itself
while slow means the path exists in a block and the block needs to be
loaded to resolve the symlink. So for fast symlinks i_blocks should be
0 for an inode.

Now have a look at the code which determines whether the symlink is
fast or slow.

/*
 * Test whether an inode is a fast symlink.
 */
static int ext3_inode_is_fast_symlink(struct inode *inode)
{
        int ea_blocks = EXT3_I(inode)->i_file_acl ?
                (inode->i_sb->s_blocksize >> 9) : 0;

        return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks == 0);
}


Further reading revealed that we do allocate a new block for inode
when we set xattrs.

static int ext3_xattr_block_set() {
..........
      ext3_new_block();
.....
}

So, I think if you have extended attributes which reside in an
external block, it will be counted in i_blocks.

-- 
Thanks -
Manish



More information about the Kernelnewbies mailing list