This removes code duplication.
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
  * is possible that the copy up will lock the old parent.  At that point
  * the file will have already been copied up anyway.
  */
-int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry,
-                   struct path *lowerpath, struct kstat *stat)
+static int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry,
+                          struct path *lowerpath, struct kstat *stat)
 {
        DEFINE_DELAYED_CALL(done);
        struct dentry *workdir = ovl_workdir(dentry);
        return err;
 }
 
-int ovl_copy_up(struct dentry *dentry)
+int ovl_copy_up_flags(struct dentry *dentry, int flags)
 {
        int err = 0;
        const struct cred *old_cred = ovl_override_creds(dentry->d_sb);
 
                ovl_path_lower(next, &lowerpath);
                err = vfs_getattr(&lowerpath, &stat);
+               /* maybe truncate regular file. this has no effect on dirs */
+               if (flags & O_TRUNC)
+                       stat.size = 0;
                if (!err)
                        err = ovl_copy_up_one(parent, next, &lowerpath, &stat);
 
 
        return err;
 }
+
+int ovl_copy_up(struct dentry *dentry)
+{
+       return ovl_copy_up_flags(dentry, 0);
+}
 
 #include <linux/posix_acl.h>
 #include "overlayfs.h"
 
-static int ovl_copy_up_truncate(struct dentry *dentry)
-{
-       int err;
-       struct dentry *parent;
-       struct kstat stat;
-       struct path lowerpath;
-       const struct cred *old_cred;
-
-       parent = dget_parent(dentry);
-       err = ovl_copy_up(parent);
-       if (err)
-               goto out_dput_parent;
-
-       ovl_path_lower(dentry, &lowerpath);
-
-       old_cred = ovl_override_creds(dentry->d_sb);
-       err = vfs_getattr(&lowerpath, &stat);
-       if (!err) {
-               stat.size = 0;
-               err = ovl_copy_up_one(parent, dentry, &lowerpath, &stat);
-       }
-       revert_creds(old_cred);
-
-out_dput_parent:
-       dput(parent);
-       return err;
-}
-
 int ovl_setattr(struct dentry *dentry, struct iattr *attr)
 {
        int err;
        if (ovl_open_need_copy_up(file_flags, type, realpath.dentry)) {
                err = ovl_want_write(dentry);
                if (!err) {
-                       if (file_flags & O_TRUNC)
-                               err = ovl_copy_up_truncate(dentry);
-                       else
-                               err = ovl_copy_up(dentry);
+                       err = ovl_copy_up_flags(dentry, file_flags);
                        ovl_drop_write(dentry);
                }
        }
 
 
 /* copy_up.c */
 int ovl_copy_up(struct dentry *dentry);
-int ovl_copy_up_one(struct dentry *parent, struct dentry *dentry,
-                   struct path *lowerpath, struct kstat *stat);
+int ovl_copy_up_flags(struct dentry *dentry, int flags);
 int ovl_copy_xattr(struct dentry *old, struct dentry *new);
 int ovl_set_attr(struct dentry *upper, struct kstat *stat);