KEYS: Ceph: Use key preparsing
Make use of key preparsing in Ceph so that quota size determination can take place prior to keyring locking when a key is being added. Signed-off-by: David Howells <dhowells@redhat.com> Acked-by: Steve Dickson <steved@redhat.com> Reviewed-by: Sage Weil <sage@redhat.com> cc: Tommi Virtanen <tommi.virtanen@dreamhost.com>
This commit is contained in:
parent
f9167789df
commit
efa64c0978
1 changed files with 15 additions and 9 deletions
|
@ -423,8 +423,7 @@ int ceph_encrypt2(struct ceph_crypto_key *secret, void *dst, size_t *dst_len,
|
|||
}
|
||||
}
|
||||
|
||||
static int ceph_key_instantiate(struct key *key,
|
||||
struct key_preparsed_payload *prep)
|
||||
static int ceph_key_preparse(struct key_preparsed_payload *prep)
|
||||
{
|
||||
struct ceph_crypto_key *ckey;
|
||||
size_t datalen = prep->datalen;
|
||||
|
@ -435,10 +434,6 @@ static int ceph_key_instantiate(struct key *key,
|
|||
if (datalen <= 0 || datalen > 32767 || !prep->data)
|
||||
goto err;
|
||||
|
||||
ret = key_payload_reserve(key, datalen);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
ret = -ENOMEM;
|
||||
ckey = kmalloc(sizeof(*ckey), GFP_KERNEL);
|
||||
if (!ckey)
|
||||
|
@ -450,7 +445,8 @@ static int ceph_key_instantiate(struct key *key,
|
|||
if (ret < 0)
|
||||
goto err_ckey;
|
||||
|
||||
key->payload.data = ckey;
|
||||
prep->payload[0] = ckey;
|
||||
prep->quotalen = datalen;
|
||||
return 0;
|
||||
|
||||
err_ckey:
|
||||
|
@ -459,12 +455,20 @@ static int ceph_key_instantiate(struct key *key,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void ceph_key_free_preparse(struct key_preparsed_payload *prep)
|
||||
{
|
||||
struct ceph_crypto_key *ckey = prep->payload[0];
|
||||
ceph_crypto_key_destroy(ckey);
|
||||
kfree(ckey);
|
||||
}
|
||||
|
||||
static int ceph_key_match(const struct key *key, const void *description)
|
||||
{
|
||||
return strcmp(key->description, description) == 0;
|
||||
}
|
||||
|
||||
static void ceph_key_destroy(struct key *key) {
|
||||
static void ceph_key_destroy(struct key *key)
|
||||
{
|
||||
struct ceph_crypto_key *ckey = key->payload.data;
|
||||
|
||||
ceph_crypto_key_destroy(ckey);
|
||||
|
@ -473,7 +477,9 @@ static void ceph_key_destroy(struct key *key) {
|
|||
|
||||
struct key_type key_type_ceph = {
|
||||
.name = "ceph",
|
||||
.instantiate = ceph_key_instantiate,
|
||||
.preparse = ceph_key_preparse,
|
||||
.free_preparse = ceph_key_free_preparse,
|
||||
.instantiate = generic_key_instantiate,
|
||||
.match = ceph_key_match,
|
||||
.destroy = ceph_key_destroy,
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue