Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02209d10 authored by Amir Goldstein's avatar Amir Goldstein Committed by Miklos Szeredi
Browse files

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: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent 7d90b853
Loading
Loading
Loading
Loading
+29 −17
Original line number Diff line number Diff line
@@ -399,22 +399,11 @@ static int ovl_get_tmpfile(struct dentry *workdir, struct dentry *upperdir,
	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;

	err = ovl_get_tmpfile(workdir, upperdir, dentry, stat, link, tmpfile,
			      &temp);
	if (err)
		goto out;

	if (S_ISREG(stat->mode)) {
		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);
		if (err)
			goto out_cleanup;
			return err;
	}

	err = ovl_copy_xattr(lowerpath->dentry, temp);
	if (err)
		goto out_cleanup;
		return err;

	inode_lock(temp->d_inode);
	err = ovl_set_attr(temp, stat);
	inode_unlock(temp->d_inode);
	if (err)
		goto out_cleanup;
		return err;

	/*
	 * 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) {
		err = ovl_set_origin(dentry, lowerpath->dentry, temp);
		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) {
		inode_lock_nested(udir, I_MUTEX_PARENT);
		err = ovl_install_temp(workdir, upperdir, dentry, temp, pstat,