root/drivers/md/dm-vdo/errors.h
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright 2023 Red Hat
 */

#ifndef UDS_ERRORS_H
#define UDS_ERRORS_H

#include <linux/compiler.h>
#include <linux/types.h>

/* Custom error codes and error-related utilities */
#define VDO_SUCCESS 0

/* Valid status codes for internal UDS functions. */
enum uds_status_codes {
        /* Successful return */
        UDS_SUCCESS = VDO_SUCCESS,
        /* Used as a base value for reporting internal errors */
        UDS_ERROR_CODE_BASE = 1024,
        /* Index overflow */
        UDS_OVERFLOW = UDS_ERROR_CODE_BASE,
        /* Invalid argument passed to internal routine */
        UDS_INVALID_ARGUMENT,
        /* UDS data structures are in an invalid state */
        UDS_BAD_STATE,
        /* Attempt to enter the same name into an internal structure twice */
        UDS_DUPLICATE_NAME,
        /* An assertion failed */
        UDS_ASSERTION_FAILED,
        /* A request has been queued for later processing (not an error) */
        UDS_QUEUED,
        /* This error range has already been registered */
        UDS_ALREADY_REGISTERED,
        /* Attempt to read or write data outside the valid range */
        UDS_OUT_OF_RANGE,
        /* The index session is disabled */
        UDS_DISABLED,
        /* The index configuration or volume format is no longer supported */
        UDS_UNSUPPORTED_VERSION,
        /* Some index structure is corrupt */
        UDS_CORRUPT_DATA,
        /* No index state found */
        UDS_NO_INDEX,
        /* Attempt to access incomplete index save data */
        UDS_INDEX_NOT_SAVED_CLEANLY,
        /* One more than the last UDS_INTERNAL error code */
        UDS_ERROR_CODE_LAST,
        /* One more than the last error this block will ever use */
        UDS_ERROR_CODE_BLOCK_END = UDS_ERROR_CODE_BASE + 440,
};

enum {
        VDO_MAX_ERROR_NAME_SIZE = 80,
        VDO_MAX_ERROR_MESSAGE_SIZE = 128,
};

struct error_info {
        const char *name;
        const char *message;
};

const char * __must_check uds_string_error(int errnum, char *buf, size_t buflen);

const char *uds_string_error_name(int errnum, char *buf, size_t buflen);

int uds_status_to_errno(int error);

int uds_register_error_block(const char *block_name, int first_error,
                             int last_reserved_error, const struct error_info *infos,
                             size_t info_size);

#endif /* UDS_ERRORS_H */