aboutsummaryrefslogtreecommitdiff
path: root/sbin
diff options
context:
space:
mode:
authorPawel Jakub Dawidek <pjd@FreeBSD.org>2011-10-25 07:56:27 +0000
committerPawel Jakub Dawidek <pjd@FreeBSD.org>2011-10-25 07:56:27 +0000
commit3bddbd0f3b6975abfeaf52734f52b8b36fe0aede (patch)
tree4ef31b9dbc013810605639d16883235f6d78212b /sbin
parente880ff00622ea1bd94211f99ce91fc46d22f9c17 (diff)
downloadsrc-3bddbd0f3b6975abfeaf52734f52b8b36fe0aede.tar.gz
src-3bddbd0f3b6975abfeaf52734f52b8b36fe0aede.zip
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
Notes
Notes: svn path=/head/; revision=226722
Diffstat (limited to 'sbin')
-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 ca0c80be8bde..183b11ce86f5 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;
}