[PATCH] page->buffers abstraction
authorAndrew Morton <akpm@zip.com.au>
Wed, 10 Apr 2002 04:29:40 +0000 (21:29 -0700)
committerLinus Torvalds <torvalds@penguin.transmeta.com>
Wed, 10 Apr 2002 04:29:40 +0000 (21:29 -0700)
commit9855b4a17d61f4c7642c02cb905eec99a6f2c061
tree5f15fef8e2f4463c32d8fa1bc38881927b4ccd9f
parent8fa498462272fec2c16a92a9a7f67d005225b640
[PATCH] page->buffers abstraction

page->buffers is a bit of a layering violation.  Not all address_spaces
have pages which are backed by buffers.

The exclusive use of page->buffers for buffers means that a piece of
prime real estate in struct page is unavailable to other forms of
address_space.

This patch turns page->buffers into `unsigned long page->private' and
sets in place all the infrastructure which is needed to allow other
address_spaces to use this storage.

This change alows the multipage-bio-writeout patches to use
page->private to cache the results of an earlier get_block(), so
repeated calls into the filesystem are not needed in the case of file
overwriting.

Devlopers should think carefully before calling try_to_free_buffers()
or block_flushpage() or writeout_one_page() or waitfor_one_page()
against a page.  It's only legal to do this if you *know* that the page
is buffer-backed.  And only the address_space knows that.
Arguably, we need new a_ops for writeout_one_page() and
waitfor_one_page().  But I have more patches on the boil which
obsolete these functions in favour of ->writepage() and wait_on_page().

The new PG_private page bit is used to indicate that there
is something at page->private.  The core kernel does not
know what that object actually is, just that it's there.
The kernel must call a_ops->releasepage() to try to make
page->private go away.  And a_ops->flushpage() at truncate
time.
13 files changed:
fs/buffer.c
fs/ext3/inode.c
fs/jbd/transaction.c
fs/reiserfs/inode.c
fs/reiserfs/tail_conversion.c
include/asm-s390/pgtable.h
include/asm-s390x/pgtable.h
include/linux/fs.h
include/linux/mm.h
mm/filemap.c
mm/page_alloc.c
mm/swapfile.c
mm/vmscan.c