* [PATCH] xfs: fix buffer shudown reference count mismatch
@ 2012-10-30 0:20 Dave Chinner
2012-10-30 19:26 ` Christoph Hellwig
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Dave Chinner @ 2012-10-30 0:20 UTC (permalink / raw)
To: xfs
From: Dave Chinner <dchinner@redhat.com>
When we shut down the filesystem, we have to unpin and free all the
buffers currently active in the CIL. To do this we unpin and remove
them in one operation as a result of a failed iclogbuf write. For
buffers, we do this removal via a simultated IO completion of after
marking the buffer stale.
At the time we do this, we have two references to the buffer - the
active LRU reference and the buf log item. The LRU reference is
removed by marking the buffer stale, and the active CIL reference is
by the xfs_buf_iodone() callback that is run by
xfs_buf_do_callbacks() during ioend processing (via the bp->b_iodone
callback).
However, ioend processing requires one more reference - that of the
IO that it is completing. We don't have this reference, so we free
the buffer prematurely and use it after it is freed. This leads to
assert failures in xfs_buf_rele() on debug kernels because the
b_hold count is zero.
Fix this by making sure we take the necessary IO reference before
starting IO completion processing on the stale buffer.
Cc: <stable@vger.kernel.org>
Signed-off-by: Dave Chinner <dchinner@redhat.com>
---
fs/xfs/xfs_buf_item.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
index a8d0ed9..b72fe88 100644
--- a/fs/xfs/xfs_buf_item.c
+++ b/fs/xfs/xfs_buf_item.c
@@ -526,7 +526,23 @@ xfs_buf_item_unpin(
}
xfs_buf_relse(bp);
} else if (freed && remove) {
+ /*
+ * There are currently two references to the buffer - the active
+ * LRU reference and the buf log item. What we are about to do
+ * here - simulate a failed IO completion - requires 3
+ * references.
+ *
+ * The LRU reference is removed by the xfs_buf_stale() call. The
+ * buf item reference is removed by the xfs_buf_iodone()
+ * callback that is run by xfs_buf_do_callbacks() during ioend
+ * processing (via the bp->b_iodone callback), and then finally
+ * the ioend processing drops the IO reference.
+ *
+ * Hence we need to take an additional reference here so that IO
+ * completion processing doesn't free the buffer prematurely.
+ */
xfs_buf_lock(bp);
+ xfs_buf_hold(bp);
xfs_buf_ioerror(bp, EIO);
XFS_BUF_UNDONE(bp);
xfs_buf_stale(bp);
--
1.7.10
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] xfs: fix buffer shudown reference count mismatch
2012-10-30 0:20 [PATCH] xfs: fix buffer shudown reference count mismatch Dave Chinner
@ 2012-10-30 19:26 ` Christoph Hellwig
2012-10-30 20:03 ` Carlos Maiolino
2012-10-31 17:09 ` Mark Tinguely
2 siblings, 0 replies; 5+ messages in thread
From: Christoph Hellwig @ 2012-10-30 19:26 UTC (permalink / raw)
To: Dave Chinner; +Cc: xfs
> Fix this by making sure we take the necessary IO reference before
> starting IO completion processing on the stale buffer.
>
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
Oops, that's my fault.
Reviewed-by: Christoph Hellwig <hch@lst.de>
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] xfs: fix buffer shudown reference count mismatch
2012-10-30 0:20 [PATCH] xfs: fix buffer shudown reference count mismatch Dave Chinner
2012-10-30 19:26 ` Christoph Hellwig
@ 2012-10-30 20:03 ` Carlos Maiolino
2012-10-31 17:09 ` Mark Tinguely
2 siblings, 0 replies; 5+ messages in thread
From: Carlos Maiolino @ 2012-10-30 20:03 UTC (permalink / raw)
To: Dave Chinner; +Cc: xfs
On Tue, Oct 30, 2012 at 11:20:54AM +1100, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
>
> When we shut down the filesystem, we have to unpin and free all the
> buffers currently active in the CIL. To do this we unpin and remove
> them in one operation as a result of a failed iclogbuf write. For
> buffers, we do this removal via a simultated IO completion of after
> marking the buffer stale.
>
> At the time we do this, we have two references to the buffer - the
> active LRU reference and the buf log item. The LRU reference is
> removed by marking the buffer stale, and the active CIL reference is
> by the xfs_buf_iodone() callback that is run by
> xfs_buf_do_callbacks() during ioend processing (via the bp->b_iodone
> callback).
>
> However, ioend processing requires one more reference - that of the
> IO that it is completing. We don't have this reference, so we free
> the buffer prematurely and use it after it is freed. This leads to
> assert failures in xfs_buf_rele() on debug kernels because the
> b_hold count is zero.
>
> Fix this by making sure we take the necessary IO reference before
> starting IO completion processing on the stale buffer.
>
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Dave Chinner <dchinner@redhat.com>
> ---
> fs/xfs/xfs_buf_item.c | 16 ++++++++++++++++
> 1 file changed, 16 insertions(+)
>
> diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c
> index a8d0ed9..b72fe88 100644
> --- a/fs/xfs/xfs_buf_item.c
> +++ b/fs/xfs/xfs_buf_item.c
> @@ -526,7 +526,23 @@ xfs_buf_item_unpin(
> }
> xfs_buf_relse(bp);
> } else if (freed && remove) {
> + /*
> + * There are currently two references to the buffer - the active
> + * LRU reference and the buf log item. What we are about to do
> + * here - simulate a failed IO completion - requires 3
> + * references.
> + *
> + * The LRU reference is removed by the xfs_buf_stale() call. The
> + * buf item reference is removed by the xfs_buf_iodone()
> + * callback that is run by xfs_buf_do_callbacks() during ioend
> + * processing (via the bp->b_iodone callback), and then finally
> + * the ioend processing drops the IO reference.
> + *
> + * Hence we need to take an additional reference here so that IO
> + * completion processing doesn't free the buffer prematurely.
> + */
> xfs_buf_lock(bp);
> + xfs_buf_hold(bp);
> xfs_buf_ioerror(bp, EIO);
> XFS_BUF_UNDONE(bp);
> xfs_buf_stale(bp);
> --
> 1.7.10
>
Looks good
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
--
--Carlos
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] xfs: fix buffer shudown reference count mismatch
2012-10-30 0:20 [PATCH] xfs: fix buffer shudown reference count mismatch Dave Chinner
2012-10-30 19:26 ` Christoph Hellwig
2012-10-30 20:03 ` Carlos Maiolino
@ 2012-10-31 17:09 ` Mark Tinguely
2012-11-01 1:26 ` Dave Chinner
2 siblings, 1 reply; 5+ messages in thread
From: Mark Tinguely @ 2012-10-31 17:09 UTC (permalink / raw)
To: Dave Chinner; +Cc: xfs
On 10/29/12 19:20, Dave Chinner wrote:
> From: Dave Chinner<dchinner@redhat.com>
>
> When we shut down the filesystem, we have to unpin and free all the
> buffers currently active in the CIL. To do this we unpin and remove
> them in one operation as a result of a failed iclogbuf write. For
> buffers, we do this removal via a simultated IO completion of after
> marking the buffer stale.
>
> At the time we do this, we have two references to the buffer - the
> active LRU reference and the buf log item. The LRU reference is
> removed by marking the buffer stale, and the active CIL reference is
> by the xfs_buf_iodone() callback that is run by
> xfs_buf_do_callbacks() during ioend processing (via the bp->b_iodone
> callback).
>
> However, ioend processing requires one more reference - that of the
> IO that it is completing. We don't have this reference, so we free
> the buffer prematurely and use it after it is freed. This leads to
> assert failures in xfs_buf_rele() on debug kernels because the
> b_hold count is zero.
>
> Fix this by making sure we take the necessary IO reference before
> starting IO completion processing on the stale buffer.
>
> Cc:<stable@vger.kernel.org>
> Signed-off-by: Dave Chinner<dchinner@redhat.com>
This seems to take care of one of the ASSERT that I experienced after
the worker move series.
With this patch applied, there is a new ASSERT that the perag is not
empty in filesystem unmount in test 179. I think this is related to
the worker move series and not this patch. I will send the information
in a different thread.
Reviewed-by: Mark Tinguely <tinguely@sgi.com>
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] xfs: fix buffer shudown reference count mismatch
2012-10-31 17:09 ` Mark Tinguely
@ 2012-11-01 1:26 ` Dave Chinner
0 siblings, 0 replies; 5+ messages in thread
From: Dave Chinner @ 2012-11-01 1:26 UTC (permalink / raw)
To: Mark Tinguely; +Cc: xfs
On Wed, Oct 31, 2012 at 12:09:37PM -0500, Mark Tinguely wrote:
> On 10/29/12 19:20, Dave Chinner wrote:
> >From: Dave Chinner<dchinner@redhat.com>
> >
> >When we shut down the filesystem, we have to unpin and free all the
> >buffers currently active in the CIL. To do this we unpin and remove
> >them in one operation as a result of a failed iclogbuf write. For
> >buffers, we do this removal via a simultated IO completion of after
> >marking the buffer stale.
> >
> >At the time we do this, we have two references to the buffer - the
> >active LRU reference and the buf log item. The LRU reference is
> >removed by marking the buffer stale, and the active CIL reference is
> >by the xfs_buf_iodone() callback that is run by
> >xfs_buf_do_callbacks() during ioend processing (via the bp->b_iodone
> >callback).
> >
> >However, ioend processing requires one more reference - that of the
> >IO that it is completing. We don't have this reference, so we free
> >the buffer prematurely and use it after it is freed. This leads to
> >assert failures in xfs_buf_rele() on debug kernels because the
> >b_hold count is zero.
> >
> >Fix this by making sure we take the necessary IO reference before
> >starting IO completion processing on the stale buffer.
> >
> >Cc:<stable@vger.kernel.org>
> >Signed-off-by: Dave Chinner<dchinner@redhat.com>
>
> This seems to take care of one of the ASSERT that I experienced after
> the worker move series.
It should - it's the shutdown failure you've reported for some time
now ;)
> With this patch applied, there is a new ASSERT that the perag is not
> empty in filesystem unmount in test 179. I think this is related to
> the worker move series and not this patch. I will send the information
> in a different thread.
That's been around for a long, long time. I've never been able to
reproduce it reliably - I see it maybe once every couple of months -
so I've never been able to get to the bottom of it....
> Reviewed-by: Mark Tinguely <tinguely@sgi.com>
Thanks,
Dave.
--
Dave Chinner
david@fromorbit.com
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-11-01 1:24 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-10-30 0:20 [PATCH] xfs: fix buffer shudown reference count mismatch Dave Chinner
2012-10-30 19:26 ` Christoph Hellwig
2012-10-30 20:03 ` Carlos Maiolino
2012-10-31 17:09 ` Mark Tinguely
2012-11-01 1:26 ` Dave Chinner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox