const struct cred *creator_cred;
        bool tmpfile;
        bool noxattr;
-       wait_queue_head_t copyup_wq;
        /* sb common to all layers */
        struct super_block *same_sb;
 };
                struct {
                        u64 version;
                        bool opaque;
-                       bool copying;
                };
                struct rcu_head rcu;
        };
        struct inode vfs_inode;
        struct dentry *__upperdentry;
        struct inode *lower;
+
+       /* synchronize copy up and more */
+       struct mutex lock;
 };
 
 static inline struct ovl_inode *OVL_I(struct inode *inode)
 
        oi->flags = 0;
        oi->__upperdentry = NULL;
        oi->lower = NULL;
+       mutex_init(&oi->lock);
 
        return &oi->vfs_inode;
 }
 
        dput(oi->__upperdentry);
        kfree(oi->redirect);
+       mutex_destroy(&oi->lock);
 
        call_rcu(&inode->i_rcu, ovl_i_callback);
 }
        if (!ufs)
                goto out;
 
-       init_waitqueue_head(&ufs->copyup_wq);
        ufs->config.redirect_dir = ovl_redirect_dir_def;
        err = ovl_parse_opt((char *) data, &ufs->config);
        if (err)
 
 
 int ovl_copy_up_start(struct dentry *dentry)
 {
-       struct ovl_fs *ofs = dentry->d_sb->s_fs_info;
-       struct ovl_entry *oe = dentry->d_fsdata;
+       struct ovl_inode *oi = OVL_I(d_inode(dentry));
        int err;
 
-       spin_lock(&ofs->copyup_wq.lock);
-       err = wait_event_interruptible_locked(ofs->copyup_wq, !oe->copying);
-       if (!err) {
-               if (ovl_dentry_upper(dentry))
-                       err = 1; /* Already copied up */
-               else
-                       oe->copying = true;
+       err = mutex_lock_interruptible(&oi->lock);
+       if (!err && ovl_dentry_upper(dentry)) {
+               err = 1; /* Already copied up */
+               mutex_unlock(&oi->lock);
        }
-       spin_unlock(&ofs->copyup_wq.lock);
 
        return err;
 }
 
 void ovl_copy_up_end(struct dentry *dentry)
 {
-       struct ovl_fs *ofs = dentry->d_sb->s_fs_info;
-       struct ovl_entry *oe = dentry->d_fsdata;
-
-       spin_lock(&ofs->copyup_wq.lock);
-       oe->copying = false;
-       wake_up_locked(&ofs->copyup_wq);
-       spin_unlock(&ofs->copyup_wq.lock);
+       mutex_unlock(&OVL_I(d_inode(dentry))->lock);
 }
 
 bool ovl_check_dir_xattr(struct dentry *dentry, const char *name)