KEYS: Merge the type-specific data with the payload data
Merge the type-specific data with the payload data into one four-word chunk as it seems pointless to keep them separate. Use user_key_payload() for accessing the payloads of overloaded user-defined keys. Signed-off-by: David Howells <dhowells@redhat.com> cc: linux-cifs@vger.kernel.org cc: ecryptfs@vger.kernel.org cc: linux-ext4@vger.kernel.org cc: linux-f2fs-devel@lists.sourceforge.net cc: linux-nfs@vger.kernel.org cc: ceph-devel@vger.kernel.org cc: linux-ima-devel@lists.sourceforge.net
This commit is contained in:
@@ -122,7 +122,7 @@ dns_resolver_preparse(struct key_preparsed_payload *prep)
|
||||
goto bad_option_value;
|
||||
|
||||
kdebug("dns error no. = %lu", derrno);
|
||||
prep->type_data[0] = ERR_PTR(-derrno);
|
||||
prep->payload.data[dns_key_error] = ERR_PTR(-derrno);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -137,8 +137,8 @@ dns_resolver_preparse(struct key_preparsed_payload *prep)
|
||||
|
||||
/* don't cache the result if we're caching an error saying there's no
|
||||
* result */
|
||||
if (prep->type_data[0]) {
|
||||
kleave(" = 0 [h_error %ld]", PTR_ERR(prep->type_data[0]));
|
||||
if (prep->payload.data[dns_key_error]) {
|
||||
kleave(" = 0 [h_error %ld]", PTR_ERR(prep->payload.data[dns_key_error]));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -155,7 +155,7 @@ dns_resolver_preparse(struct key_preparsed_payload *prep)
|
||||
memcpy(upayload->data, data, result_len);
|
||||
upayload->data[result_len] = '\0';
|
||||
|
||||
prep->payload[0] = upayload;
|
||||
prep->payload.data[dns_key_data] = upayload;
|
||||
kleave(" = 0");
|
||||
return 0;
|
||||
}
|
||||
@@ -167,7 +167,7 @@ static void dns_resolver_free_preparse(struct key_preparsed_payload *prep)
|
||||
{
|
||||
pr_devel("==>%s()\n", __func__);
|
||||
|
||||
kfree(prep->payload[0]);
|
||||
kfree(prep->payload.data[dns_key_data]);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -223,10 +223,10 @@ static int dns_resolver_match_preparse(struct key_match_data *match_data)
|
||||
*/
|
||||
static void dns_resolver_describe(const struct key *key, struct seq_file *m)
|
||||
{
|
||||
int err = key->type_data.x[0];
|
||||
|
||||
seq_puts(m, key->description);
|
||||
if (key_is_instantiated(key)) {
|
||||
int err = PTR_ERR(key->payload.data[dns_key_error]);
|
||||
|
||||
if (err)
|
||||
seq_printf(m, ": %d", err);
|
||||
else
|
||||
@@ -241,8 +241,10 @@ static void dns_resolver_describe(const struct key *key, struct seq_file *m)
|
||||
static long dns_resolver_read(const struct key *key,
|
||||
char __user *buffer, size_t buflen)
|
||||
{
|
||||
if (key->type_data.x[0])
|
||||
return key->type_data.x[0];
|
||||
int err = PTR_ERR(key->payload.data[dns_key_error]);
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
return user_read(key, buffer, buflen);
|
||||
}
|
||||
|
@@ -70,7 +70,7 @@ int dns_query(const char *type, const char *name, size_t namelen,
|
||||
const char *options, char **_result, time_t *_expiry)
|
||||
{
|
||||
struct key *rkey;
|
||||
struct user_key_payload *upayload;
|
||||
const struct user_key_payload *upayload;
|
||||
const struct cred *saved_cred;
|
||||
size_t typelen, desclen;
|
||||
char *desc, *cp;
|
||||
@@ -137,12 +137,11 @@ int dns_query(const char *type, const char *name, size_t namelen,
|
||||
goto put;
|
||||
|
||||
/* If the DNS server gave an error, return that to the caller */
|
||||
ret = rkey->type_data.x[0];
|
||||
ret = PTR_ERR(rkey->payload.data[dns_key_error]);
|
||||
if (ret)
|
||||
goto put;
|
||||
|
||||
upayload = rcu_dereference_protected(rkey->payload.data,
|
||||
lockdep_is_held(&rkey->sem));
|
||||
upayload = user_key_payload(rkey);
|
||||
len = upayload->datalen;
|
||||
|
||||
ret = -ENOMEM;
|
||||
|
@@ -22,6 +22,14 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
/*
|
||||
* Layout of key payload words.
|
||||
*/
|
||||
enum {
|
||||
dns_key_data,
|
||||
dns_key_error,
|
||||
};
|
||||
|
||||
/*
|
||||
* dns_key.c
|
||||
*/
|
||||
|
Reference in New Issue
Block a user