Create new EINTEGRITY error with message "Integrity check failed".

An integrity check such as a check-hash or a cross-correlation failed.
The integrity error falls between EINVAL that identifies errors in
parameters to a system call and EIO that identifies errors with the
underlying storage media. EINTEGRITY is typically raised by intermediate
kernel layers such as a filesystem or an in-kernel GEOM subsystem when
they detect inconsistencies. Uses include allowing the mount(8) command
to return a different exit value to automate the running of fsck(8)
during a system boot.

These changes make no use of the new error, they just add it. Later
commits will be made for the use of the new error number and it will
be added to additional manual pages as appropriate.

Reviewed by:    gnn, dim, brueffer, imp
Discussed with: kib, cem, emaste, ed, jilles
Differential Revision: https://reviews.freebsd.org/D18765
This commit is contained in:
Kirk McKusick 2019-01-17 06:35:45 +00:00
parent 0a34fc885b
commit 88640c0e8b
16 changed files with 95 additions and 19 deletions

View File

@ -225,7 +225,9 @@ inline int ENOTRECOVERABLE = 95;
#pragma D binding "1.13" ENOTRECOVERABLE #pragma D binding "1.13" ENOTRECOVERABLE
inline int EOWNERDEAD = 96; inline int EOWNERDEAD = 96;
#pragma D binding "1.13" EOWNERDEAD #pragma D binding "1.13" EOWNERDEAD
inline int ELAST = 96; inline int EINTEGRITY = 96;
#pragma D binding "1.13" EINTEGRITY
inline int ELAST = 97;
#pragma D binding "1.0" ELAST #pragma D binding "1.0" ELAST
inline int ERESTART = -1; inline int ERESTART = -1;
#pragma D binding "1.0" ERESTART #pragma D binding "1.0" ERESTART
@ -340,6 +342,7 @@ inline string strerror[int errno] =
errno == ECAPMODE ? "Not permitted in capability mode" : errno == ECAPMODE ? "Not permitted in capability mode" :
errno == ENOTRECOVERABLE ? "State not recoverable" : errno == ENOTRECOVERABLE ? "State not recoverable" :
errno == EOWNERDEAD ? "Previous owner died" : errno == EOWNERDEAD ? "Previous owner died" :
errno == EINTEGRITY ? "Integrity check failed" :
errno == ERESTART ? "restart syscall" : errno == ERESTART ? "restart syscall" :
errno == EJUSTRETURN ? "don't modify regs, just return" : errno == EJUSTRETURN ? "don't modify regs, just return" :
errno == ENOIOCTL ? "ioctl not handled by this layer" : errno == ENOIOCTL ? "ioctl not handled by this layer" :

View File

@ -46,6 +46,7 @@ enum class errc
identifier_removed, // EIDRM identifier_removed, // EIDRM
illegal_byte_sequence, // EILSEQ illegal_byte_sequence, // EILSEQ
inappropriate_io_control_operation, // ENOTTY inappropriate_io_control_operation, // ENOTTY
integrity_check_failed, // EINTEGRITY
interrupted, // EINTR interrupted, // EINTR
invalid_argument, // EINVAL invalid_argument, // EINVAL
invalid_seek, // ESPIPE invalid_seek, // ESPIPE
@ -143,6 +144,7 @@ _LIBCPP_DECLARE_STRONG_ENUM(errc)
identifier_removed = EIDRM, identifier_removed = EIDRM,
illegal_byte_sequence = EILSEQ, illegal_byte_sequence = EILSEQ,
inappropriate_io_control_operation = ENOTTY, inappropriate_io_control_operation = ENOTTY,
integrity_check_failed = EINTEGRITY,
interrupted = EINTR, interrupted = EINTR,
invalid_argument = EINVAL, invalid_argument = EINVAL,
invalid_seek = ESPIPE, invalid_seek = ESPIPE,

View File

