diff options
author | Tao Ma <tao.ma@oracle.com> | 2010-03-19 15:04:23 +0800 |
---|---|---|
committer | Joel Becker <joel.becker@oracle.com> | 2010-03-19 14:53:51 -0700 |
commit | dfe4d3d6a6f707fff1dbfd4b8fce65e64a91b809 (patch) | |
tree | 28bbbc33446fe576b7baaa949fcd7d74c7e23726 /fs/ocfs2/xattr.h | |
parent | b22b63ebafb97b66d1054e69941ee049d790c6cf (diff) | |
download | linux-dfe4d3d6a6f707fff1dbfd4b8fce65e64a91b809.tar.bz2 |
ocfs2: Fix the update of name_offset when removing xattrs
When replacing a xattr's value, in some case we wipe its name/value
first and then re-add it. The wipe is done by
ocfs2_xa_block_wipe_namevalue() when the xattr is in the inode or
block. We currently adjust name_offset for all the entries which have
(offset < name_offset). This does not adjust the entrie we're replacing.
Since we are replacing the entry, we don't adjust the total entry count.
When we calculate a new namevalue location, we trust the entries
now-wrong offset in ocfs2_xa_get_free_start(). The solution is to
also adjust the name_offset for the replaced entry, allowing
ocfs2_xa_get_free_start() to calculate the new namevalue location
correctly.
The following script can trigger a kernel panic easily.
echo 'y'|mkfs.ocfs2 --fs-features=local,xattr -b 4K $DEVICE
mount -t ocfs2 $DEVICE $MNT_DIR
FILE=$MNT_DIR/$RANDOM
for((i=0;i<76;i++))
do
string_76="a$string_76"
done
string_78="aa$string_76"
string_82="aaaa$string_78"
touch $FILE
setfattr -n 'user.test1234567890' -v $string_76 $FILE
setfattr -n 'user.test1234567890' -v $string_78 $FILE
setfattr -n 'user.test1234567890' -v $string_82 $FILE
Signed-off-by: Tao Ma <tao.ma@oracle.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Diffstat (limited to 'fs/ocfs2/xattr.h')
0 files changed, 0 insertions, 0 deletions