Skip to content

Commit

Permalink
ovl: factor out ovl_copy_up_inode() helper
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Amir Goldstein authored and Miklos Szeredi committed Jul 4, 2017
1 parent 7d90b85 commit 02209d1
Showing 1 changed file with 29 additions and 17 deletions.
46 changes: 29 additions & 17 deletions fs/overlayfs/copy_up.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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
Expand All @@ -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,
Expand Down

0 comments on commit 02209d1

Please sign in to comment.