From 1515e409cc57af5eaef809eee6d8f8d6725d092b Mon Sep 17 00:00:00 2001 From: Bobi Jam Date: Wed, 21 Sep 2011 18:17:13 +0800 Subject: [PATCH] LU-620 llite: add delete_from_page_cache and remove_from_page_cache check Later 2.6.32 kernel use memory cgroup feature but does not export truncate_complete_page but export delete_from_page_cache or remove_from_page_cache, we need properly use them for pachless client code. Change-Id: I33e3e7c32b548866ee77753ef8a8193c814d0ecb Signed-off-by: Bobi Jam Reviewed-on: http://review.whamcloud.com/1399 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/autoconf/lustre-core.m4 | 23 +++++++++++------ lustre/include/linux/lustre_compat25.h | 2 -- lustre/include/linux/lustre_patchless_compat.h | 35 ++++++++++++++++++-------- lustre/llite/dir.c | 2 +- 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4 index bf2cbdd..91bf08c 100644 --- a/lustre/autoconf/lustre-core.m4 +++ b/lustre/autoconf/lustre-core.m4 @@ -269,14 +269,23 @@ AC_DEFUN([LC_QUOTA_MODULE], fi ]) +# truncate_complete_page() was exported from RHEL5/SLES10/SLES11 +# remove_from_page_cache() was exported between 2.6.35 and 2.6.38 +# delete_from_page_cache() is exported from 2.6.39 AC_DEFUN([LC_EXPORT_TRUNCATE_COMPLETE], -[LB_CHECK_SYMBOL_EXPORT([truncate_complete_page], -[mm/truncate.c],[ -AC_DEFINE(HAVE_TRUNCATE_COMPLETE_PAGE, 1, - [kernel export truncate_complete_page]) -],[ -]) -]) + [LB_CHECK_SYMBOL_EXPORT([truncate_complete_page], + [mm/truncate.c], + [AC_DEFINE(HAVE_TRUNCATE_COMPLETE_PAGE, 1, + [kernel export truncate_complete_page])]) + LB_CHECK_SYMBOL_EXPORT([remove_from_page_cache], + [mm/filemap.c], + [AC_DEFINE(HAVE_REMOVE_FROM_PAGE_CACHE, 1, + [kernel export remove_from_page_cache])]) + LB_CHECK_SYMBOL_EXPORT([delete_from_page_cache], + [mm/filemap.c], + [AC_DEFINE(HAVE_DELETE_FROM_PAGE_CACHE, 1, + [kernel export delete_from_page_cache])]) + ]) AC_DEFUN([LC_EXPORT_TRUNCATE_RANGE], [LB_CHECK_SYMBOL_EXPORT([truncate_inode_pages_range], diff --git a/lustre/include/linux/lustre_compat25.h b/lustre/include/linux/lustre_compat25.h index 0a8ce3c..5912064 100644 --- a/lustre/include/linux/lustre_compat25.h +++ b/lustre/include/linux/lustre_compat25.h @@ -203,8 +203,6 @@ do {cfs_mutex_lock_nested(&(inode)->i_mutex, I_MUTEX_PARENT); } while(0) (inode)->i_mapping->a_ops->writepage(page, NULL) #define ll_invalidate_inode_pages(inode) \ invalidate_inode_pages((inode)->i_mapping) -#define ll_truncate_complete_page(page) \ - truncate_complete_page(page->mapping, page) #define ll_vfs_create(a,b,c,d) vfs_create(a,b,c,d) #define ll_dev_t dev_t diff --git a/lustre/include/linux/lustre_patchless_compat.h b/lustre/include/linux/lustre_patchless_compat.h index 17fbc5c..06f1aa3 100644 --- a/lustre/include/linux/lustre_patchless_compat.h +++ b/lustre/include/linux/lustre_patchless_compat.h @@ -45,6 +45,16 @@ #include #include +#ifndef HAVE_CANCEL_DIRTY_PAGE /* 2.6.20 */ +#define cancel_dirty_page(page, size) clear_page_dirty(page) +#endif + +#ifndef HAVE_DELETE_FROM_PAGE_CACHE /* 2.6.39 */ +#ifndef HAVE_REMOVE_FROM_PAGE_CACHE /* 2.6.35 - 2.6.38 */ +#ifdef HAVE_NR_PAGECACHE /* 2.6.18 */ +#define __dec_zone_page_state(page, flag) atomic_add(-1, &nr_pagecache); +#endif /* HAVE_NR_PAGECACHE */ + /* XXX copy & paste from 2.6.15 kernel */ static inline void ll_remove_from_page_cache(struct page *page) { @@ -60,11 +70,7 @@ static inline void ll_remove_from_page_cache(struct page *page) radix_tree_delete(&mapping->page_tree, page->index); page->mapping = NULL; mapping->nrpages--; -#ifdef HAVE_NR_PAGECACHE - cfs_atomic_add(-1, &nr_pagecache); // XXX pagecache_acct(-1); -#else __dec_zone_page_state(page, NR_FILE_PAGES); -#endif #ifdef HAVE_RW_TREE_LOCK write_unlock_irq(&mapping->tree_lock); @@ -72,6 +78,18 @@ static inline void ll_remove_from_page_cache(struct page *page) cfs_spin_unlock_irq(&mapping->tree_lock); #endif } +#else /* HAVE_REMOVE_FROM_PAGE_CACHE */ +#define ll_remove_from_page_cache(page) remove_from_page_cache(page) +#endif /* !HAVE_REMOVE_FROM_PAGE_CACHE */ + +static inline void ll_delete_from_page_cache(struct page *page) +{ + ll_remove_from_page_cache(page); + page_cache_release(page); +} +#else /* HAVE_DELETE_FROM_PAGE_CACHE */ +#define ll_delete_from_page_cache(page) delete_from_page_cache(page) +#endif /* !HAVE_DELETE_FROM_PAGE_CACHE */ static inline void truncate_complete_page(struct address_space *mapping, struct page *page) @@ -82,16 +100,11 @@ truncate_complete_page(struct address_space *mapping, struct page *page) if (PagePrivate(page)) page->mapping->a_ops->invalidatepage(page, 0); -#ifdef HAVE_CANCEL_DIRTY_PAGE cancel_dirty_page(page, PAGE_SIZE); -#else - clear_page_dirty(page); -#endif ClearPageMappedToDisk(page); - ll_remove_from_page_cache(page); - page_cache_release(page); /* pagecache ref */ + ll_delete_from_page_cache(page); } -#endif /* HAVE_TRUNCATE_COMPLETE_PAGE */ +#endif /* !HAVE_TRUNCATE_COMPLETE_PAGE */ #if !defined(HAVE_D_REHASH_COND) && !defined(HAVE___D_REHASH) /* megahack */ diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c index 99398d6..4a8fc75 100644 --- a/lustre/llite/dir.c +++ b/lustre/llite/dir.c @@ -285,7 +285,7 @@ void ll_release_page(struct page *page, int remove) if (remove) { lock_page(page); if (likely(page->mapping != NULL)) - ll_truncate_complete_page(page); + truncate_complete_page(page->mapping, page); unlock_page(page); } page_cache_release(page); -- 1.8.3.1