diff options
author | Miklos Szeredi <mszeredi@redhat.com> | 2017-07-04 22:03:18 +0200 |
---|---|---|
committer | Miklos Szeredi <mszeredi@redhat.com> | 2017-07-04 22:03:18 +0200 |
commit | fd210b7d67ee3768bf1ad3e07d55797d4b45fcc1 (patch) | |
tree | 8a7bf247fe47aa27f80c9c5a4bf4fd8d4162d647 /fs/overlayfs | |
parent | a6fb235a448b8eb731fd6d4de2c5c6269677cf5b (diff) | |
download | lwn-fd210b7d67ee3768bf1ad3e07d55797d4b45fcc1.tar.gz lwn-fd210b7d67ee3768bf1ad3e07d55797d4b45fcc1.zip |
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 <mszeredi@redhat.com>
Diffstat (limited to 'fs/overlayfs')
-rw-r--r-- | fs/overlayfs/copy_up.c | 38 |
1 files 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,37 +506,18 @@ 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; - } - if (ovl_dentry_upper(c->dentry)) { - /* Raced with another copy-up? Nothing to do, then... */ - err = 0; - goto out_unlock; + } else { + err = ovl_copy_up_locked(c); + unlock_rename(c->workdir, c->upperdir); } - 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; |