In message <[EMAIL PROTECTED]>, Joe Landman writes: > Erez Zadok wrote: > > > Joe, are you sure your're applying the patch against a 2.6.23 kernel source > > and not a differet one (say, 2.6.22 or 2.6.24)? > > Hi Erez: > > Yes, I pulled it from > http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.23.11.tar.bz2 this > morning. > > It looks Trond's NFS patches for 2.6.23 are stamping on it. > > [EMAIL PROTECTED]:/local1/linux-2.6.23.11# grep fs_private > include/linux/writeback.h > [EMAIL PROTECTED]:/local1/linux-2.6.23.11# cd .. > [EMAIL PROTECTED]:/local1# mkdir t > [EMAIL PROTECTED]:/local1# cd t > [EMAIL PROTECTED]:/local1/t# tar -xjf ../linux-2.6.23.11.tar.bz2 > [EMAIL PROTECTED]:/local1/t# cd linux-2.6.23.11/ > [EMAIL PROTECTED]:/local1/t/linux-2.6.23.11# grep fs_private > include/linux/writeback.h > void *fs_private; /* For use by ->writepages() */ > [EMAIL PROTECTED]:/local1/t/linux-2.6.23.11# patch -p1 < > ../../linux-2.6.23-NFS_ALL.dif
Ah, yeah, if you're applying extra patches, I should know. :-) Yes, b/t .23 and .24, some things changed in the writeback code, esp. for nfs. But these changes were accompanied by VFS/MM-level changes too. I hope the patch(es) you're applying take care of all that stuff. > patching file Documentation/kernel-parameters.txt > patching file fs/Kconfig > patching file fs/lockd/mon.c > patching file fs/lockd/xdr.c > patching file fs/lockd/xdr4.c > ... > patching file net/sunrpc/xprtrdma/verbs.c > patching file net/sunrpc/xprtrdma/xprt_rdma.h > patching file net/sunrpc/xprtsock.c > [EMAIL PROTECTED]:/local1/t/linux-2.6.23.11# grep fs_private > include/linux/writeback.h > [EMAIL PROTECTED]:/local1/t/linux-2.6.23.11# > > Looking at his patches, it looks like they take fs_private out of the struct > > diff --git a/include/linux/writeback.h b/include/linux/writeback.h > index b4af6bc..a111d3d 100644 > --- a/include/linux/writeback.h > +++ b/include/linux/writeback.h > @@ -61,8 +61,6 @@ struct writeback_control { > unsigned for_reclaim:1; /* Invoked from the page > allocator */ > unsigned for_writepages:1; /* This is a writepages() call */ > unsigned range_cyclic:1; /* range_start is cyclic */ > - > - void *fs_private; /* For use by ->writepages() */ > }; > > > > my 2.6.23.11 kernel has a field named fs_private in struct > > writeback_control, defined in include/linux/writeback.h > > I am looking at 2.6.24-rc5 to see what happens there. Sure enough, > fs_private is gone. > > Any words of wisdom on this? Should I try the later patch for the > 2.6.24-rc* kernel? > > Thanks. > > Joe You should be able to use the latest unionfs for .23 patch, but apply this small patch on top. Cheers, Erez. diff --exclude-from=.diff_exclude -ru 23/fs/unionfs/mmap.c latest/fs/unionfs/mmap.c --- 23/fs/unionfs/mmap.c 2007-12-15 21:45:38.000000000 -0500 +++ latest/fs/unionfs/mmap.c 2007-12-16 12:32:47.000000000 -0500 @@ -19,40 +19,12 @@ #include "union.h" -/* - * Some lower file systems (e.g., NFS) expect the VFS to call its writepages - * only, which in turn will call generic_writepages and invoke each of the - * lower file system's ->writepage. NFS in particular uses the - * wbc->fs_private field in its nfs_writepage, which is set in its - * nfs_writepages. So if we don't call the lower nfs_writepages first, then - * NFS's nfs_writepage will dereference a NULL wbc->fs_private and cause an - * OOPS. If, however, we implement a unionfs_writepages and then we do call - * the lower nfs_writepages, then we "lose control" over the pages we're - * trying to write to the lower file system: we won't be writing our own - * new/modified data from the upper pages to the lower pages, and any - * mmap-based changes are lost. - * - * This is a fundamental cache-coherency problem in Linux. The kernel isn't - * able to support such stacking abstractions cleanly. One possible clean - * way would be that a lower file system's ->writepage method have some sort - * of a callback to validate if any upper pages for the same file+offset - * exist and have newer content in them. - * - * This whole NULL ptr dereference is triggered at the lower file system - * (NFS) because the wbc->for_writepages is set to 1. Therefore, to avoid - * this NULL pointer dereference, we set this flag to 0 and restore it upon - * exit. This probably means that we're slightly less efficient in writing - * pages out, doing them one at a time, but at least we avoid the oops until - * such day as Linux can better support address_space_ops in a stackable - * fashion. - */ static int unionfs_writepage(struct page *page, struct writeback_control *wbc) { int err = -EIO; struct inode *inode; struct inode *lower_inode; struct page *lower_page; - int saved_for_writepages = wbc->for_writepages; struct address_space *lower_mapping; /* lower inode mapping */ gfp_t mask; @@ -98,15 +70,11 @@ unlock_page(lower_page); goto out_release; } - /* workaround for some lower file systems: see big comment on top */ - if (wbc->for_writepages && !wbc->fs_private) - wbc->for_writepages = 0; BUG_ON(!lower_mapping->a_ops->writepage); wait_on_page_writeback(lower_page); /* prevent multiple writers */ clear_page_dirty_for_io(lower_page); /* emulate VFS behavior */ err = lower_mapping->a_ops->writepage(lower_page, wbc); - wbc->for_writepages = saved_for_writepages; /* restore value */ if (err < 0) goto out_release; _______________________________________________ unionfs mailing list: http://unionfs.filesystems.org/ unionfs@mail.fsl.cs.sunysb.edu http://www.fsl.cs.sunysb.edu/mailman/listinfo/unionfs