diff options
Diffstat (limited to 'kernel/fs/btrfs/hash.c')
-rw-r--r-- | kernel/fs/btrfs/hash.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/kernel/fs/btrfs/hash.c b/kernel/fs/btrfs/hash.c new file mode 100644 index 000000000..aae520b2a --- /dev/null +++ b/kernel/fs/btrfs/hash.c @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2014 Filipe David Borba Manana <fdmanana@gmail.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License v2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + */ + +#include <crypto/hash.h> +#include <linux/err.h> +#include "hash.h" + +static struct crypto_shash *tfm; + +int __init btrfs_hash_init(void) +{ + tfm = crypto_alloc_shash("crc32c", 0, 0); + + return PTR_ERR_OR_ZERO(tfm); +} + +void btrfs_hash_exit(void) +{ + crypto_free_shash(tfm); +} + +u32 btrfs_crc32c(u32 crc, const void *address, unsigned int length) +{ + SHASH_DESC_ON_STACK(shash, tfm); + u32 *ctx = (u32 *)shash_desc_ctx(shash); + int err; + + shash->tfm = tfm; + shash->flags = 0; + *ctx = crc; + + err = crypto_shash_update(shash, address, length); + BUG_ON(err); + + return *ctx; +} |