1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
From 2d524981c32ac8f502fa344aac1a4952c64078f1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20La=C3=9F?= <lass@mail.uni-paderborn.de>
Date: Mon, 18 Jan 2016 18:29:00 +0100
Subject: [PATCH 1/3] Linux 4.4: key_payload has no member 'value'
In Linux 4.4 (146aa8b1453bd8f1ff2304ffb71b4ee0eb9acdcc) type-specific and
payload data have been merged. The payload is now accessed directly and has
no 'value' member anymore.
FIXES 132677
Reviewed-on: https://gerrit.openafs.org/12169
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Mark Vitale <mvitale@sinenomine.net>
Tested-by: Mark Vitale <mvitale@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
(cherry picked from commit 5067ee3ae11932a3f1c972c8f88b20afbd9e1d88)
Change-Id: I5a3e89b2676b463935e9a77042cbcd8ab812dc68
---
acinclude.m4 | 1 +
src/afs/LINUX/osi_groups.c | 16 +++++++++++++++-
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/acinclude.m4 b/acinclude.m4
index b1444a1..a7a7cb6 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -882,6 +882,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*)
AC_CHECK_LINUX_STRUCT([file_operations], [sendfile], [fs.h])
AC_CHECK_LINUX_STRUCT([file_system_type], [mount], [fs.h])
AC_CHECK_LINUX_STRUCT([inode_operations], [truncate], [fs.h])
+ AC_CHECK_LINUX_STRUCT([key], [payload.value], [key.h])
AC_CHECK_LINUX_STRUCT([key_type], [instantiate_prep], [key-type.h])
AC_CHECK_LINUX_STRUCT([key_type], [match_preparse], [key-type.h])
AC_CHECK_LINUX_STRUCT([key_type], [preparse], [key-type.h])
diff --git a/src/afs/LINUX/osi_groups.c b/src/afs/LINUX/osi_groups.c
index 3b068e5..a83bcb9 100644
--- a/src/afs/LINUX/osi_groups.c
+++ b/src/afs/LINUX/osi_groups.c
@@ -489,7 +489,11 @@ static int afs_pag_instantiate(struct key *key, const void *data, size_t datalen
if (*userpag != pag)
goto error;
+#if defined(STRUCT_KEY_HAS_PAYLOAD_VALUE)
key->payload.value = (unsigned long) *userpag;
+#else
+ memcpy(&key->payload, userpag, sizeof(afs_uint32));
+#endif
key->datalen = sizeof(afs_uint32);
code = 0;
@@ -513,9 +517,15 @@ static int afs_pag_match(const struct key *key, const void *description)
static void afs_pag_destroy(struct key *key)
{
- afs_uint32 pag = key->payload.value;
+ afs_uint32 pag;
int locked = ISAFS_GLOCK();
+#if defined(STRUCT_KEY_HAS_PAYLOAD_VALUE)
+ pag = key->payload.value;
+#else
+ memcpy(&pag, &key->payload, sizeof(afs_uint32));
+#endif
+
if (!locked)
AFS_GLOCK();
@@ -609,7 +619,11 @@ osi_get_keyring_pag(afs_ucred_t *cred)
if (!IS_ERR(key)) {
if (key_validate(key) == 0 && uid_eq(key->uid, GLOBAL_ROOT_UID)) { /* also verify in the session keyring? */
+#if defined(STRUCT_KEY_HAS_PAYLOAD_VALUE)
keyring_pag = key->payload.value;
+#else
+ memcpy(&keyring_pag, &key->payload, sizeof(afs_int32));
+#endif
/* Only set PAG in groups if needed,
* and the creds are from the current process */
if (afs_linux_cred_is_current(cred) &&
--
2.7.4
|