summaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorDave Chinner <david@fromorbit.com>2012-11-02 04:23:12 +0100
committerBen Myers <bpm@sgi.com>2012-11-07 22:26:53 +0100
commit137fff09b7924507871f8e6294dfe57b7a880332 (patch)
tree6b920a724d4ecef61ce0dd69e38e25d94bbb6a66 /arch
parentxfs: don't vmap inode cluster buffers during free (diff)
downloadlinux-137fff09b7924507871f8e6294dfe57b7a880332.tar.xz
linux-137fff09b7924507871f8e6294dfe57b7a880332.zip
xfs: fix buffer shudown reference count mismatch
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. For buffers marked with XBF_ASYNC, 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, and set the XBF_ASYNC flag to ensure that IO completion processing removes all the active references from the buffer to ensure it is fully torn down. Cc: <stable@vger.kernel.org> Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Mark Tinguely <tinguely@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
Diffstat (limited to 'arch')
0 files changed, 0 insertions, 0 deletions