Browse Source

ovl: factor out ovl_copy_up_inode() helper

Factor out helper for copying lower inode data and metadata to temp
upper inode, that is common to copy up using O_TMPFILE and workdir.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Amir Goldstein 8 years ago
parent
commit
02209d1070
1 changed files with 29 additions and 17 deletions
  1. 29 17
      fs/overlayfs/copy_up.c

+ 29 - 17
fs/overlayfs/copy_up.c

@@ -399,22 +399,11 @@ temp_err:
 	goto out;
 	goto out;
 }
 }
 
 
-static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir,
-			      struct dentry *dentry, struct path *lowerpath,
-			      struct kstat *stat, const char *link,
-			      struct kstat *pstat, bool tmpfile)
+static int ovl_copy_up_inode(struct dentry *dentry, struct dentry *temp,
+			     struct path *lowerpath, struct kstat *stat)
 {
 {
-	struct inode *wdir = workdir->d_inode;
-	struct inode *udir = upperdir->d_inode;
-	struct dentry *newdentry = NULL;
-	struct dentry *temp = NULL;
 	int err;
 	int err;
 
 
-	err = ovl_get_tmpfile(workdir, upperdir, dentry, stat, link, tmpfile,
-			      &temp);
-	if (err)
-		goto out;
-
 	if (S_ISREG(stat->mode)) {
 	if (S_ISREG(stat->mode)) {
 		struct path upperpath;
 		struct path upperpath;
 
 
@@ -424,18 +413,18 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir,
 
 
 		err = ovl_copy_up_data(lowerpath, &upperpath, stat->size);
 		err = ovl_copy_up_data(lowerpath, &upperpath, stat->size);
 		if (err)
 		if (err)
-			goto out_cleanup;
+			return err;
 	}
 	}
 
 
 	err = ovl_copy_xattr(lowerpath->dentry, temp);
 	err = ovl_copy_xattr(lowerpath->dentry, temp);
 	if (err)
 	if (err)
-		goto out_cleanup;
+		return err;
 
 
 	inode_lock(temp->d_inode);
 	inode_lock(temp->d_inode);
 	err = ovl_set_attr(temp, stat);
 	err = ovl_set_attr(temp, stat);
 	inode_unlock(temp->d_inode);
 	inode_unlock(temp->d_inode);
 	if (err)
 	if (err)
-		goto out_cleanup;
+		return err;
 
 
 	/*
 	/*
 	 * Store identifier of lower inode in upper inode xattr to
 	 * Store identifier of lower inode in upper inode xattr to
@@ -447,9 +436,32 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir,
 	if (S_ISDIR(stat->mode) || stat->nlink == 1) {
 	if (S_ISDIR(stat->mode) || stat->nlink == 1) {
 		err = ovl_set_origin(dentry, lowerpath->dentry, temp);
 		err = ovl_set_origin(dentry, lowerpath->dentry, temp);
 		if (err)
 		if (err)
-			goto out_cleanup;
+			return err;
 	}
 	}
 
 
+	return 0;
+}
+
+static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir,
+			      struct dentry *dentry, struct path *lowerpath,
+			      struct kstat *stat, const char *link,
+			      struct kstat *pstat, bool tmpfile)
+{
+	struct inode *wdir = workdir->d_inode;
+	struct inode *udir = upperdir->d_inode;
+	struct dentry *newdentry = NULL;
+	struct dentry *temp = NULL;
+	int err;
+
+	err = ovl_get_tmpfile(workdir, upperdir, dentry, stat, link, tmpfile,
+			      &temp);
+	if (err)
+		goto out;
+
+	err = ovl_copy_up_inode(dentry, temp, lowerpath, stat);
+	if (err)
+		goto out_cleanup;
+
 	if (tmpfile) {
 	if (tmpfile) {
 		inode_lock_nested(udir, I_MUTEX_PARENT);
 		inode_lock_nested(udir, I_MUTEX_PARENT);
 		err = ovl_install_temp(workdir, upperdir, dentry, temp, pstat,
 		err = ovl_install_temp(workdir, upperdir, dentry, temp, pstat,