bug fix: retry lookup for different silly-renamed files
authorErez Zadok <ezk@bigvaio.(none)>
Fri, 18 May 2007 05:45:18 +0000 (01:45 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Sat, 16 Aug 2014 02:26:09 +0000 (22:26 -0400)
When we have to copyup an open-but-unlinked file, we have to give it a
temporary name, similar to NFS's silly-renamed files.  So we generate
temporary file names until we find one that doesn't exist, and use it.  The
code had a bug where if the silly-renamed file name already existed, Unionfs
would oops upon copyup to that temp name.

fs/unionfs/commonfops.c

index d824eaa085d8a53434c05d3210383f1b72621094..ab92cac1007afda930d29eaac0343424f9227839 100644 (file)
@@ -50,6 +50,7 @@ static int copyup_deleted_file(struct file *file, struct dentry *dentry,
         * the name exists in the dest branch, but it'd be nice to catch it
         * sooner than later.
         */
+retry:
        tmp_dentry = NULL;
        do {
                char *suffix = name + nlen - countersize;
@@ -73,8 +74,11 @@ static int copyup_deleted_file(struct file *file, struct dentry *dentry,
 
        err = copyup_named_file(dentry->d_parent->d_inode, file, name, bstart,
                                bindex, file->f_dentry->d_inode->i_size);
-       if (err)
+       if (err) {
+               if (err == -EEXIST)
+                       goto retry;
                goto out;
+       }
 
        /* bring it to the same state as an unlinked file */
        hidden_dentry = unionfs_lower_dentry_idx(dentry, dbstart(dentry));