summaryrefslogtreecommitdiffstats
path: root/sbin/geom
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2011-10-25 07:56:27 +0000
committerpjd <pjd@FreeBSD.org>2011-10-25 07:56:27 +0000
commitcf29098f00348555b42a4f4715da05d8abac8582 (patch)
tree4ef31b9dbc013810605639d16883235f6d78212b /sbin/geom
parent3717f1c28dec5de3c158ce6de6678793d636bde2 (diff)
downloadFreeBSD-src-cf29098f00348555b42a4f4715da05d8abac8582.zip
FreeBSD-src-cf29098f00348555b42a4f4715da05d8abac8582.tar.gz
When we detect GELI metadata version that is newer than the highest we
support, inform the user about that instead of 'MD5 hash mismatch'. Suggested by: Garrett Cooper <yanegomi@gmail.com> MFC after: 3 days
Diffstat (limited to 'sbin/geom')
-rw-r--r--sbin/geom/class/eli/geom_eli.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/sbin/geom/class/eli/geom_eli.c b/sbin/geom/class/eli/geom_eli.c
index ca0c80b..183b11c 100644
--- a/sbin/geom/class/eli/geom_eli.c
+++ b/sbin/geom/class/eli/geom_eli.c
@@ -594,8 +594,23 @@ eli_metadata_read(struct gctl_req *req, const char *prov,
return (-1);
}
}
- if (eli_metadata_decode(sector, md) != 0) {
- gctl_error(req, "MD5 hash mismatch for %s.", prov);
+ error = eli_metadata_decode(sector, md);
+ switch (error) {
+ case 0:
+ break;
+ case EOPNOTSUPP:
+ gctl_error(req,
+ "Provider's %s metadata version %u is too new.\n"
+ "geli: The highest supported version is %u.",
+ prov, (unsigned int)md->md_version, G_ELI_VERSION);
+ return (-1);
+ case EINVAL:
+ gctl_error(req, "Inconsistent provider's %s metadata.", prov);
+ return (-1);
+ default:
+ gctl_error(req,
+ "Unexpected error while decoding provider's %s metadata: %s.",
+ prov, strerror(error));
return (-1);
}
return (0);
@@ -1410,7 +1425,7 @@ eli_resize(struct gctl_req *req)
unsigned char *sector;
ssize_t secsize;
off_t mediasize, oldsize;
- int nargs, provfd;
+ int error, nargs, provfd;
nargs = gctl_get_int(req, "nargs");
if (nargs != 1) {
@@ -1461,8 +1476,23 @@ eli_resize(struct gctl_req *req)
}
/* Check if this sector contains geli metadata. */
- if (eli_metadata_decode(sector, &md) != 0) {
- gctl_error(req, "MD5 hash mismatch: no metadata for oldsize.");
+ error = eli_metadata_decode(sector, &md);
+ switch (error) {
+ case 0:
+ break;
+ case EOPNOTSUPP:
+ gctl_error(req,
+ "Provider's %s metadata version %u is too new.\n"
+ "geli: The highest supported version is %u.",
+ prov, (unsigned int)md.md_version, G_ELI_VERSION);
+ goto out;
+ case EINVAL:
+ gctl_error(req, "Inconsistent provider's %s metadata.", prov);
+ goto out;
+ default:
+ gctl_error(req,
+ "Unexpected error while decoding provider's %s metadata: %s.",
+ prov, strerror(error));
goto out;
}
OpenPOWER on IntegriCloud