From 3eaf10149f06ccaed2fe1aed38487312e1c352c1 Mon Sep 17 00:00:00 2001 From: Erez Zadok Date: Mon, 12 Jan 2009 22:02:11 -0500 Subject: [PATCH] Unionfs: use the new struct cred API Signed-off-by: Erez Zadok --- fs/unionfs/copyup.c | 13 +++++++++++-- fs/unionfs/whiteout.c | 17 ++++++++++++----- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/fs/unionfs/copyup.c b/fs/unionfs/copyup.c index 28f897c9be4..3e0a6ab5a24 100644 --- a/fs/unionfs/copyup.c +++ b/fs/unionfs/copyup.c @@ -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; diff --git a/fs/unionfs/whiteout.c b/fs/unionfs/whiteout.c index 0934ac8694e..db9e3177e51 100644 --- a/fs/unionfs/whiteout.c +++ b/fs/unionfs/whiteout.c @@ -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; } -- 2.34.1