diff --git a/lib/libdevmapper.c b/lib/libdevmapper.c index 607c0fc3..e1b9bed9 100644 --- a/lib/libdevmapper.c +++ b/lib/libdevmapper.c @@ -43,6 +43,7 @@ #define DM_VERITY_TARGET "verity" #define DM_INTEGRITY_TARGET "integrity" #define DM_LINEAR_TARGET "linear" +#define DM_ERROR_TARGET "error" #define RETRY_COUNT 5 /* Set if DM target versions were probed */ @@ -1394,6 +1395,8 @@ static void _dm_target_free_query_path(struct crypt_device *cd, struct dm_target free(CONST_CAST(void*)tgt->u.verity.root_hash); /* fall through */ case DM_LINEAR: + /* fall through */ + case DM_ERROR: break; default: log_err(cd, _("Unknown dm target type.")); @@ -1601,7 +1604,8 @@ static int dm_status_dmi(const char *name, struct dm_info *dmi, if (!target && (strcmp(target_type, DM_CRYPT_TARGET) && strcmp(target_type, DM_VERITY_TARGET) && strcmp(target_type, DM_INTEGRITY_TARGET) && - strcmp(target_type, DM_LINEAR_TARGET))) + strcmp(target_type, DM_LINEAR_TARGET) && + strcmp(target_type, DM_ERROR_TARGET))) goto out; r = 0; out: @@ -2329,6 +2333,14 @@ err: return r; } +static int _dm_target_query_error(struct crypt_device *cd, struct dm_target *tgt) +{ + tgt->type = DM_ERROR; + tgt->direction = TARGET_QUERY; + + return 0; +} + /* * on error retval has to be negative * @@ -2348,6 +2360,8 @@ static int dm_target_query(struct crypt_device *cd, struct dm_target *tgt, const r = _dm_target_query_integrity(cd, get_flags, params, tgt, act_flags); else if (!strcmp(target_type, DM_LINEAR_TARGET)) r = _dm_target_query_linear(cd, tgt, get_flags, params); + else if (!strcmp(target_type, DM_ERROR_TARGET)) + r = _dm_target_query_error(cd, tgt); if (!r) { tgt->offset = *start; diff --git a/lib/utils_dm.h b/lib/utils_dm.h index f8b6df5c..4a4e7526 100644 --- a/lib/utils_dm.h +++ b/lib/utils_dm.h @@ -63,7 +63,7 @@ static inline uint32_t act2dmflags(uint32_t act_flags) #define DM_DEFERRED_SUPPORTED (1 << 15) /* deferred removal of device */ #define DM_INTEGRITY_RECALC_SUPPORTED (1 << 16) /* dm-integrity automatic recalculation supported */ -typedef enum { DM_CRYPT = 0, DM_VERITY, DM_INTEGRITY, DM_LINEAR, DM_UNKNOWN } dm_target_type; +typedef enum { DM_CRYPT = 0, DM_VERITY, DM_INTEGRITY, DM_LINEAR, DM_ERROR, DM_UNKNOWN } dm_target_type; enum tdirection { TARGET_SET = 1, TARGET_QUERY }; int dm_flags(struct crypt_device *cd, dm_target_type target, uint32_t *flags);