linux/drivers/md/dm-vdo/numeric.h
Matthew Sakai b46d79bdb8 dm vdo: add deduplication index storage interface
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>
2024-02-20 13:43:14 -05:00

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 */