Merge tag 'iwlwifi-next-for-kalle-2016-07-01' of git://git.kernel.org/pub/scm/linux...
[cascardo/linux.git] / fs / overlayfs / dir.c
index b3fc0a3..22f0253 100644 (file)
@@ -405,28 +405,13 @@ static int ovl_create_or_link(struct dentry *dentry, int mode, dev_t rdev,
                err = ovl_create_upper(dentry, inode, &stat, link, hardlink);
        } else {
                const struct cred *old_cred;
-               struct cred *override_cred;
 
-               err = -ENOMEM;
-               override_cred = prepare_creds();
-               if (!override_cred)
-                       goto out_iput;
-
-               /*
-                * CAP_SYS_ADMIN for setting opaque xattr
-                * CAP_DAC_OVERRIDE for create in workdir, rename
-                * CAP_FOWNER for removing whiteout from sticky dir
-                */
-               cap_raise(override_cred->cap_effective, CAP_SYS_ADMIN);
-               cap_raise(override_cred->cap_effective, CAP_DAC_OVERRIDE);
-               cap_raise(override_cred->cap_effective, CAP_FOWNER);
-               old_cred = override_creds(override_cred);
+               old_cred = ovl_override_creds(dentry->d_sb);
 
                err = ovl_create_over_whiteout(dentry, inode, &stat, link,
                                               hardlink);
 
                revert_creds(old_cred);
-               put_cred(override_cred);
        }
 
        if (!err)
@@ -662,32 +647,11 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir)
        if (OVL_TYPE_PURE_UPPER(type)) {
                err = ovl_remove_upper(dentry, is_dir);
        } else {
-               const struct cred *old_cred;
-               struct cred *override_cred;
-
-               err = -ENOMEM;
-               override_cred = prepare_creds();
-               if (!override_cred)
-                       goto out_drop_write;
-
-               /*
-                * CAP_SYS_ADMIN for setting xattr on whiteout, opaque dir
-                * CAP_DAC_OVERRIDE for create in workdir, rename
-                * CAP_FOWNER for removing whiteout from sticky dir
-                * CAP_FSETID for chmod of opaque dir
-                * CAP_CHOWN for chown of opaque dir
-                */
-               cap_raise(override_cred->cap_effective, CAP_SYS_ADMIN);
-               cap_raise(override_cred->cap_effective, CAP_DAC_OVERRIDE);
-               cap_raise(override_cred->cap_effective, CAP_FOWNER);
-               cap_raise(override_cred->cap_effective, CAP_FSETID);
-               cap_raise(override_cred->cap_effective, CAP_CHOWN);
-               old_cred = override_creds(override_cred);
+               const struct cred *old_cred = ovl_override_creds(dentry->d_sb);
 
                err = ovl_remove_and_whiteout(dentry, is_dir);
 
                revert_creds(old_cred);
-               put_cred(override_cred);
        }
 out_drop_write:
        ovl_drop_write(dentry);
@@ -725,7 +689,6 @@ static int ovl_rename2(struct inode *olddir, struct dentry *old,
        bool new_is_dir = false;
        struct dentry *opaquedir = NULL;
        const struct cred *old_cred = NULL;
-       struct cred *override_cred = NULL;
 
        err = -EINVAL;
        if (flags & ~(RENAME_EXCHANGE | RENAME_NOREPLACE))
@@ -794,26 +757,8 @@ static int ovl_rename2(struct inode *olddir, struct dentry *old,
        old_opaque = !OVL_TYPE_PURE_UPPER(old_type);
        new_opaque = !OVL_TYPE_PURE_UPPER(new_type);
 
-       if (old_opaque || new_opaque) {
-               err = -ENOMEM;
-               override_cred = prepare_creds();
-               if (!override_cred)
-                       goto out_drop_write;
-
-               /*
-                * CAP_SYS_ADMIN for setting xattr on whiteout, opaque dir
-                * CAP_DAC_OVERRIDE for create in workdir
-                * CAP_FOWNER for removing whiteout from sticky dir
-                * CAP_FSETID for chmod of opaque dir
-                * CAP_CHOWN for chown of opaque dir
-                */
-               cap_raise(override_cred->cap_effective, CAP_SYS_ADMIN);
-               cap_raise(override_cred->cap_effective, CAP_DAC_OVERRIDE);
-               cap_raise(override_cred->cap_effective, CAP_FOWNER);
-               cap_raise(override_cred->cap_effective, CAP_FSETID);
-               cap_raise(override_cred->cap_effective, CAP_CHOWN);
-               old_cred = override_creds(override_cred);
-       }
+       if (old_opaque || new_opaque)
+               old_cred = ovl_override_creds(old->d_sb);
 
        if (overwrite && OVL_TYPE_MERGE_OR_LOWER(new_type) && new_is_dir) {
                opaquedir = ovl_check_empty_and_clear(new);
@@ -943,10 +888,8 @@ out_dput_old:
 out_unlock:
        unlock_rename(new_upperdir, old_upperdir);
 out_revert_creds:
-       if (old_opaque || new_opaque) {
+       if (old_opaque || new_opaque)
                revert_creds(old_cred);
-               put_cred(override_cred);
-       }
 out_drop_write:
        ovl_drop_write(old);
 out: