commit 2ab4992be86b56d602628a3065b5a679cde02327
Author: Erez Zadok <[EMAIL PROTECTED]>
Date:   Sun Nov 25 18:32:31 2007 -0500

    Unionfs: support splice(2)
    
    Also remove redundant variable from unionfs_readpage (saves a bit on stack
    space).
    
    Signed-off-by: Erez Zadok <[EMAIL PROTECTED]>

diff --git a/fs/unionfs/mmap.c b/fs/unionfs/mmap.c
index ba05bf0..bfd2cad 100644
--- a/fs/unionfs/mmap.c
+++ b/fs/unionfs/mmap.c
@@ -179,7 +179,7 @@ static int unionfs_readpage(struct file *file, struct page 
*page)
        struct inode *inode;
        mm_segment_t old_fs;
        char *page_data = NULL;
-       loff_t offset;
+       mode_t orig_mode;
 
        unionfs_read_lock(file->f_path.dentry->d_sb);
        err = unionfs_file_revalidate(file, false);
@@ -207,11 +207,17 @@ static int unionfs_readpage(struct file *file, struct 
page *page)
         * the necessary magic for us.
         */
        lower_file->f_pos = page_offset(page);
-       offset = page_offset(page);
        old_fs = get_fs();
        set_fs(KERNEL_DS);
+       /*
+        * generic_file_splice_write may call us on a file not opened for
+        * reading, so temporarily allow reading.
+        */
+       orig_mode = lower_file->f_mode;
+       lower_file->f_mode |= FMODE_READ;
        err = vfs_read(lower_file, page_data, PAGE_CACHE_SIZE,
                       &lower_file->f_pos);
+       lower_file->f_mode = orig_mode;
        set_fs(old_fs);
        if (err >= 0 && err < PAGE_CACHE_SIZE)
                memset(page_data + err, 0, PAGE_CACHE_SIZE - err);
_______________________________________________
unionfs-cvs mailing list: http://unionfs.filesystems.org/
[email protected]
http://www.fsl.cs.sunysb.edu/mailman/listinfo/unionfs-cvs

Reply via email to