ovl: During copy up, first copy up metadata and then data
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)
Just a little re-ordering of code.  This helps with next patch where after
copying up metadata, we skip data copying step, if needed.

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 304b268607438812db33e6b92d756ec48852d675..9d3cdbf910ff4a1b15be9456ac9c7e0d71257659 100644 (file)
@@ -490,28 +490,10 @@ static int ovl_copy_up_inode(struct ovl_copy_up_ctx *c, struct dentry *temp)
 {
        int err;
 
-       if (S_ISREG(c->stat.mode)) {
-               struct path upperpath;
-
-               ovl_path_upper(c->dentry, &upperpath);
-               BUG_ON(upperpath.dentry != NULL);
-               upperpath.dentry = temp;
-
-               err = ovl_copy_up_data(&c->lowerpath, &upperpath, c->stat.size);
-               if (err)
-                       return err;
-       }
-
        err = ovl_copy_xattr(c->lowerpath.dentry, temp);
        if (err)
                return err;
 
-       inode_lock(temp->d_inode);
-       err = ovl_set_attr(temp, &c->stat);
-       inode_unlock(temp->d_inode);
-       if (err)
-               return err;
-
        /*
         * Store identifier of lower inode in upper inode xattr to
         * allow lookup of the copy up origin inode.
@@ -525,7 +507,23 @@ static int ovl_copy_up_inode(struct ovl_copy_up_ctx *c, struct dentry *temp)
                        return err;
        }
 
-       return 0;
+       if (S_ISREG(c->stat.mode)) {
+               struct path upperpath;
+
+               ovl_path_upper(c->dentry, &upperpath);
+               BUG_ON(upperpath.dentry != NULL);
+               upperpath.dentry = temp;
+
+               err = ovl_copy_up_data(&c->lowerpath, &upperpath, c->stat.size);
+               if (err)
+                       return err;
+       }
+
+       inode_lock(temp->d_inode);
+       err = ovl_set_attr(temp, &c->stat);
+       inode_unlock(temp->d_inode);
+
+       return err;
 }
 
 static int ovl_copy_up_locked(struct ovl_copy_up_ctx *c)