hello,
On Saturday 15 April 2006 12:57, Nick Piggin wrote:
> Hi Andrew,
>
> Can you put the following in -mm please? I cc'ed Hans about it
> earlier. Basically, resier4 does not present a good reason why
> pagecache should be dropped here.
correct. it duplicates remove_mapping().
we tested similar patch recently and found no problems.
> Basically the exact same operations
> are performed by releasepage callers (reclaim or truncate). If there
> is some atomicity problem, the code removed here wouldn't solve it
> anyway.
>
> And unless reiser4 performs some of its own special synchronisation,
> I can't see how it gets the pagecache removal sequence right for the
> reclaim case (ie. careful checks of page_count and PageDirty under
> tree_lock).
>
> With this patch in place, reiser4-reget-page-mapping.patch can go.
> I would also be worried about exporting remove_from_page_cache... at
> least the __ variant can stop being exported now.
>
> --
> Index: linux-2.6/fs/reiser4/as_ops.c
> ===================================================================
> --- linux-2.6.orig/fs/reiser4/as_ops.c
> +++ linux-2.6/fs/reiser4/as_ops.c
> @@ -358,11 +358,6 @@ int reiser4_releasepage(struct page *pag
> assert("reiser4-4", page->mapping != NULL);
> assert("reiser4-5", page->mapping->host != NULL);
>
Except my patch didn't remove the page ref count check from
reiser4_releasepage.
Nick, does the check conflict with the lockless pagecache patches?
Reiser4 just tries to avoid unnecessary detaching private page objects
if the page_count doesn't allow page removal.
> - /* is_page_cache_freeable() check
> - (mapping + private + page_cache_get() by shrink_cache()) */
> - if (page_count(page) > 3)
> - return 0;
> -
> if (PageDirty(page))
> return 0;
>
> @@ -385,14 +380,6 @@ int reiser4_releasepage(struct page *pag
> /* we are under memory pressure so release jnode also. */
> jput(node);
>
> - write_lock_irq(&mapping->tree_lock);
> - /* shrink_list() + radix-tree */
> - if (page_count(page) == 2) {
> - __remove_from_page_cache(page);
> - atomic_dec(&page->_count);
> - }
> - write_unlock_irq(&mapping->tree_lock);
> -
> return 1;
> } else {
> spin_unlock(&(node->load));
--
Alex.