b46d79bdb8
This patch adds infrastructure for managing reads and writes to the underlying storage layer for the deduplication index. The deduplication index uses dm-bufio for all of its reads and writes, so part of this infrastructure is managing the various dm-bufio clients required. It also adds the buffered reader and buffered writer abstractions, which simplify reading and writing metadata structures that span several blocks. This patch also includes structures and utilities for encoding and decoding all of the deduplication index metadata, collectively called the index layout. Co-developed-by: J. corwin Coburn <corwin@hurlbutnet.net> Signed-off-by: J. corwin Coburn <corwin@hurlbutnet.net> Co-developed-by: Michael Sclafani <dm-devel@lists.linux.dev> Signed-off-by: Michael Sclafani <dm-devel@lists.linux.dev> Co-developed-by: Thomas Jaskiewicz <tom@jaskiewicz.us> Signed-off-by: Thomas Jaskiewicz <tom@jaskiewicz.us> Co-developed-by: John Wiele <jwiele@redhat.com> Signed-off-by: John Wiele <jwiele@redhat.com> Signed-off-by: Matthew Sakai <msakai@redhat.com> Signed-off-by: Mike Snitzer <snitzer@kernel.org>
79 lines
1.9 KiB
C
79 lines
1.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright 2023 Red Hat
|
|
*/
|
|
|
|
#ifndef UDS_NUMERIC_H
|
|
#define UDS_NUMERIC_H
|
|
|
|
#include <asm/unaligned.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/types.h>
|
|
|
|
/*
|
|
* These utilities encode or decode a number from an offset in a larger data buffer and then
|
|
* advance the offset pointer to the next field in the buffer.
|
|
*/
|
|
|
|
static inline void decode_s64_le(const u8 *buffer, size_t *offset, s64 *decoded)
|
|
{
|
|
*decoded = get_unaligned_le64(buffer + *offset);
|
|
*offset += sizeof(s64);
|
|
}
|
|
|
|
static inline void encode_s64_le(u8 *data, size_t *offset, s64 to_encode)
|
|
{
|
|
put_unaligned_le64(to_encode, data + *offset);
|
|
*offset += sizeof(s64);
|
|
}
|
|
|
|
static inline void decode_u64_le(const u8 *buffer, size_t *offset, u64 *decoded)
|
|
{
|
|
*decoded = get_unaligned_le64(buffer + *offset);
|
|
*offset += sizeof(u64);
|
|
}
|
|
|
|
static inline void encode_u64_le(u8 *data, size_t *offset, u64 to_encode)
|
|
{
|
|
put_unaligned_le64(to_encode, data + *offset);
|
|
*offset += sizeof(u64);
|
|
}
|
|
|
|
static inline void decode_s32_le(const u8 *buffer, size_t *offset, s32 *decoded)
|
|
{
|
|
*decoded = get_unaligned_le32(buffer + *offset);
|
|
*offset += sizeof(s32);
|
|
}
|
|
|
|
static inline void encode_s32_le(u8 *data, size_t *offset, s32 to_encode)
|
|
{
|
|
put_unaligned_le32(to_encode, data + *offset);
|
|
*offset += sizeof(s32);
|
|
}
|
|
|
|
static inline void decode_u32_le(const u8 *buffer, size_t *offset, u32 *decoded)
|
|
{
|
|
*decoded = get_unaligned_le32(buffer + *offset);
|
|
*offset += sizeof(u32);
|
|
}
|
|
|
|
static inline void encode_u32_le(u8 *data, size_t *offset, u32 to_encode)
|
|
{
|
|
put_unaligned_le32(to_encode, data + *offset);
|
|
*offset += sizeof(u32);
|
|
}
|
|
|
|
static inline void decode_u16_le(const u8 *buffer, size_t *offset, u16 *decoded)
|
|
{
|
|
*decoded = get_unaligned_le16(buffer + *offset);
|
|
*offset += sizeof(u16);
|
|
}
|
|
|
|
static inline void encode_u16_le(u8 *data, size_t *offset, u16 to_encode)
|
|
{
|
|
put_unaligned_le16(to_encode, data + *offset);
|
|
*offset += sizeof(u16);
|
|
}
|
|
|
|
#endif /* UDS_NUMERIC_H */
|