diff --git a/acinclude.m4 b/acinclude.m4 index 83ce22d577..44ce680c95 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -825,6 +825,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([filename], [name], [fs.h]) + AC_CHECK_LINUX_STRUCT([key_type], [preparse], [key-type.h]) AC_CHECK_LINUX_STRUCT([nameidata], [path], [namei.h]) AC_CHECK_LINUX_STRUCT([proc_dir_entry], [owner], [proc_fs.h]) AC_CHECK_LINUX_STRUCT([super_block], [s_bdi], [fs.h]) diff --git a/src/afs/LINUX/osi_groups.c b/src/afs/LINUX/osi_groups.c index 1903a54435..c2a0308a66 100644 --- a/src/afs/LINUX/osi_groups.c +++ b/src/afs/LINUX/osi_groups.c @@ -457,7 +457,11 @@ static void afs_pag_describe(const struct key *key, struct seq_file *m) seq_printf(m, ": %u", key->datalen); } +#if defined(STRUCT_KEY_TYPE_HAS_PREPARSE) +static int afs_pag_instantiate(struct key *key, struct key_preparsed_payload *prep) +#else static int afs_pag_instantiate(struct key *key, const void *data, size_t datalen) +#endif { int code; afs_uint32 *userpag, pag = NOPAG; @@ -468,7 +472,11 @@ static int afs_pag_instantiate(struct key *key, const void *data, size_t datalen code = -EINVAL; get_group_info(current_group_info()); +#if defined(STRUCT_KEY_TYPE_HAS_PREPARSE) + if (prep->datalen != sizeof(afs_uint32) || !prep->data) +#else if (datalen != sizeof(afs_uint32) || !data) +#endif goto error; /* ensure key being set matches current pag */ @@ -477,7 +485,11 @@ static int afs_pag_instantiate(struct key *key, const void *data, size_t datalen if (pag == NOPAG) goto error; - userpag = (afs_uint32 *) data; +#if defined(STRUCT_KEY_TYPE_HAS_PREPARSE) + userpag = (afs_uint32 *)prep->data; +#else + userpag = (afs_uint32 *)data; +#endif if (*userpag != pag) goto error;