lkml.org 
[lkml]   [2006]   [May]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 13/14] FS-Cache: Release page->private in failed readahead [try #9]
    Date

    The attached patch causes read_cache_pages() to release page-private data on a
    page for which add_to_page_cache() fails or the filler function fails. This
    permits pages with caching references associated with them to be cleaned up.

    Further changes [try #9] that have been made:

    (*) The try_to_release_page() is called instead of calling the releasepage()
    op directly.

    (*) The page is locked before try_to_release_page() is called.

    (*) The call to try_to_release_page() and page_cache_release() have been
    abstracted out into a helper function as this bit of code occurs twice..

    Signed-Off-By: David Howells <dhowells@redhat.com>
    ---

    mm/readahead.c | 21 +++++++++++++++++++--
    1 files changed, 19 insertions(+), 2 deletions(-)

    diff --git a/mm/readahead.c b/mm/readahead.c
    index 0f142a4..5e9d183 100644
    --- a/mm/readahead.c
    +++ b/mm/readahead.c
    @@ -14,6 +14,7 @@ #include <linux/module.h>
    #include <linux/blkdev.h>
    #include <linux/backing-dev.h>
    #include <linux/pagevec.h>
    +#include <linux/buffer_head.h>

    void default_unplug_io_fn(struct backing_dev_info *bdi, struct page *page)
    {
    @@ -117,6 +118,22 @@ static inline unsigned long get_next_ra_

    #define list_to_page(head) (list_entry((head)->prev, struct page, lru))

    +/*
    + * see if a page needs releasing upon read_cache_pages() failure
    + */
    +static inline void read_cache_pages_release_page(struct address_space *mapping,
    + struct page *page)
    +{
    + if (PagePrivate(page)) {
    + page->mapping = mapping;
    + SetPageLocked(page);
    + try_to_release_page(page, GFP_KERNEL);
    + page->mapping = NULL;
    + }
    +
    + page_cache_release(page);
    +}
    +
    /**
    * read_cache_pages - populate an address space with some pages, and
    * start reads against them.
    @@ -141,7 +158,7 @@ int read_cache_pages(struct address_spac
    page = list_to_page(pages);
    list_del(&page->lru);
    if (add_to_page_cache(page, mapping, page->index, GFP_KERNEL)) {
    - page_cache_release(page);
    + read_cache_pages_release_page(mapping, page);
    continue;
    }
    ret = filler(data, page);
    @@ -153,7 +170,7 @@ int read_cache_pages(struct address_spac

    victim = list_to_page(pages);
    list_del(&victim->lru);
    - page_cache_release(victim);
    + read_cache_pages_release_page(mapping, victim);
    }
    break;
    }
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2006-05-12 14:52    [W:0.023 / U:158.440 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site