Unionfs: use the new struct cred API
authorErez Zadok <ezk@cs.sunysb.edu>
Tue, 13 Jan 2009 03:02:11 +0000 (22:02 -0500)
committerErez Zadok <ezk@cs.sunysb.edu>
Fri, 12 Aug 2011 02:38:59 +0000 (22:38 -0400)
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/unionfs/copyup.c
fs/unionfs/whiteout.c

index 28f897c9be4356ddf32547b7f0f733610337c658..3e0a6ab5a246339743cf0ae2401f4682e4675a0f 100644 (file)
@@ -92,10 +92,19 @@ static int copyup_xattrs(struct dentry *old_lower_dentry,
                 * XXX: move entire copyup code to SIOQ.
                 */
                if (err == -EPERM && !capable(CAP_FOWNER)) {
-                       cap_raise(current->cap_effective, CAP_FOWNER);
+                       const struct cred *old_creds;
+                       struct cred *new_creds;
+
+                       new_creds = prepare_creds();
+                       if (unlikely(!new_creds)) {
+                               err = -ENOMEM;
+                               goto out;
+                       }
+                       cap_raise(new_creds->cap_effective, CAP_FOWNER);
+                       old_creds = override_creds(new_creds);
                        err = vfs_setxattr(new_lower_dentry, name_list,
                                           attr_value, size, 0);
-                       cap_lower(current->cap_effective, CAP_FOWNER);
+                       revert_creds(old_creds);
                }
                if (err < 0)
                        goto out;
index 0934ac8694e1220ff3aa59b1e8c2c074ff458cdd..db9e3177e51364a5417cc05b52cf1c523320100a 100644 (file)
@@ -532,7 +532,8 @@ int make_dir_opaque(struct dentry *dentry, int bindex)
        struct dentry *lower_dentry, *diropq;
        struct inode *lower_dir;
        struct nameidata nd;
-       kernel_cap_t orig_cap;
+       const struct cred *old_creds;
+       struct cred *new_creds;
 
        /*
         * Opaque directory whiteout markers are special files (like regular
@@ -542,9 +543,14 @@ int make_dir_opaque(struct dentry *dentry, int bindex)
         * creation of the .wh.__dir_opaque: file.  Note, this does not
         * circumvent normal ->permission).
         */
-       orig_cap = current->cap_effective;
-       cap_raise(current->cap_effective, CAP_DAC_READ_SEARCH);
-       cap_raise(current->cap_effective, CAP_DAC_OVERRIDE);
+       new_creds = prepare_creds();
+       if (unlikely(!new_creds)) {
+               err = -ENOMEM;
+               goto out_err;
+       }
+       cap_raise(new_creds->cap_effective, CAP_DAC_READ_SEARCH);
+       cap_raise(new_creds->cap_effective, CAP_DAC_OVERRIDE);
+       old_creds = override_creds(new_creds);
 
        lower_dentry = unionfs_lower_dentry_idx(dentry, bindex);
        lower_dir = lower_dentry->d_inode;
@@ -572,6 +578,7 @@ int make_dir_opaque(struct dentry *dentry, int bindex)
 
 out:
        mutex_unlock(&lower_dir->i_mutex);
-       current->cap_effective = orig_cap;
+       revert_creds(old_creds);
+out_err:
        return err;
 }