svn commit: r226722 - head/sbin/geom/class/eli
Pawel Jakub Dawidek
pjd at FreeBSD.org
Tue Oct 25 07:56:28 UTC 2011
Author: pjd
Date: Tue Oct 25 07:56:27 2011
New Revision: 226722
URL: http://svn.freebsd.org/changeset/base/226722
Log:
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 at gmail.com>
MFC after: 3 days
Modified:
head/sbin/geom/class/eli/geom_eli.c
Modified: head/sbin/geom/class/eli/geom_eli.c
==============================================================================
--- head/sbin/geom/class/eli/geom_eli.c Tue Oct 25 07:48:53 2011 (r226721)
+++ head/sbin/geom/class/eli/geom_eli.c Tue Oct 25 07:56:27 2011 (r226722)
@@ -594,8 +594,23 @@ eli_metadata_read(struct gctl_req *req,
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;
}
More information about the svn-src-head
mailing list