From fd210b7d67ee3768bf1ad3e07d55797d4b45fcc1 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Tue, 4 Jul 2017 22:03:18 +0200 Subject: [PATCH] ovl: move copy up lock out Move ovl_copy_up_start()/ovl_copy_up_end() out so that it's used for both tempfile and workdir copy ups. Signed-off-by: Miklos Szeredi --- fs/overlayfs/copy_up.c | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index 15668d3bbbc4..0d9de353f42b 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c @@ -506,36 +506,17 @@ static int ovl_do_copy_up(struct ovl_copy_up_ctx *c) /* Should we copyup with O_TMPFILE or with workdir? */ if (S_ISREG(c->stat.mode) && ofs->tmpfile) { - err = ovl_copy_up_start(c->dentry); - /* err < 0: interrupted, err > 0: raced with another copy-up */ - if (unlikely(err)) { - pr_debug("ovl_copy_up_start(%pd2) = %i\n", c->dentry, - err); - if (err > 0) - err = 0; - goto out_done; - } c->tmpfile = true; - err = ovl_copy_up_locked(c); - ovl_copy_up_end(c->dentry); - goto out_done; + return ovl_copy_up_locked(c); } err = -EIO; if (lock_rename(c->workdir, c->upperdir) != NULL) { pr_err("overlayfs: failed to lock workdir+upperdir\n"); - goto out_unlock; + } else { + err = ovl_copy_up_locked(c); + unlock_rename(c->workdir, c->upperdir); } - if (ovl_dentry_upper(c->dentry)) { - /* Raced with another copy-up? Nothing to do, then... */ - err = 0; - goto out_unlock; - } - - err = ovl_copy_up_locked(c); -out_unlock: - unlock_rename(c->workdir, c->upperdir); -out_done: return err; } @@ -580,8 +561,15 @@ static int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry, } ovl_do_check_copy_up(ctx.lowerpath.dentry); - err = ovl_do_copy_up(&ctx); - + err = ovl_copy_up_start(dentry); + /* err < 0: interrupted, err > 0: raced with another copy-up */ + if (unlikely(err)) { + if (err > 0) + err = 0; + } else { + err = ovl_do_copy_up(&ctx); + ovl_copy_up_end(dentry); + } do_delayed_call(&done); return err;