ext4: Expand extra_inodes space per the s_{want,min}_extra_isize fields
authorKalpak Shah <kalpak@clusterfs.com>
Wed, 18 Jul 2007 13:19:57 +0000 (09:19 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 18 Jul 2007 13:19:57 +0000 (09:19 -0400)
commit6dd4ee7cab7e3a17c571aebd444f4344c8c4946e
treeee7b36d3a83ea843746ed3c906a9ad778838b9c6
parentef7f38359ea8b3e9c7f2cae9a4d4935f55ca9e80
ext4: Expand extra_inodes space per the s_{want,min}_extra_isize fields

We need to make sure that existing ext3 filesystems can also avail the
new fields that have been added to the ext4 inode. We use
s_want_extra_isize and s_min_extra_isize to decide by how much we should
expand the inode. If EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE feature is set
then we expand the inode by max(s_want_extra_isize, s_min_extra_isize ,
sizeof(ext4_inode) - EXT4_GOOD_OLD_INODE_SIZE) bytes. Actually it is
still an open question about whether users should be able to set
s_*_extra_isize smaller than the known fields or not.

This patch also adds the functionality to expand inodes to include the
newly added fields. We start by trying to expand by s_want_extra_isize
bytes and if its fails we try to expand by s_min_extra_isize bytes. This
is done by changing the i_extra_isize if enough space is available in
the inode and no EAs are present. If EAs are present and there is enough
space in the inode then the EAs in the inode are shifted to make space.
If enough space is not available in the inode due to the EAs then 1 or
more EAs are shifted to the external EA block. In the worst case when
even the external EA block does not have enough space we inform the user
that some EA would need to be deleted or s_min_extra_isize would have to
be reduced.

Signed-off-by: Andreas Dilger <adilger@clusterfs.com>
Signed-off-by: Kalpak Shah <kalpak@clusterfs.com>
Signed-off-by: Mingming Cao <cmm@us.ibm.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/inode.c
fs/ext4/xattr.c
fs/ext4/xattr.h
include/linux/ext4_fs.h