|
@@ -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,
|