@ -33,49 +33,72 @@
#ifdef __cplusplus #ifdef __cplusplus
#if !defined(EOWNERDEAD) || !defined(ENOTRECOVERABLE) #if !defined(EOWNERDEAD) || !defined(ENOTRECOVERABLE) || !defined(EINTEGRITY)
#ifdef ELAST #ifdef ELAST
static const int __elast1 = ELAST+1; static const int __elast1 = ELAST+1;
static const int __elast2 = ELAST+2; static const int __elast2 = ELAST+2;
static const int __elast2 = ELAST+3;
#else #else
static const int __elast1 = 104; static const int __elast1 = 104;
static const int __elast2 = 105; static const int __elast2 = 105;
static const int __elast2 = 106;
#endif #endif
#ifdef ENOTRECOVERABLE #if !defined(EOWNERDEAD) && !defined(ENOTRECOVERABLE) && !defined(EINTEGRITY)
#define ENOTRECOVERABLE __elast1
#define EOWNERDEAD __elast1 #define EOWNERDEAD __elast2
#define EINTEGRITY __elast3
#ifdef ELAST
#undef ELAST
#define ELAST EINTEGRITY
#elif !defined(EOWNERDEAD) && !defined(ENOTRECOVERABLE) && defined(EINTEGRITY)
#define ENOTRECOVERABLE __elast1
#define EOWNERDEAD __elast2
#ifdef ELAST #ifdef ELAST
#undef ELAST #undef ELAST
#define ELAST EOWNERDEAD #define ELAST EOWNERDEAD
#endif
#elif defined(EOWNERDEAD) #elif !defined(EOWNERDEAD) && defined(ENOTRECOVERABLE) && !defined(EINTEGRITY)
#define EOWNERDEAD __elast1
#define EINTEGRITY __elast2
#ifdef ELAST
#undef ELAST
#define ELAST EINTEGRITY
#elif !defined(EOWNERDEAD) && defined(ENOTRECOVERABLE) && defined(EINTEGRITY)
#define EOWNERDEAD __elast1
#ifdef ELAST
#undef ELAST
#define ELAST EOWNERDEAD
#elif defined(EOWNERDEAD) && !defined(ENOTRECOVERABLE) && !defined(EINTEGRITY)
#define ENOTRECOVERABLE __elast1
#define EINTEGRITY __elast2
#ifdef ELAST
#undef ELAST
#define ELAST EINTEGRITY
#elif defined(EOWNERDEAD) && !defined(ENOTRECOVERABLE) && defined(EINTEGRITY)
#define ENOTRECOVERABLE __elast1 #define ENOTRECOVERABLE __elast1
#ifdef ELAST #ifdef ELAST
#undef ELAST #undef ELAST
#define ELAST ENOTRECOVERABLE #define ELAST ENOTRECOVERABLE
#endif
#else // defined(EOWNERDEAD) #elif defined(EOWNERDEAD) && defined(ENOTRECOVERABLE) && !defined(EINTEGRITY)
#define EINTEGRITY __elast1
#define EOWNERDEAD __elast1
#define ENOTRECOVERABLE __elast2
#ifdef ELAST #ifdef ELAST
#undef ELAST #undef ELAST
#define ELAST ENOTRECOVERABLE #define ELAST EINTEGRITY
#endif
#endif // defined(EOWNERDEAD) #endif // !defined(OWNERDEAD) && !defined(NOTRECOVERABLE) && !defined(INTEGRITY)
#endif // !defined(EOWNERDEAD) || !defined(ENOTRECOVERABLE) #endif // !defined(OWNERDEAD) || !defined(NOTRECOVERABLE) || !defined(INTEGRITY)
// supply errno values likely to be missing, particularly on Windows // supply errno values likely to be missing, particularly on Windows
@ -393,6 +416,10 @@ static const int __elast2 = 105;
#define EMLINK 9979 #define EMLINK 9979
#endif #endif
#ifndef EINTEGRITY
#define EINTEGRITY 9980
#endif
#endif // __cplusplus #endif // __cplusplus
#endif // _LIBCPP_ERRNO_H #endif // _LIBCPP_ERRNO_H

View File

@ -457,3 +457,7 @@ msgstr "Atestay otnay ecoverableray"
# 96 - EOWNERDEAD # 96 - EOWNERDEAD
msgid "Previous owner died" msgid "Previous owner died"
msgstr "Eviouspray ownerway iedday" msgstr "Eviouspray ownerway iedday"
# 97 - EINTEGRITY
msgid "Integrity check failed"
msgstr "integrityyay eckchay ailedfay"

View File

@ -466,3 +466,7 @@ msgstr ""
# 96 - EOWNERDEAD # 96 - EOWNERDEAD
msgid "Previous owner died" msgid "Previous owner died"
msgstr "" msgstr ""
# 97 - EINTEGRITY
msgid "Integrity check failed"
msgstr ""

View File

