diff options
author | Pawel Jakub Dawidek <pjd@FreeBSD.org> | 2011-10-25 07:56:27 +0000 |
---|---|---|
committer | Pawel Jakub Dawidek <pjd@FreeBSD.org> | 2011-10-25 07:56:27 +0000 |
commit | 3bddbd0f3b6975abfeaf52734f52b8b36fe0aede (patch) | |
tree | 4ef31b9dbc013810605639d16883235f6d78212b /sbin | |
parent | e880ff00622ea1bd94211f99ce91fc46d22f9c17 (diff) | |
download | src-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.c | 40 |
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; } |