]> git.baikalelectronics.ru Git - kernel.git/commit
xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end
authorDave Chinner <dchinner@redhat.com>
Mon, 21 Jan 2013 12:53:52 +0000 (23:53 +1100)
committerBen Myers <bpm@sgi.com>
Thu, 24 Jan 2013 17:06:41 +0000 (11:06 -0600)
commitbe18652592ad3ec1c46b2d3a27d31f5823094fc4
treefd8b03f594e7996624c156d792652249a5db491a
parent477e9a7ae27d7983b4a7306066a5aba72a49f260
xfs: fix _xfs_buf_find oops on blocks beyond the filesystem end

When _xfs_buf_find is passed an out of range address, it will fail
to find a relevant struct xfs_perag and oops with a null
dereference. This can happen when trying to walk a filesystem with a
metadata inode that has a partially corrupted extent map (i.e. the
block number returned is corrupt, but is otherwise intact) and we
try to read from the corrupted block address.

In this case, just fail the lookup. If it is readahead being issued,
it will simply not be done, but if it is real read that fails we
will get an error being reported.  Ideally this case should result
in an EFSCORRUPTED error being reported, but we cannot return an
error through xfs_buf_read() or xfs_buf_get() so this lookup failure
may result in ENOMEM or EIO errors being reported instead.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Ben Myers <bpm@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
fs/xfs/xfs_buf.c