I just tried to replace the do_splice_* functions with other already exported 
functions,
because the do_* won't be added to the Debian kernel.

I applied the following patch and have no problems:

--- aufs-0+20080317.orig/fs/aufs/vfsub.c
+++ aufs-0+20080317/fs/aufs/vfsub.c
@@ -326,7 +326,7 @@
                  AuDLNPair(in->f_dentry), *ppos, (unsigned long)len, flags);

        lockdep_off();
-       err = do_splice_to(in, ppos, pipe, len, flags);
+       err = in->f_op->splice_read(in, ppos, pipe, len, flags);
        lockdep_on();
        if (err >= 0)
                au_update_fuse_h_inode(in->f_vfsmnt, in->f_dentry); /*ignore*/
@@ -342,7 +342,7 @@
                  AuDLNPair(out->f_dentry), *ppos, (unsigned long)len, flags);

        lockdep_off();
-       err = do_splice_from(pipe, out, ppos, len, flags);
+       err = out->f_op->splice_write(pipe, out, ppos, len, flags);
        lockdep_on();
        if (err >= 0)
                au_update_fuse_h_inode(out->f_vfsmnt, out->f_dentry); /*ignore*/

Another patch (which copies a bit more code from fs/splice.c)

--- aufs-0+20080317.orig/fs/aufs/vfsub.c
+++ aufs-0+20080317/fs/aufs/vfsub.c
@@ -326,7 +326,12 @@
                  AuDLNPair(in->f_dentry), *ppos, (unsigned long)len, flags);

        lockdep_off();
-       err = do_splice_to(in, ppos, pipe, len, flags);
+       if (unlikely(!in->f_op || !in->f_op->splice_read))
+               err = -EINVAL;
+       else if (unlikely(!(in->f_mode & FMODE_READ)))
+               err = -EBADF;
+       else
+               err = in->f_op->splice_read(in, ppos, pipe, len, flags);
        lockdep_on();
        if (err >= 0)
                au_update_fuse_h_inode(in->f_vfsmnt, in->f_dentry); /*ignore*/
@@ -342,7 +347,12 @@
                  AuDLNPair(out->f_dentry), *ppos, (unsigned long)len, flags);

        lockdep_off();
-       err = do_splice_from(pipe, out, ppos, len, flags);
+       if (unlikely(!out->f_op || !out->f_op->splice_write))
+               err = -EINVAL;
+       else if (unlikely(!(out->f_mode & FMODE_WRITE)))
+               err = -EBADF;
+       else
+               err = out->f_op->splice_write(pipe, out, ppos, len, flags);
        lockdep_on();
        if (err >= 0)
                au_update_fuse_h_inode(out->f_vfsmnt, out->f_dentry); /*ignore*/
-- 
Julian Andres Klode, Fellow of the Free Software Foundation Europe
                     Debian Maintainer | Developer | Ubuntu Member

try Debian: http://www.debian.org/ | my site: http://jak-linux.org/
        jabber: [EMAIL PROTECTED] | IRC: juliank (FreeNode, OFTC)
            languages:     German  | English

Attachment: signature.asc
Description: OpenPGP digital signature

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace

Reply via email to