Unionfs: copyup only if file is being written to
authorErez Zadok <ezk@cs.sunysb.edu>
Tue, 15 Apr 2008 17:11:04 +0000 (13:11 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Wed, 30 Mar 2011 23:31:35 +0000 (19:31 -0400)
Before, we used to copyup on an open(2) call which used flags implying
writing (O_RDWR, O_WRONLY, O_APPEND).  This meant that a file being opened
for writing, then immediately closed (without actually writing to the file),
will still have been copied up.  Now, we don't copyup such files in ->open,
but defer the copyup till later. [Bug #591].

Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/unionfs/commonfops.c
fs/unionfs/file.c
fs/unionfs/union.h

index 83034c2d1f9f829571b3934dabfb1335f4d90bf7..b7d3e38422219b6564c07b39fb7b1551d74d11ab 100644 (file)
@@ -635,7 +635,7 @@ int unionfs_file_release(struct inode *inode, struct file *file)
         * This is important for open-but-unlinked files, as well as mmap
         * support.
         */
-       err = unionfs_file_revalidate(file, true);
+       err = unionfs_file_revalidate(file, UNIONFS_F(file)->wrote_to_file);
        if (unlikely(err))
                goto out;
        unionfs_check_file(file);
@@ -819,7 +819,7 @@ int unionfs_flush(struct file *file, fl_owner_t id)
        unionfs_read_lock(dentry->d_sb, UNIONFS_SMUTEX_PARENT);
        unionfs_lock_dentry(dentry, UNIONFS_DMUTEX_CHILD);
 
-       err = unionfs_file_revalidate(file, true);
+       err = unionfs_file_revalidate(file, UNIONFS_F(file)->wrote_to_file);
        if (unlikely(err))
                goto out;
        unionfs_check_file(file);
index f14b38bb15e71c5439f06537bca8620c26db094c..09f594d946777a9b0387fc9f471602aaa778f36a 100644 (file)
@@ -67,6 +67,7 @@ static ssize_t unionfs_write(struct file *file, const char __user *buf,
                                        lower_file->f_path.dentry->d_inode);
                fsstack_copy_attr_times(dentry->d_inode,
                                        lower_file->f_path.dentry->d_inode);
+               UNIONFS_F(file)->wrote_to_file = true; /* for delayed copyup */
                unionfs_check_file(file);
        }
 
index 735d40c4ff1c81d5ffcdc66f79fe4a7424eee528..13dee5f1b9ca700e583071f573c93d4f653f5809 100644 (file)
@@ -98,6 +98,7 @@ struct unionfs_file_info {
        struct file **lower_files;
        int *saved_branch_ids; /* IDs of branches when file was opened */
        struct vm_operations_struct *lower_vm_ops;
+       bool wrote_to_file;     /* for delayed copyup */
 };
 
 /* unionfs inode data in memory */