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

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
......@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment