mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-06 13:55:08 +08:00
posix_acl: de-union a_refcount and a_rcu
Currently the two are unioned together, but I don't think that's safe.
It looks like get_cached_acl could race with the last put in
posix_acl_release. get_cached_acl calls atomic_inc_not_zero on
a_refcount, but that field could have already been clobbered by
call_rcu, and may no longer be zero. Fix this by de-unioning the two
fields.
Fixes: b8a7a3a667
(posix_acl: Inode acl caching fixes)
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
c94c09535c
commit
6d4e56ce97
@ -43,10 +43,8 @@ struct posix_acl_entry {
|
||||
};
|
||||
|
||||
struct posix_acl {
|
||||
union {
|
||||
atomic_t a_refcount;
|
||||
struct rcu_head a_rcu;
|
||||
};
|
||||
atomic_t a_refcount;
|
||||
struct rcu_head a_rcu;
|
||||
unsigned int a_count;
|
||||
struct posix_acl_entry a_entries[0];
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user