fs: introduce some page/buffer invariants
authorNick Piggin <npiggin@suse.de>
Tue, 17 Jul 2007 11:03:34 +0000 (04:03 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Tue, 17 Jul 2007 17:23:02 +0000 (10:23 -0700)
commit787d2214c19bcc9b6ac48af0ce098277a801eded
treea040604fdf9620a66dc83a0cde4f2140e2ec25b3
parenta1ed3dda0ad181532f1e0f0d548067fb9fdddac4
fs: introduce some page/buffer invariants

It is a bug to set a page dirty if it is not uptodate unless it has
buffers.  If the page has buffers, then the page may be dirty (some buffers
dirty) but not uptodate (some buffers not uptodate).  The exception to this
rule is if the set_page_dirty caller is racing with truncate or invalidate.

A buffer can not be set dirty if it is not uptodate.

If either of these situations occurs, it indicates there could be some data
loss problem.  Some of these warnings could be a harmless one where the
page or buffer is set uptodate immediately after it is dirtied, however we
should fix those up, and enforce this ordering.

Bring the order of operations for truncate into line with those of
invalidate.  This will prevent a page from being able to go !uptodate while
we're holding the tree_lock, which is probably a good thing anyway.

Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/buffer.c
mm/page-writeback.c
mm/truncate.c