diff options
author | Dave Chinner <dchinner@redhat.com> | 2011-06-23 01:35:01 +0000 |
---|---|---|
committer | Alex Elder <aelder@sgi.com> | 2011-06-23 22:13:51 -0500 |
commit | 4a33821236f2ef3af0081e8a5eec1301cbed3125 (patch) | |
tree | 4bb7c6f9e8ceb2b3e6cdd8bea7a76bb73676b58f /fs/xfs/xfs_trans.c | |
parent | df4368a146d2b350b8398babfe11e2088f741d67 (diff) |
xfs: prevent bogus assert when trying to remove non-existent attribute
If the attribute fork on an inode is in btree format and has
multiple levels (i.e node format rather than leaf format), then a
lookup failure will trigger an assert failure in xfs_da_path_shift
if the flag XFS_DA_OP_OKNOENT is not set. This flag is used to
indicate to the directory btree code that not finding an entry is
not a fatal error. In the case of doing a lookup for a directory
name removal, this is valid as a user cannot insert an arbitrary
name to remove from the directory btree.
However, in the case of the attribute tree, a user has direct
control over the attribute name and can ask for any random name to
be removed without any validation. In this case, fsstress is asking
for a non-existent user.selinux attribute to be removed, and that is
causing xfs_da_path_shift() to fall off the bottom of the tree where
it asserts that a lookup failure is allowed. Because the flag is not
set, we die a horrible death on a debug enable kernel.
Prevent this assert from firing on attribute removes by adding the
op_flag XFS_DA_OP_OKNOENT to atribute removal operations.
Discovered when testing on a SELinux enabled system by fsstress in
test 070 by trying to remove a non-existent user.selinux attribute.
Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Alex Elder <aelder@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_trans.c')
0 files changed, 0 insertions, 0 deletions