On Mon, Dec 12, 2016 at 04:00:26PM -0600, Eric Sandeen wrote: > Jason reported that a corrupted filesystem failed to replay > the log with a metadata block out of bounds warning: > > XFS (dm-2): _xfs_buf_find: Block out of range: block 0x80270fff8, EOFS 0x9c40000 > > _xfs_buf_find() and xfs_btree_get_bufs() return NULL if > that happens, and then when xfs_alloc_fix_freelist() calls > xfs_trans_binval() on that NULL bp, we oops with: > > BUG: unable to handle kernel NULL pointer dereference at 00000000000000f8 > > We don't handle _xfs_buf_find errors very well, every > caller higher up the stack gets to guess at why it failed. > But we should at least handle it somehow. I chose EIO here > for lack of a better idea. :) > > Reported-by: Jason L Tibbitts III <tibbs@xxxxxxxxxxx> > Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx> > --- > > diff --git a/fs/xfs/libxfs/xfs_alloc.c b/fs/xfs/libxfs/xfs_alloc.c > index effb64c..d125135 100644 > --- a/fs/xfs/libxfs/xfs_alloc.c > +++ b/fs/xfs/libxfs/xfs_alloc.c > @@ -1640,6 +1640,10 @@ STATIC int xfs_alloc_ag_vextent_small(xfs_alloc_arg_t *, > > bp = xfs_btree_get_bufs(args->mp, args->tp, > args->agno, fbno, 0); > + if (!bp) { > + error = -EIO; > + goto error0; > + } If this happens, it's because the filesystem is corrupted, not because we had an IO error. -EFSCORRUPTED is more appropriate here, as the comment in _xfs_buf_find() says... Cheers, Dave. -- Dave Chinner david@xxxxxxxxxxxxx -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html