svn commit: r301364 - stable/10/sys/dev/sfxge/common

Andrew Rybchenko arybchik at FreeBSD.org
Sat Jun 4 16:26:27 UTC 2016


Author: arybchik
Date: Sat Jun  4 16:26:25 2016
New Revision: 301364
URL: https://svnweb.freebsd.org/changeset/base/301364

Log:
  MFC r299903
  
  sfxge(4): cleanup: make TLV scans quieter
  
  Find end of segments in a more direct way that avoids an error report at
  the terminator.
  
  Submitted by:   Richard Houldsworth <rhouldsworth at solarflare.com>
  Sponsored by:   Solarflare Communications, Inc.

Modified:
  stable/10/sys/dev/sfxge/common/ef10_nvram.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/sfxge/common/ef10_nvram.c
==============================================================================
--- stable/10/sys/dev/sfxge/common/ef10_nvram.c	Sat Jun  4 16:25:18 2016	(r301363)
+++ stable/10/sys/dev/sfxge/common/ef10_nvram.c	Sat Jun  4 16:26:25 2016	(r301364)
@@ -901,6 +901,7 @@ ef10_nvram_buffer_find_end(
 	// Read to end of partition
 	tlv_cursor_t cursor;
 	efx_rc_t rc;
+	uint32_t *segment_used;
 
 	if ((rc = tlv_init_cursor_from_size(&cursor, (uint8_t *)bufferp,
 			buffer_size)) != 0) {
@@ -908,10 +909,31 @@ ef10_nvram_buffer_find_end(
 		goto fail1;
 	}
 
-	if ((rc = tlv_require_end(&cursor)) != 0)
-		goto fail2;
+	segment_used = cursor.block;
 
-	*endp = byte_offset(tlv_last_segment_end(&cursor)+1, cursor.block);
+	/*
+	 * Go through each segment and check that it has an end tag. If there
+	 * is no end tag then the previous segment was the last valid one,
+	 * so return the used space including that end tag.
+	 */
+	while (tlv_tag(&cursor) == TLV_TAG_PARTITION_HEADER) {
+		if (tlv_require_end(&cursor) != 0) {
+			if (segment_used == cursor.block) {
+				/*
+				 * First segment is corrupt, so there is
+				 * no valid data in partition.
+				 */
+				rc = EINVAL;
+				goto fail2;
+			}
+			break;
+		}
+		segment_used = cursor.end + 1;
+
+		cursor.current = segment_used;
+	}
+	/* Return space used (including the END tag) */
+	*endp = (segment_used - cursor.block) * sizeof (uint32_t);
 
 	return (0);
 


More information about the svn-src-all mailing list