ovl: Copy up only metadata during copy up where it makes sense
authorVivek Goyal <vgoyal@redhat.com>
Fri, 11 May 2018 15:49:27 +0000 (11:49 -0400)
committerMiklos Szeredi <mszeredi@redhat.com>
Fri, 20 Jul 2018 07:56:07 +0000 (09:56 +0200)
If it makes sense to copy up only metadata during copy up, do it.  This is
done for regular files which are not opened for WRITE.

Right now ->metacopy is set to 0 always.  Last patch in the series will
remove the hard coded statement and enable metacopy feature.

Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/overlayfs/copy_up.c

index 9d3cdbf..d234679 100644 (file)
@@ -388,6 +388,7 @@ struct ovl_copy_up_ctx {
        bool tmpfile;
        bool origin;
        bool indexed;
+       bool metacopy;
 };
 
 static int ovl_link_up(struct ovl_copy_up_ctx *c)
@@ -507,7 +508,7 @@ static int ovl_copy_up_inode(struct ovl_copy_up_ctx *c, struct dentry *temp)
                        return err;
        }
 
-       if (S_ISREG(c->stat.mode)) {
+       if (S_ISREG(c->stat.mode) && !c->metacopy) {
                struct path upperpath;
 
                ovl_path_upper(c->dentry, &upperpath);
@@ -660,6 +661,26 @@ out:
        return err;
 }
 
+static bool ovl_need_meta_copy_up(struct dentry *dentry, umode_t mode,
+                                 int flags)
+{
+       struct ovl_fs *ofs = dentry->d_sb->s_fs_info;
+
+       /* TODO: Will enable metacopy in last patch of series */
+       return false;
+
+       if (!ofs->config.metacopy)
+               return false;
+
+       if (!S_ISREG(mode))
+               return false;
+
+       if (flags && ((OPEN_FMODE(flags) & FMODE_WRITE) || (flags & O_TRUNC)))
+               return false;
+
+       return true;
+}
+
 static int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry,
                           int flags)
 {
@@ -681,6 +702,8 @@ static int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry,
        if (err)
                return err;
 
+       ctx.metacopy = ovl_need_meta_copy_up(dentry, ctx.stat.mode, flags);
+
        if (parent) {
                ovl_path_upper(parent, &parentpath);
                ctx.destdir = parentpath.dentry;