On Thu, Jan 03, 2008 at 11:19:42AM -0800, Sunil Mushran wrote: > Commit 5b04aa3a64f854244bc40a6f528176ed50b5c4f6 introduced export symbol > do_sync_mapping_range(). This patch allows one to build ocfs2 with kernels > having/not having that change. > > Signed-off-by: Sunil Mushran <[EMAIL PROTECTED]> > Signed-off-by: Joel Becker <[EMAIL PROTECTED]> > --- > Config.make.in | 2 + > Makefile | 3 +- > configure.in | 6 ++ > fs/ocfs2/Makefile | 4 + > kapi-compat/include/sync_mapping_range.h | 103 > ++++++++++++++++++++++++++++++ > 5 files changed, 117 insertions(+), 1 deletions(-) > create mode 100644 kapi-compat/include/sync_mapping_range.h > > diff --git a/Config.make.in b/Config.make.in > index 1dc4d44..67ee363 100644 > --- a/Config.make.in > +++ b/Config.make.in > @@ -59,6 +59,8 @@ EXTRA_CFLAGS += @KAPI_COMPAT_CFLAGS@ > > NO_DELAYED_WORK = @NO_DELAYED_WORK@ > > +NO_SYNC_MAPPING_RANGE = @NO_SYNC_MAPPING_RANGE@ > + > OCFS_DEBUG = @OCFS_DEBUG@ > > ifneq ($(OCFS_DEBUG),) > diff --git a/Makefile b/Makefile > index b7b86db..3ddb1aa 100644 > --- a/Makefile > +++ b/Makefile > @@ -11,7 +11,8 @@ LINUX_INCLUDE_FILES = > KAPI_COMPAT_FILES = \ > kapi-compat/include/workqueue.h \ > kapi-compat/include/compiler.h \ > - kapi-compat/include/highmem.h > + kapi-compat/include/highmem.h \ > + kapi-compat/include/sync_mapping_range.h > > PATCH_FILES = > > diff --git a/configure.in b/configure.in > index 0108f99..72698ae 100644 > --- a/configure.in > +++ b/configure.in > @@ -172,6 +172,12 @@ OCFS2_CHECK_KERNEL([zero_user_page() in highmem.h], > highmem.h, > , highmem_compat_header="highmem.h", [zero_user_page]) > KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS $highmem_compat_header" > > +NO_SYNC_MAPPING_RANGE= > +OCFS2_CHECK_KERNEL([do_sync_mapping_range() in fs.h], fs.h, > + , NO_SYNC_MAPPING_RANGE=yes, [do_sync_mapping_range(]) > +KAPI_COMPAT_HEADERS="$KAPI_COMPAT_HEADERS sync_mapping_range.h" > +AC_SUBST(NO_SYNC_MAPPING_RANGE) > + > # using -include has two advantages: > # the source doesn't need to know to include compat headers > # the compat header file names don't go through the search path > diff --git a/fs/ocfs2/Makefile b/fs/ocfs2/Makefile > index 8bc2dff..737c12a 100644 > --- a/fs/ocfs2/Makefile > +++ b/fs/ocfs2/Makefile > @@ -29,6 +29,10 @@ ifdef NO_DELAYED_WORK > EXTRA_CFLAGS += -DNO_DELAYED_WORK > endif > > +ifdef NO_SYNC_MAPPING_RANGE > +CFLAGS_alloc.o += -DNO_SYNC_MAPPING_RANGE > +endif > + > # > # Since SUBDIRS means something to kbuild, define them safely. Do not > # include trailing slashes. > diff --git a/kapi-compat/include/sync_mapping_range.h > b/kapi-compat/include/sync_mapping_range.h > new file mode 100644 > index 0000000..d6e1b30 > --- /dev/null > +++ b/kapi-compat/include/sync_mapping_range.h > @@ -0,0 +1,103 @@ > +#ifndef KAPI_SYNC_MAPPING_RANGE_H > +#define KAPI_SYNC_MAPPING_RANGE_H > + > +#ifdef NO_SYNC_MAPPING_RANGE > + > +#include <linux/fs.h> > +#include <linux/types.h> > +#include <linux/slab.h> > +#include <linux/highmem.h> > +#include <linux/swap.h> > +#include <linux/writeback.h> > +#include <linux/mpage.h> > +#include <linux/pagemap.h> > + > + > +int do_writepages(struct address_space *mapping, struct writeback_control > *wbc) > +{ > + int ret; > + > + if (wbc->nr_to_write <= 0) > + return 0; > + wbc->for_writepages = 1; > + if (mapping->a_ops->writepages) > + ret = mapping->a_ops->writepages(mapping, wbc); > + else > + ret = generic_writepages(mapping, wbc); > + wbc->for_writepages = 0; > + return ret; > +} > + > +/** > + * __filemap_fdatawrite_range - start writeback on mapping dirty pages in > range > + * @mapping: address space structure to write > + * @start: offset in bytes where the range starts > + * @end: offset in bytes where the range ends (inclusive) > + * @sync_mode: enable synchronous operation > + * > + * Start writeback against all of a mapping's dirty pages that lie > + * within the byte offsets <start, end> inclusive. > + * > + * If sync_mode is WB_SYNC_ALL then this is a "data integrity" operation, as > + * opposed to a regular memory cleansing writeback. The difference between > + * these two operations is that if a dirty page/buffer is encountered, it > must > + * be waited upon, and not just skipped over. > + */ > +int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start, > + loff_t end, int sync_mode) > +{ > + int ret; > + struct writeback_control wbc = { > + .sync_mode = sync_mode, > + .nr_to_write = mapping->nrpages * 2, > + .range_start = start, > + .range_end = end, > + }; > + > + if (!mapping_cap_writeback_dirty(mapping)) > + return 0; > + > + ret = do_writepages(mapping, &wbc); > + return ret; > +} > + > +/* > + * `endbyte' is inclusive > + */ > +static int do_sync_mapping_range(struct address_space *mapping, loff_t > offset, > + loff_t endbyte, unsigned int flags) > +{ > + int ret; > + > + if (!mapping) { > + ret = -EINVAL; > + goto out; > + } > + > + ret = 0; > + if (flags & SYNC_FILE_RANGE_WAIT_BEFORE) { > + ret = wait_on_page_writeback_range(mapping, > + offset >> PAGE_CACHE_SHIFT, > + endbyte >> PAGE_CACHE_SHIFT); > + if (ret < 0) > + goto out; > + } > + > + if (flags & SYNC_FILE_RANGE_WRITE) { > + ret = __filemap_fdatawrite_range(mapping, offset, endbyte, > + WB_SYNC_NONE); > + if (ret < 0) > + goto out; > + } > + > + if (flags & SYNC_FILE_RANGE_WAIT_AFTER) { > + ret = wait_on_page_writeback_range(mapping, > + offset >> PAGE_CACHE_SHIFT, > + endbyte >> PAGE_CACHE_SHIFT); > + } > +out: > + return ret; > +}
Shouldn't the function definitions be in a C file? It's pretty heavy for a header.... --Mark -- Mark Fasheh Principal Software Developer, Oracle [EMAIL PROTECTED] _______________________________________________ Ocfs2-devel mailing list Ocfs2-devel@oss.oracle.com http://oss.oracle.com/mailman/listinfo/ocfs2-devel