svn commit: r275503 - head/sys/geom/raid

Alexander Motin mav at FreeBSD.org
Fri Dec 5 10:23:20 UTC 2014


Author: mav
Date: Fri Dec  5 10:23:18 2014
New Revision: 275503
URL: https://svnweb.freebsd.org/changeset/base/275503

Log:
  Avoid unneeded malloc/memcpy/free if there is no metadata on disk.
  
  Submitted by:	Dmitry Luhtionov <dmitryluhtionov at gmail.com>
  MFC after:	2 weeks

Modified:
  head/sys/geom/raid/md_nvidia.c
  head/sys/geom/raid/md_sii.c

Modified: head/sys/geom/raid/md_nvidia.c
==============================================================================
--- head/sys/geom/raid/md_nvidia.c	Fri Dec  5 09:30:07 2014	(r275502)
+++ head/sys/geom/raid/md_nvidia.c	Fri Dec  5 10:23:18 2014	(r275503)
@@ -256,23 +256,24 @@ nvidia_meta_read(struct g_consumer *cp)
 		    pp->name, error);
 		return (NULL);
 	}
-	meta = malloc(sizeof(*meta), M_MD_NVIDIA, M_WAITOK);
-	memcpy(meta, buf, min(sizeof(*meta), pp->sectorsize));
-	g_free(buf);
+	meta = (struct nvidia_raid_conf *)buf;
 
 	/* Check if this is an NVIDIA RAID struct */
 	if (strncmp(meta->nvidia_id, NVIDIA_MAGIC, strlen(NVIDIA_MAGIC))) {
 		G_RAID_DEBUG(1, "NVIDIA signature check failed on %s", pp->name);
-		free(meta, M_MD_NVIDIA);
+		g_free(buf);
 		return (NULL);
 	}
 	if (meta->config_size > 128 ||
 	    meta->config_size < 30) {
 		G_RAID_DEBUG(1, "NVIDIA metadata size looks wrong: %d",
 		    meta->config_size);
-		free(meta, M_MD_NVIDIA);
+		g_free(buf);
 		return (NULL);
 	}
+	meta = malloc(sizeof(*meta), M_MD_NVIDIA, M_WAITOK);
+	memcpy(meta, buf, min(sizeof(*meta), pp->sectorsize));
+	g_free(buf);
 
 	/* Check metadata checksum. */
 	for (checksum = 0, ptr = (uint32_t *)meta,

Modified: head/sys/geom/raid/md_sii.c
==============================================================================
--- head/sys/geom/raid/md_sii.c	Fri Dec  5 09:30:07 2014	(r275502)
+++ head/sys/geom/raid/md_sii.c	Fri Dec  5 10:23:18 2014	(r275503)
@@ -277,15 +277,13 @@ sii_meta_read(struct g_consumer *cp)
 		    pp->name, error);
 		return (NULL);
 	}
-	meta = malloc(sizeof(*meta), M_MD_SII, M_WAITOK);
-	memcpy(meta, buf, min(sizeof(*meta), pp->sectorsize));
-	g_free(buf);
+	meta = (struct sii_raid_conf *)buf;
 
 	/* Check vendor ID. */
 	if (meta->vendor_id != 0x1095) {
 		G_RAID_DEBUG(1, "SiI vendor ID check failed on %s (0x%04x)",
 		    pp->name, meta->vendor_id);
-		free(meta, M_MD_SII);
+		g_free(buf);
 		return (NULL);
 	}
 
@@ -293,9 +291,12 @@ sii_meta_read(struct g_consumer *cp)
 	if (meta->version_major != 2) {
 		G_RAID_DEBUG(1, "SiI version check failed on %s (%d.%d)",
 		    pp->name, meta->version_major, meta->version_minor);
-		free(meta, M_MD_SII);
+		g_free(buf);
 		return (NULL);
 	}
+	meta = malloc(sizeof(*meta), M_MD_SII, M_WAITOK);
+	memcpy(meta, buf, min(sizeof(*meta), pp->sectorsize));
+	g_free(buf);
 
 	/* Check metadata checksum. */
 	for (checksum = 0, ptr = (uint16_t *)meta, i = 0; i <= 159; i++)


More information about the svn-src-all mailing list