[PATCH 3/3] xfs: drop buffer io reference when a bad bio is built

Mark Tinguely tinguely at sgi.com
Mon Nov 12 14:51:43 CST 2012


On 11/12/12 05:09, Dave Chinner wrote:
> From: Dave Chinner<dchinner at redhat.com>
>
> Error handling in xfs_buf_ioapply_map() does not handle IO reference
> counts correctly. We increment the b_io_remaining count before
> building the bio, but then fail to decrement it in the failure case.
> This leads to the buffer never running IO completion and releasing
> the reference that the IO holds, so at unmount we can leak the
> buffer. This leak is captured by this assert failure during unmount:
>
> XFS: Assertion failed: atomic_read(&pag->pag_ref) == 0, file: fs/xfs/xfs_mount.c, line: 273
>
> This is not a new bug - the b_io_remaining accounting has had this
> problem for a long, long time - it's just very hard to get a
> zero length bio being built by this code...
>
> Further, the buffer IO error can be overwritten on a multi-segment
> buffer by subsequent bio completions for partial sections of the
> buffer. Hence we should only set the buffer error status if the
> buffer is not already carrying an error status. This ensures that a
> partial IO error on a multi-segment buffer will not be lost. This
> part of the problem is a regression, however.
>
> cc:<stable at vger.kernel.org>
> Signed-off-by: Dave Chinner<dchinner at redhat.com>
> ---

Looks good.

Reviewed-by: Mark Tinguely <tinguely at sgi.com>



More information about the xfs mailing list