Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S267385AbUJNTMh (ORCPT ); Thu, 14 Oct 2004 15:12:37 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S267377AbUJNTLD (ORCPT ); Thu, 14 Oct 2004 15:11:03 -0400 Received: from mx1.redhat.com ([66.187.233.31]:53899 "EHLO mx1.redhat.com") by vger.kernel.org with ESMTP id S267350AbUJNTFN (ORCPT ); Thu, 14 Oct 2004 15:05:13 -0400 To: linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org Subject: [RESEND][PATCH 5/6] Provide a filesystem-specific sync'able page bit User-Agent: EMH/1.14.1 SEMI/1.14.5 (Awara-Onsen) FLIM/1.14.5 (Demachiyanagi) APEL/10.6 Emacs/21.3 (i386-redhat-linux-gnu) MULE/5.0 (SAKAKI) MIME-Version: 1.0 (generated by SEMI 1.14.5 - "Awara-Onsen") Content-Type: text/plain; charset=US-ASCII Date: Thu, 14 Oct 2004 20:05:07 +0100 Message-ID: <24461.1097780707@redhat.com> From: David Howells Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3793 Lines: 98 Because Christoph asked so nicely, I'm resending this patch with a wider distribution. The patch currently resides in the -mm kernels. It is being used by the in-kernel AFS filesystem and by the NFS caching patches that haven't yet been passed to akpm. --- The attached patch provides a filesystem-specific page bit that a filesystem can synchronise upon. This can be used, for example, by a netfs to synchronise with CacheFS writing its pages to disc. Signed-Off-By: David Howells --- warthog>diffstat cachefs-pagefsmisc-269rc1mm2.diff include/linux/page-flags.h | 10 ++++++++++ include/linux/pagemap.h | 11 +++++++++++ mm/filemap.c | 17 +++++++++++++++++ 3 files changed, 38 insertions(+) diff -uNrp linux-2.6.9-rc1-mm2/include/linux/page-flags.h linux-2.6.9-rc1-mm2-cachefs/include/linux/page-flags.h --- linux-2.6.9-rc1-mm2/include/linux/page-flags.h 2004-08-31 16:52:38.000000000 +0100 +++ linux-2.6.9-rc1-mm2-cachefs/include/linux/page-flags.h 2004-09-02 15:15:42.000000000 +0100 @@ -62,6 +62,7 @@ #define PG_slab 7 /* slab debug (Suparna wants this) */ #define PG_highmem 8 +#define PG_fs_misc 9 /* Filesystem specific bit */ #define PG_checked 9 /* kill me in 2.5.. */ #define PG_arch_1 10 #define PG_reserved 11 @@ -315,4 +316,13 @@ static inline void set_page_writeback(st test_set_page_writeback(page); } +/* + * Filesystem-specific page bit testing + */ +#define PageFsMisc(page) test_bit(PG_fs_misc, &(page)->flags) +#define SetPageFsMisc(page) set_bit(PG_fs_misc, &(page)->flags) +#define TestSetPageFsMisc(page) test_and_set_bit(PG_fs_misc, &(page)->flags) +#define ClearPageFsMisc(page) clear_bit(PG_fs_misc, &(page)->flags) +#define TestClearPageFsMisc(page) test_and_clear_bit(PG_fs_misc, &(page)->flags) + #endif /* PAGE_FLAGS_H */ diff -uNrp linux-2.6.9-rc1-mm2/include/linux/pagemap.h linux-2.6.9-rc1-mm2-cachefs/include/linux/pagemap.h --- linux-2.6.9-rc1-mm2/include/linux/pagemap.h 2004-08-31 16:52:38.000000000 +0100 +++ linux-2.6.9-rc1-mm2-cachefs/include/linux/pagemap.h 2004-09-02 15:17:26.000000000 +0100 @@ -192,6 +192,17 @@ static inline void wait_on_page_writebac extern void end_page_writeback(struct page *page); /* + * Wait for filesystem-specific page synchronisation to complete + */ +static inline void wait_on_page_fs_misc(struct page *page) +{ + if (PageFsMisc(page)) + wait_on_page_bit(page, PG_fs_misc); +} + +extern void fastcall end_page_fs_misc(struct page *page); + +/* * Fault a userspace page into pagetables. Return non-zero on a fault. * * This assumes that two userspace pages are always sufficient. That's diff -uNrp linux-2.6.9-rc1-mm2/mm/filemap.c linux-2.6.9-rc1-mm2-cachefs/mm/filemap.c --- linux-2.6.9-rc1-mm2/mm/filemap.c 2004-08-31 16:52:40.000000000 +0100 +++ linux-2.6.9-rc1-mm2-cachefs/mm/filemap.c 2004-09-03 16:46:58.780545691 +0100 @@ -442,6 +442,23 @@ void fastcall __lock_page(struct page *p EXPORT_SYMBOL(__lock_page); /* + * Note completion of filesystem specific page synchronisation + * + * This is used to allow a page to be written to a filesystem cache in the + * background without holding up the completion of readpage + */ +void fastcall end_page_fs_misc(struct page *page) +{ + smp_mb__before_clear_bit(); + if (!TestClearPageFsMisc(page)) + BUG(); + smp_mb__after_clear_bit(); + wake_up_page(page, PG_fs_misc); +} + +EXPORT_SYMBOL(end_page_fs_misc); + +/* * a rather lightweight function, finding and getting a reference to a * hashed page atomically. */ - 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/