xuw2...@gmail.com wrote:

> From: George Wang <xuw2...@gmail.com>
> 
> now ovl only use O_RDONLY for lower and O_WRONLY for upper file. But if
> the file size larger than MAX_NON_LFS(1UL << 31 -1), will suffer
> -EOVERFLOW. We should add O_LARGEFILE flag to make it work. Following
> script can reproduct it:
> 
> work
> truncate: cannot open ‘work/sparse’ for writing: Value too large for
> defined data type
> 
> Reported-by: Alkis Georgopoulos <alk...@gmail.com>
> Signed-off-by: George Wang <xuw2...@gmail.com>

I just produced something that looks very similar.  I think it might be better
to only add the flag if it's needed in case one of the upper or lower
filesystems rejects it.

Also, it might be worth adding an enablement switch.

David
---
commit 0b365f2143939fa30cac8cf6899ff33825a767c9
Author: David Howells <dhowe...@redhat.com>
Date:   Thu Sep 17 17:14:48 2015 +0100

    overlayfs: Conditionally use O_LARGEFILE in ovl_copy_up()
    
    Open the lower file with O_LARGEFILE in ovl_copy_up() if the lower file is
    >= 4GiB in size.
    
    Reported-by: Ulrich Obergfell <uober...@redhat.com>
    Signed-off-by: David Howells <dhowe...@redhat.com>

diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c
index 84d693d37428..89b4cb3773d7 100644
--- a/fs/overlayfs/copy_up.c
+++ b/fs/overlayfs/copy_up.c
@@ -76,16 +76,19 @@ static int ovl_copy_up_data(struct path *old, struct path 
*new, loff_t len)
        struct file *new_file;
        loff_t old_pos = 0;
        loff_t new_pos = 0;
-       int error = 0;
+       int error = 0, o_flag = 0;
 
        if (len == 0)
                return 0;
 
-       old_file = ovl_path_open(old, O_RDONLY);
+       if (i_size_read(d_inode(old->dentry)) > MAX_NON_LFS)
+               o_flag |= O_LARGEFILE;
+       
+       old_file = ovl_path_open(old, o_flag | O_RDONLY);
        if (IS_ERR(old_file))
                return PTR_ERR(old_file);
 
-       new_file = ovl_path_open(new, O_WRONLY);
+       new_file = ovl_path_open(new, o_flag | O_WRONLY);
        if (IS_ERR(new_file)) {
                error = PTR_ERR(new_file);
                goto out_fput;
--
To unsubscribe from this list: send the line "unsubscribe linux-unionfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to