PERFORCE change 121639 for review

Ulf Lilleengen lulf at FreeBSD.org
Thu Jun 14 16:46:36 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=121639

Change 121639 by lulf at lulf_carrot on 2007/06/14 16:46:24

	- Fix many bugs i introduced when refractoring my sync code without
	  looking over it.

Affected files ...

.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_init.c#7 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_volume.c#4 edit

Differences ...

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_init.c#7 (text+ko) ====

@@ -214,7 +214,7 @@
 		p->flags |= GV_PLEX_SYNCING;
 		printf("VINUM: starting sync of plex %s\n", p->name);
 		error = gv_sync_request(up, p, 0, GV_DFLT_SYNCSIZE, BIO_READ,
-		    g_malloc(GV_DFLT_SYNCSIZE, M_WAITOK));
+		    NULL);
 		if (error) {
 			printf("VINUM: error syncing plex %s\n", p->name);
 			break;

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_volume.c#4 (text+ko) ====

@@ -183,21 +183,33 @@
 
 	g_topology_assert_not();
 
+	err = 0;
 	from = bp->bio_caller2;
 	v = to->vol_sc;
 
-	err = gv_sync_request(from, to, bp->bio_offset, bp->bio_length,
-	    bp->bio_cmd, bp->bio_data);
-	if (err) {
+	/* If it was a read, write it. */
+	if (bp->bio_cmd == BIO_READ) {
+		err = gv_sync_request(from, to, bp->bio_offset, bp->bio_length,
+	    	    BIO_WRITE, bp->bio_data);
+	/* If it was a write, read the next one. */
+	} else if (bp->bio_cmd == BIO_WRITE) {
 		if (bp->bio_cflags & GV_BIO_MALLOC)
 			g_free(bp->bio_data);
-		g_destroy_bio(bp);
+		/* If we're finished, clean up. */
+		if (bp->bio_offset + bp->bio_length >= from->size) {
+			printf("VINUM: syncing of %s from %s completed\n",
+			    to->name, from->name);
+			to->flags &= ~GV_PLEX_SYNCING;
+		} else {
+			err = gv_sync_request(from, to, bp->bio_offset +
+			    bp->bio_length, bp->bio_length, BIO_READ, NULL);
+		}
+	}
+	g_destroy_bio(bp);
+	if (err) {
+		printf("VINUM: error syncing plexes: error code %d\n", err);
 		return;
 	}
-	/* Free data if we're writing and destroy bio. */
-	if (bp->bio_cmd == BIO_WRITE && bp->bio_cflags & GV_BIO_MALLOC)
-		g_free(bp->bio_data);
-	g_destroy_bio(bp);
 
 	/* Check if all plexes are synced, and lower refcounts. */
 	g_topology_lock();
@@ -228,34 +240,15 @@
 	bp->bio_done = gv_done;
 	bp->bio_cflags |= GV_BIO_SYNCREQ;
 	bp->bio_offset = offset;
-	bp->bio_caller2 = to; /* Reverse the caller. */
-
-	/* If it was a read, write it to the destination. */
-	if (type == BIO_READ) {
-		/*printf("We just read %s at %jd, and now write %s at %jd\n",
-		    to->name, offset, from->name, offset);*/
-		bp->bio_cmd = BIO_WRITE;
-		bp->bio_data = data;
-	/* If it was a write, read the next one. */
-	} else if (type == BIO_WRITE) {
-		bp->bio_cmd = BIO_READ;
-		bp->bio_offset += bp->bio_length;
-		bp->bio_data = g_malloc(bp->bio_length, M_WAITOK);
-		bp->bio_cflags |= GV_BIO_MALLOC; 
-
-		/*printf("We just wrote %s at %jd, and now read %s at %jd\n",
-		    to->name, bp->bio_offset, from->name, bp->bio_offset);
-		*/
-		/* If we're finished, clean up. */
-	if (bp->bio_offset >= from->size) {
-			printf("VINUM: syncing of %s from %s completed\n",
-			    to->name, from->name);
-			to->flags &= ~GV_PLEX_SYNCING;
-			return (0);
-		}
+	bp->bio_caller2 = to;
+	bp->bio_cmd = type;
+	if (data == NULL) {
+		data = g_malloc(length, M_WAITOK);
+		bp->bio_cflags |= GV_BIO_MALLOC;
 	}
+	bp->bio_data = data;
 
-/*	printf("Sending next bio: ");
+/*	printf("Sending next bio:\n ");
 	g_print_bio(bp);
 	printf("\n");*/
 	/* Send down next. */


More information about the p4-projects mailing list