@ -239,6 +239,13 @@ static const struct bsm_errno bsm_errnos[] = {
ERRNO_NO_LOCAL_MAPPING, ERRNO_NO_LOCAL_MAPPING,
#endif #endif
ES("Process died with the lock") }, ES("Process died with the lock") },
{ BSM_ERRNO_EINTEGRITY,
#ifdef EINTEGRITY
EINTEGRITY,
#else
ERRNO_NO_LOCAL_MAPPING,
#endif
ES("Integrity check failed") },
{ BSM_ERRNO_ENOTRECOVERABLE, { BSM_ERRNO_ENOTRECOVERABLE,
#ifdef ENOTRECOVERABLE #ifdef ENOTRECOVERABLE
ENOTRECOVERABLE, ENOTRECOVERABLE,

View File

@ -204,6 +204,7 @@
#define BSM_ERRNO_EKEYREJECTED 222 /* Linux-specific. */ #define BSM_ERRNO_EKEYREJECTED 222 /* Linux-specific. */
#define BSM_ERRNO_ENOTCAPABLE 223 /* FreeBSD-specific. */ #define BSM_ERRNO_ENOTCAPABLE 223 /* FreeBSD-specific. */
#define BSM_ERRNO_ECAPMODE 224 /* FreeBSD-specific. */ #define BSM_ERRNO_ECAPMODE 224 /* FreeBSD-specific. */
#define BSM_ERRNO_EINTEGRITY 225 /* FreeBSD-specific. */
/* /*
* In the event that OpenBSM doesn't have a file representation of a local * In the event that OpenBSM doesn't have a file representation of a local

View File

@ -158,12 +158,12 @@ const char *const sys_errlist[] = {
"Not permitted in capability mode", /* 94 - ECAPMODE */ "Not permitted in capability mode", /* 94 - ECAPMODE */
"State not recoverable", /* 95 - ENOTRECOVERABLE */ "State not recoverable", /* 95 - ENOTRECOVERABLE */
"Previous owner died", /* 96 - EOWNERDEAD */ "Previous owner died", /* 96 - EOWNERDEAD */
"Integrity check failed", /* 97 - EINTEGRITY */
/* /*
* Reserved space in sys_errlist, take the next slot for a next error code. * Reserved space in sys_errlist, take the next slot for a next error code.
* Reserve prevents the array size from changing for some time. * Reserve prevents the array size from changing for some time.
*/ */
__uprefix, /* 97 */
__uprefix, /* 98 */ __uprefix, /* 98 */
__uprefix, /* 99 */ __uprefix, /* 99 */
__uprefix, /* 100 */ __uprefix, /* 100 */

View File

@ -197,6 +197,8 @@ $ ENOTRECOVERABLE
95 State not recoverable 95 State not recoverable
$ EOWNERDEAD $ EOWNERDEAD
96 Previous owner died 96 Previous owner died
$ EINTEGRITY
97 Integrity check failed
$ $
$ strsignal() support catalog $ strsignal() support catalog
$ $

View File

@ -472,6 +472,20 @@ The system call or operation is not permitted for capability mode processes.
The state protected by a robust mutex is not recoverable. The state protected by a robust mutex is not recoverable.
.It Er 96 EOWNERDEAD Em "Previous owner died" . .It Er 96 EOWNERDEAD Em "Previous owner died" .
The owner of a robust mutex terminated while holding the mutex lock. The owner of a robust mutex terminated while holding the mutex lock.
.It Er 97 EINTEGRITY Em "Integrity check failed" .
An integrity check such as a check-hash or a cross-correlation failed.
The integrity error falls between
.Er EINVAL
that identifies errors in parameters to a system call and
.Er EIO
that identifies errors with the underlying storage media.
It is typically raised by intermediate kernel layers such as a
filesystem or an in-kernel GEOM subsystem when they detect inconsistencies.
Uses include allowing the
.Xr mount 8
command to return a different exit value to automate the running of
.Xr fsck 8
during a system boot.
.El .El
.Sh DEFINITIONS .Sh DEFINITIONS
.Bl -tag -width Ds .Bl -tag -width Ds

View File

@ -146,6 +146,7 @@ static const struct err_name_number {
ENTRY(ECAPMODE), ENTRY(ECAPMODE),
ENTRY(ENOTRECOVERABLE), ENTRY(ENOTRECOVERABLE),
ENTRY(EOWNERDEAD), ENTRY(EOWNERDEAD),
ENTRY(EINTEGRITY),
ENTRY(ELAST), ENTRY(ELAST),
ENTRY(ERESTART), ENTRY(ERESTART),
ENTRY(EJUSTRETURN), ENTRY(EJUSTRETURN),

View File

@ -208,6 +208,7 @@
#define BSM_ERRNO_EKEYREJECTED 222 /* Linux-specific. */ #define BSM_ERRNO_EKEYREJECTED 222 /* Linux-specific. */
#define BSM_ERRNO_ENOTCAPABLE 223 /* FreeBSD-specific. */ #define BSM_ERRNO_ENOTCAPABLE 223 /* FreeBSD-specific. */
#define BSM_ERRNO_ECAPMODE 224 /* FreeBSD-specific. */ #define BSM_ERRNO_ECAPMODE 224 /* FreeBSD-specific. */
#define BSM_ERRNO_EINTEGRITY 225 /* FreeBSD-specific. */
/* /*
* In the event that OpenBSM doesn't have a file representation of a local * In the event that OpenBSM doesn't have a file representation of a local

View File

@ -63,6 +63,7 @@ cloudabi_convert_errno(int error)
[EIDRM] = CLOUDABI_EIDRM, [EIDRM] = CLOUDABI_EIDRM,
[EILSEQ] = CLOUDABI_EILSEQ, [EILSEQ] = CLOUDABI_EILSEQ,
[EINPROGRESS] = CLOUDABI_EINPROGRESS, [EINPROGRESS] = CLOUDABI_EINPROGRESS,
[EINTEGRITY] = CLOUDABI_EINVAL,
[EINTR] = CLOUDABI_EINTR, [EINTR] = CLOUDABI_EINTR,
[EINVAL] = CLOUDABI_EINVAL, [EINVAL] = CLOUDABI_EINVAL,
[EIO] = CLOUDABI_EIO, [EIO] = CLOUDABI_EIO,

View File

@ -142,7 +142,8 @@ const int linux_errtbl[ELAST + 1] = {
-1, /* ECAPMODE -> EPERM */ -1, /* ECAPMODE -> EPERM */
-131, /* ENOTRECOVERABLE */ -131, /* ENOTRECOVERABLE */
-130, /* EOWNERDEAD */ -130, /* EOWNERDEAD */
-22, /* EINTEGRITY -> EINVAL */
}; };
_Static_assert(ELAST == 96, _Static_assert(ELAST == 97,
"missing errno entries in linux_errtbl"); "missing errno entries in linux_errtbl");

View File

@ -243,6 +243,13 @@ static const struct bsm_errno bsm_errnos[] = {
ERRNO_NO_LOCAL_MAPPING, ERRNO_NO_LOCAL_MAPPING,
#endif #endif
ES("Process died with the lock") }, ES("Process died with the lock") },
{ BSM_ERRNO_EINTEGRITY,
#ifdef EINTEGRITY
EINTEGRITY,
#else
ERRNO_NO_LOCAL_MAPPING,
#endif
ES("Integrity check failed") },
{ BSM_ERRNO_ENOTRECOVERABLE, { BSM_ERRNO_ENOTRECOVERABLE,
#ifdef ENOTRECOVERABLE #ifdef ENOTRECOVERABLE
ENOTRECOVERABLE, ENOTRECOVERABLE,

View File

@ -180,10 +180,11 @@ __END_DECLS
#define ECAPMODE 94 /* Not permitted in capability mode */ #define ECAPMODE 94 /* Not permitted in capability mode */
#define ENOTRECOVERABLE 95 /* State not recoverable */ #define ENOTRECOVERABLE 95 /* State not recoverable */
#define EOWNERDEAD 96 /* Previous owner died */ #define EOWNERDEAD 96 /* Previous owner died */
#define EINTEGRITY 97 /* Integrity check failed */
#endif /* _POSIX_SOURCE */ #endif /* _POSIX_SOURCE */
#ifndef _POSIX_SOURCE #ifndef _POSIX_SOURCE
#define ELAST 96 /* Must be equal largest errno */ #define ELAST 97 /* Must be equal largest errno */
#endif /* _POSIX_SOURCE */ #endif /* _POSIX_SOURCE */
#if defined(_KERNEL) || defined(_WANT_KERNEL_ERRNO) #if defined(_KERNEL) || defined(_WANT_KERNEL_ERRNO)