Commit 32955148 authored by Al Viro's avatar Al Viro Committed by Linus Torvalds

fix rcu annotations noise in cred.h

task->cred is declared as __rcu, and access to other tasks' ->cred is,
indeed, protected.  Access to current->cred does not need rcu_dereference()
at all, since only the task itself can change its ->cred.  sparse, of
course, has no way of knowing that...

Add force-cast in current_cred(), make current_fsuid() et.al. use it.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 7813b94a
...@@ -265,10 +265,11 @@ static inline void put_cred(const struct cred *_cred) ...@@ -265,10 +265,11 @@ static inline void put_cred(const struct cred *_cred)
/** /**
* current_cred - Access the current task's subjective credentials * current_cred - Access the current task's subjective credentials
* *
* Access the subjective credentials of the current task. * Access the subjective credentials of the current task. RCU-safe,
* since nobody else can modify it.
*/ */
#define current_cred() \ #define current_cred() \
(current->cred) (*(__force struct cred **)&current->cred)
/** /**
* __task_cred - Access a task's objective credentials * __task_cred - Access a task's objective credentials
...@@ -307,7 +308,7 @@ static inline void put_cred(const struct cred *_cred) ...@@ -307,7 +308,7 @@ static inline void put_cred(const struct cred *_cred)
({ \ ({ \
struct user_struct *__u; \ struct user_struct *__u; \
struct cred *__cred; \ struct cred *__cred; \
__cred = (struct cred *) current_cred(); \ __cred = current_cred(); \
__u = get_uid(__cred->user); \ __u = get_uid(__cred->user); \
__u; \ __u; \
}) })
...@@ -322,7 +323,7 @@ static inline void put_cred(const struct cred *_cred) ...@@ -322,7 +323,7 @@ static inline void put_cred(const struct cred *_cred)
({ \ ({ \
struct group_info *__groups; \ struct group_info *__groups; \
struct cred *__cred; \ struct cred *__cred; \
__cred = (struct cred *) current_cred(); \ __cred = current_cred(); \
__groups = get_group_info(__cred->group_info); \ __groups = get_group_info(__cred->group_info); \
__groups; \ __groups; \
}) })
...@@ -341,7 +342,7 @@ static inline void put_cred(const struct cred *_cred) ...@@ -341,7 +342,7 @@ static inline void put_cred(const struct cred *_cred)
#define current_cred_xxx(xxx) \ #define current_cred_xxx(xxx) \
({ \ ({ \
current->cred->xxx; \ current_cred()->xxx; \
}) })
#define current_uid() (current_cred_xxx(uid)) #define current_uid() (current_cred_xxx(uid))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment