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-all mailing list