diff options
author | Andreas Gruenbacher <agruen@suse.de> | 2005-01-25 04:42:01 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-01-25 04:42:01 -0800 |
commit | 8183c4b297edc372e1cc7207e4545c50195e78ad (patch) | |
tree | 99a9d02360368b45e6a2949e7eb89af8c814a39a /fs/ext3/xattr.c | |
parent | 53a6bb2fc2d1a6664f205a86eb582dc1294ba337 (diff) | |
download | history-8183c4b297edc372e1cc7207e4545c50195e78ad.tar.gz |
[PATCH] ext3/ea: ix i_extra_isize check
We are checking for (EXT3_SB(inode->i_sb)->s_inode_size <=
EXT3_GOOD_OLD_INODE_SIZE) to find out if we can set in-inode attributes;
the test fails for inodes that have been created before the ea-in-inode
patch. Those inodes have (i_extra_isize == 0), so we end up with the
attributes overlapping the i_extra_isize field. Checking for
(i_extra_isize == 0) instead fixes this case.
The EXT3_STATE_XATTR flag is only set if (i_extra_isize > 0) and the inodes
has in-inode attributes, so that is enough in the first two tests.
Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/ext3/xattr.c')
-rw-r--r-- | fs/ext3/xattr.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/fs/ext3/xattr.c b/fs/ext3/xattr.c index 98555e51cc2fbc..4f6e37c1199ecd 100644 --- a/fs/ext3/xattr.c +++ b/fs/ext3/xattr.c @@ -272,8 +272,7 @@ ext3_xattr_ibody_get(struct inode *inode, int name_index, const char *name, void *end; int error; - if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE || - !(EXT3_I(inode)->i_state & EXT3_STATE_XATTR)) + if (!(EXT3_I(inode)->i_state & EXT3_STATE_XATTR)) return -ENODATA; error = ext3_get_inode_loc(inode, &iloc); if (error) @@ -399,8 +398,7 @@ ext3_xattr_ibody_list(struct inode *inode, char *buffer, size_t buffer_size) void *end; int error; - if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE || - !(EXT3_I(inode)->i_state & EXT3_STATE_XATTR)) + if (!(EXT3_I(inode)->i_state & EXT3_STATE_XATTR)) return 0; error = ext3_get_inode_loc(inode, &iloc); if (error) @@ -865,7 +863,7 @@ ext3_xattr_ibody_find(struct inode *inode, struct ext3_xattr_info *i, struct ext3_inode *raw_inode; int error; - if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) + if (EXT3_I(inode)->i_extra_isize == 0) return 0; raw_inode = ext3_raw_inode(&is->iloc); header = IHDR(inode, raw_inode); @@ -896,7 +894,7 @@ ext3_xattr_ibody_set(handle_t *handle, struct inode *inode, struct ext3_xattr_search *s = &is->s; int error; - if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) + if (EXT3_I(inode)->i_extra_isize == 0) return -ENOSPC; error = ext3_xattr_set_entry(i, s); if (error) |