diff mbox

[RFC,PATH,4/4] ovl: relax lock_rename when moving files between work and upper dir

Message ID 20170112100056.GF27207@veci.piliscsaba.szeredi.hu (mailing list archive)
State New, archived
Headers show

Commit Message

Miklos Szeredi Jan. 12, 2017, 10 a.m. UTC
On Thu, Jan 12, 2017 at 07:42:22AM +0200, Amir Goldstein wrote:
> I think you suggested here to use a waitqueue for pending copyups?
> Did you mean a waitqueue per overlay parent directory inode or
> did you mean something else?

Something like this:

--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Amir Goldstein Jan. 12, 2017, 6:18 p.m. UTC | #1
On Thu, Jan 12, 2017 at 12:00 PM, Miklos Szeredi <miklos@szeredi.hu> wrote:
> On Thu, Jan 12, 2017 at 07:42:22AM +0200, Amir Goldstein wrote:
>> I think you suggested here to use a waitqueue for pending copyups?
>> Did you mean a waitqueue per overlay parent directory inode or
>> did you mean something else?
>
> Something like this:
>

That's a useful answer :)
I'll give it a try.
Thanks!
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/overlayfs/ovl_entry.h b/fs/overlayfs/ovl_entry.h
index d14bca1850d9..a46e7e53cd7a 100644
--- a/fs/overlayfs/ovl_entry.h
+++ b/fs/overlayfs/ovl_entry.h
@@ -27,6 +27,7 @@  struct ovl_fs {
 	struct ovl_config config;
 	/* creds of process who forced instantiation of super block */
 	const struct cred *creator_cred;
+	wait_queue_head_t copyup_wq;
 };
 
 /* private information held for every overlayfs dentry */
@@ -38,6 +39,7 @@  struct ovl_entry {
 			u64 version;
 			const char *redirect;
 			bool opaque;
+			bool copying;
 		};
 		struct rcu_head rcu;
 	};
diff --git a/fs/overlayfs/util.c b/fs/overlayfs/util.c
index 952286f4826c..4e2b2c485165 100644
--- a/fs/overlayfs/util.c
+++ b/fs/overlayfs/util.c
@@ -263,3 +263,32 @@  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;
+	spin_unlock(&ofs->copyup_wq.lock);
+}