• Andrew Morton's avatar
    [PATCH] page->buffers abstraction · 9855b4a1
    Andrew Morton authored
    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.
    9855b4a1
filemap.c 56.2 KB