svn commit: r226010 - projects/geom-events/sys/geom/raid3

Lev A. Serebryakov lev at FreeBSD.org
Tue Oct 4 17:07:57 UTC 2011


Author: lev (ports committer)
Date: Tue Oct  4 17:07:56 2011
New Revision: 226010
URL: http://svn.freebsd.org/changeset/base/226010

Log:
    Add geom_notify_*() calls to geom_raid3.
  
    This is more than a trivial change.
  
    Replace calls with DISCONNECTED disk state with
  calls REMOVED disk state to all manual operations.

Modified:
  projects/geom-events/sys/geom/raid3/g_raid3.c
  projects/geom-events/sys/geom/raid3/g_raid3.h
  projects/geom-events/sys/geom/raid3/g_raid3_ctl.c

Modified: projects/geom-events/sys/geom/raid3/g_raid3.c
==============================================================================
--- projects/geom-events/sys/geom/raid3/g_raid3.c	Tue Oct  4 17:03:39 2011	(r226009)
+++ projects/geom-events/sys/geom/raid3/g_raid3.c	Tue Oct  4 17:07:56 2011	(r226010)
@@ -151,6 +151,8 @@ g_raid3_disk_state2str(int state)
 		return ("SYNCHRONIZING");
 	case G_RAID3_DISK_STATE_DISCONNECTED:
 		return ("DISCONNECTED");
+	case G_RAID3_DISK_STATE_REMOVE:
+		return ("REMOVE");
 	default:
 		return ("INVALID");
 	}
@@ -2275,6 +2277,8 @@ g_raid3_sync_start(struct g_raid3_softc 
 		else
 			g_io_request(bp, disk->d_sync.ds_consumer);
 	}
+
+	g_notify_sync_start(sc->sc_provider);
 }
 
 /*
@@ -2310,6 +2314,8 @@ g_raid3_sync_stop(struct g_raid3_softc *
 		G_RAID3_DEBUG(0, "Device %s: rebuilding provider %s stopped.",
 		    sc->sc_name, g_raid3_get_diskname(disk));
 	}
+	g_notify_sync_stop(sc->sc_provider, !type);
+
 	free(disk->d_sync.ds_bios, M_RAID3);
 	disk->d_sync.ds_bios = NULL;
 	cp = disk->d_sync.ds_consumer;
@@ -2621,8 +2627,10 @@ g_raid3_update_device(struct g_raid3_sof
 			return;
 		if (g_raid3_ndisks(sc, G_RAID3_DISK_STATE_ACTIVE) <
 		    sc->sc_ndisks - 1) {
-			if (sc->sc_provider != NULL)
+			if (sc->sc_provider != NULL) {
+				g_notify_destroyed(sc->sc_provider);
 				g_raid3_destroy_provider(sc);
+			}
 			sc->sc_flags |= G_RAID3_DEVICE_FLAG_DESTROY;
 			return;
 		}
@@ -2821,6 +2829,7 @@ again:
 		}
 		break;
 	case G_RAID3_DISK_STATE_DISCONNECTED:
+	case G_RAID3_DISK_STATE_REMOVE:
 		/*
 		 * Possible scenarios:
 		 * 1. Device wasn't running yet, but disk disappear.
@@ -2864,6 +2873,13 @@ again:
 		G_RAID3_DEBUG(0, "Device %s: provider %s disconnected.",
 		    sc->sc_name, g_raid3_get_diskname(disk));
 
+		/* Don't notify about manual destroy */
+		if (state == G_RAID3_DISK_STATE_DISCONNECTED)
+			g_notify_disconnect(sc->sc_provider, disk->d_consumer,
+				((g_raid3_ndisks(sc, -1) < sc->sc_ndisks)?
+					G_NOTIFY_DISCONNECT_DEAD:
+					G_NOTIFY_DISCONNECT_FIXABLE));
+
 		g_raid3_destroy_disk(disk);
 		break;
 	default:

Modified: projects/geom-events/sys/geom/raid3/g_raid3.h
==============================================================================
--- projects/geom-events/sys/geom/raid3/g_raid3.h	Tue Oct  4 17:03:39 2011	(r226009)
+++ projects/geom-events/sys/geom/raid3/g_raid3.h	Tue Oct  4 17:07:56 2011	(r226010)
@@ -136,7 +136,7 @@ struct g_raid3_device_sync {
 #define	G_RAID3_DISK_STATE_STALE		4
 #define	G_RAID3_DISK_STATE_SYNCHRONIZING	5
 #define	G_RAID3_DISK_STATE_DISCONNECTED		6
-#define	G_RAID3_DISK_STATE_DESTROY		7
+#define	G_RAID3_DISK_STATE_REMOVE		7
 struct g_raid3_disk {
 	u_int		 d_no;		/* Disk number. */
 	struct g_consumer *d_consumer;	/* Consumer. */

Modified: projects/geom-events/sys/geom/raid3/g_raid3_ctl.c
==============================================================================
--- projects/geom-events/sys/geom/raid3/g_raid3_ctl.c	Tue Oct  4 17:03:39 2011	(r226009)
+++ projects/geom-events/sys/geom/raid3/g_raid3_ctl.c	Tue Oct  4 17:07:56 2011	(r226010)
@@ -250,7 +250,7 @@ g_raid3_ctl_configure(struct gctl_req *r
 				 *      component will not be retasted.
 				 */
 				g_raid3_event_send(disk,
-				    G_RAID3_DISK_STATE_DISCONNECTED,
+				    G_RAID3_DISK_STATE_REMOVE,
 				    G_RAID3_EVENT_DONTWAIT);
 			}
 		}
@@ -317,7 +317,7 @@ g_raid3_ctl_rebuild(struct gctl_req *req
 	g_topology_lock();
 	error = g_raid3_read_metadata(disk->d_consumer, &md);
 	g_topology_unlock();
-	g_raid3_event_send(disk, G_RAID3_DISK_STATE_DISCONNECTED,
+	g_raid3_event_send(disk, G_RAID3_DISK_STATE_REMOVE,
 	    G_RAID3_EVENT_WAIT);
 	if (error != 0) {
 		gctl_error(req, "Cannot read metadata from %s.", pp->name);
@@ -592,7 +592,7 @@ g_raid3_ctl_remove(struct gctl_req *req,
 			    g_raid3_get_diskname(disk));
 		} else {
 			g_raid3_event_send(disk,
-			    G_RAID3_DISK_STATE_DISCONNECTED,
+			    G_RAID3_DISK_STATE_REMOVE,
 			    G_RAID3_EVENT_DONTWAIT);
 		}
 		break;


More information about the svn-src-projects mailing list