[PATCH] reiserfs locking fix
authorAndrew Morton <akpm@zip.com.au>
Sun, 19 May 2002 09:21:22 +0000 (02:21 -0700)
committerArnaldo Carvalho de Melo <acme@conectiva.com.br>
Sun, 19 May 2002 09:21:22 +0000 (02:21 -0700)
commit943acef93b4b3087d946d5cce587cdee03a7d9ee
tree70151f347d148b95e0193517196f1e31f1385d35
parent0f9268b8c63c607c07d2fa47a539e437996fd01c
[PATCH] reiserfs locking fix

reiserfs is using b_inode_buffers and fsync_buffers_list() for
attaching dependent buffers to its journal.  For writeout prior to
commit.

This worked OK when a global lock was used everywhere, but the locking
is currently incorrect - try_to_free_buffers() is taking a different
lock when detaching buffers from their "foreign" inode.  So list_head
corruption could occur on SMP.

The patch implements a reiserfs_releasepage() which holds the
journal-wide buffer lock while it runs try_to_free_buffers(), so all
those list_heads are protected.  The lock is held across the
try_to_free_buffers() call as well, so nobody will attach one of this
page's buffers to a list while try_to_free_buffers() is running.
fs/reiserfs/file.c
fs/reiserfs/inode.c