ovl: fold ovl_copy_up_truncate() into ovl_copy_up()
authorAmir Goldstein <amir73il@gmail.com>
Sat, 12 Nov 2016 19:36:03 +0000 (21:36 +0200)
committerMiklos Szeredi <mszeredi@redhat.com>
Fri, 16 Dec 2016 10:02:57 +0000 (11:02 +0100)
This removes code duplication.

Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
fs/overlayfs/copy_up.c
fs/overlayfs/inode.c
fs/overlayfs/overlayfs.h

index 6c3aaf45e9cf29b90e5b277c0cc2f10cc4fd70ad..e8cacf7a8dccd9ff1dafe3f3a0371367ad267ba6 100644 (file)
@@ -324,8 +324,8 @@ out_cleanup:
  * 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);
@@ -378,7 +378,7 @@ out_unlock:
        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);
@@ -408,6 +408,9 @@ int ovl_copy_up(struct dentry *dentry)
 
                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);
 
@@ -418,3 +421,8 @@ int ovl_copy_up(struct dentry *dentry)
 
        return err;
 }
+
+int ovl_copy_up(struct dentry *dentry)
+{
+       return ovl_copy_up_flags(dentry, 0);
+}
index a10e948d24fab3f5f08403efaac6ed351697b2b8..1ab8b0dbc23788f10c61e0e734e10f42cd717545 100644 (file)
 #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;
@@ -281,10 +253,7 @@ int ovl_open_maybe_copy_up(struct dentry *dentry, unsigned int file_flags)
        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);
                }
        }
index a83de5d5b8a08776b0bb5e6fac90cdf28c8d90ed..e07aa7b0ddb7a3e4ca8bbc9901b89209c649eb5a 100644 (file)
@@ -219,7 +219,6 @@ void ovl_cleanup(struct inode *dir, struct dentry *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);