Merge branch 'overlayfs-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszer...
[sfrench/cifs-2.6.git] / fs / overlayfs / util.c
index 952286f4826cc590035e20e749a7be080aa1b671..1953986ee6bc221f555f4c53f8129f9c865f91e5 100644 (file)
@@ -10,7 +10,9 @@
 #include <linux/fs.h>
 #include <linux/mount.h>
 #include <linux/slab.h>
+#include <linux/cred.h>
 #include <linux/xattr.h>
+#include <linux/sched/signal.h>
 #include "overlayfs.h"
 #include "ovl_entry.h"
 
@@ -263,3 +265,33 @@ struct file *ovl_path_open(struct path *path, int flags)
 {
        return dentry_open(path, flags | O_NOATIME, current_cred());
 }
+
+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;
+       int err;
+
+       spin_lock(&ofs->copyup_wq.lock);
+       err = wait_event_interruptible_locked(ofs->copyup_wq, !oe->copying);
+       if (!err) {
+               if (oe->__upperdentry)
+                       err = 1; /* Already copied up */
+               else
+                       oe->copying = true;
+       }
+       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);
+}