Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 Feb 2011 15:04:00 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r218734 - projects/graid/head/sys/geom/raid
Message-ID:  <201102161504.p1GF40rR073752@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Wed Feb 16 15:04:00 2011
New Revision: 218734
URL: http://svn.freebsd.org/changeset/base/218734

Log:
  Add and use helper function opening disk by name.

Modified:
  projects/graid/head/sys/geom/raid/g_raid.c
  projects/graid/head/sys/geom/raid/g_raid.h
  projects/graid/head/sys/geom/raid/md_intel.c
  projects/graid/head/sys/geom/raid/md_jmicron.c

Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c	Wed Feb 16 14:28:04 2011	(r218733)
+++ projects/graid/head/sys/geom/raid/g_raid.c	Wed Feb 16 15:04:00 2011	(r218734)
@@ -585,6 +585,32 @@ g_raid_get_subdisk(struct g_raid_volume 
 	return (NULL);
 }
 
+struct g_consumer *
+g_raid_open_consumer(struct g_raid_softc *sc, const char *name)
+{
+	struct g_consumer *cp;
+	struct g_provider *pp;
+
+	g_topology_assert();
+
+	if (strncmp(name, "/dev/", 5) == 0)
+		name += 5;
+	pp = g_provider_by_name(name);
+	if (pp == NULL)
+		return (NULL);
+	cp = g_new_consumer(sc->sc_geom);
+	if (g_attach(cp, pp) != 0) {
+		g_destroy_consumer(cp);
+		return (NULL);
+	}
+	if (g_access(cp, 1, 1, 1) != 0) {
+		g_detach(cp);
+		g_destroy_consumer(cp);
+		return (NULL);
+	}
+	return (cp);
+}
+
 static u_int
 g_raid_nrequests(struct g_raid_softc *sc, struct g_consumer *cp)
 {

Modified: projects/graid/head/sys/geom/raid/g_raid.h
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.h	Wed Feb 16 14:28:04 2011	(r218733)
+++ projects/graid/head/sys/geom/raid/g_raid.h	Wed Feb 16 15:04:00 2011	(r218734)
@@ -364,6 +364,8 @@ void g_raid_subdisk_iostart(struct g_rai
 int g_raid_subdisk_kerneldump(struct g_raid_subdisk *sd,
     void *virtual, vm_offset_t physical, off_t offset, size_t length);
 
+struct g_consumer *g_raid_open_consumer(struct g_raid_softc *sc,
+    const char *name);
 void g_raid_kill_consumer(struct g_raid_softc *sc, struct g_consumer *cp);
 
 void g_raid_report_disk_state(struct g_raid_disk *disk);

Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c	Wed Feb 16 14:28:04 2011	(r218733)
+++ projects/graid/head/sys/geom/raid/md_intel.c	Wed Feb 16 15:04:00 2011	(r218734)
@@ -1426,38 +1426,18 @@ g_raid_md_ctl_intel(struct g_raid_md_obj
 			if (strcmp(diskname, "NONE") == 0) {
 				cp = NULL;
 				pp = NULL;
-				goto makedisk;
-			}
-			if (strncmp(diskname, "/dev/", 5) == 0)
-				diskname += 5;
-			g_topology_lock();
-			pp = g_provider_by_name(diskname);
-			if (pp == NULL) {
-				gctl_error(req, "Provider '%s' not found.",
-				    diskname);
-				g_topology_unlock();
-				error = -7;
-				break;
-			}
-			cp = g_new_consumer(sc->sc_geom);
-			if (g_attach(cp, pp) != 0) {
-				gctl_error(req, "Can't attach provider '%s'.",
-				    diskname);
-				g_destroy_consumer(cp);
-				g_topology_unlock();
-				error = -7;
-				break;
-			}
-			if (g_access(cp, 1, 1, 1) != 0) {
-				gctl_error(req, "Can't open provider '%s'.",
-				    diskname);
-				g_detach(cp);
-				g_destroy_consumer(cp);
-				g_topology_unlock();
-				error = -7;
-				break;
+			} else {
+				g_topology_lock();
+				cp = g_raid_open_consumer(sc, diskname);
+				if (cp == NULL) {
+					gctl_error(req, "Can't open disk '%s'.",
+					    diskname);
+					g_topology_unlock();
+					error = -4;
+					break;
+				}
+				pp = cp->provider;
 			}
-makedisk:
 			pd = malloc(sizeof(*pd), M_MD_INTEL, M_WAITOK | M_ZERO);
 			pd->pd_disk_pos = i;
 			disk = g_raid_create_disk(sc);
@@ -1465,13 +1445,11 @@ makedisk:
 			disk->d_consumer = cp;
 			if (cp == NULL) {
 				strcpy(&pd->pd_disk_meta.serial[0], "NONE");
-				pd->pd_disk_meta.id = 0;
 				pd->pd_disk_meta.id = 0xffffffff;
 				pd->pd_disk_meta.flags = INTEL_F_ASSIGNED;
 				continue;
 			}
 			cp->private = disk;
-
 			g_topology_unlock();
 
 			error = g_raid_md_get_label(cp,
@@ -1948,37 +1926,18 @@ makedisk:
 				error = -3;
 				break;
 			}
-			if (strncmp(diskname, "/dev/", 5) == 0)
-				diskname += 5;
 
 			/* Try to find provider with specified name. */
 			g_topology_lock();
-			pp = g_provider_by_name(diskname);
-			if (pp == NULL) {
-				gctl_error(req, "Provider '%s' not found.",
+			cp = g_raid_open_consumer(sc, diskname);
+			if (cp == NULL) {
+				gctl_error(req, "Can't open disk '%s'.",
 				    diskname);
 				g_topology_unlock();
 				error = -4;
 				break;
 			}
-			cp = g_new_consumer(sc->sc_geom);
-			if (g_attach(cp, pp) != 0) {
-				gctl_error(req, "Can't attach provider '%s'.",
-				    diskname);
-				g_destroy_consumer(cp);
-				g_topology_unlock();
-				error = -5;
-				break;
-			}
-			if (g_access(cp, 1, 1, 1) != 0) {
-				gctl_error(req, "Can't open provider '%s'.",
-				    diskname);
-				g_detach(cp);
-				g_destroy_consumer(cp);
-				g_topology_unlock();
-				error = -6;
-				break;
-			}
+			pp = cp->provider;
 			g_topology_unlock();
 
 			/* Read disk serial. */

Modified: projects/graid/head/sys/geom/raid/md_jmicron.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_jmicron.c	Wed Feb 16 14:28:04 2011	(r218733)
+++ projects/graid/head/sys/geom/raid/md_jmicron.c	Wed Feb 16 15:04:00 2011	(r218734)
@@ -1085,38 +1085,18 @@ g_raid_md_ctl_jmicron(struct g_raid_md_o
 			if (strcmp(diskname, "NONE") == 0) {
 				cp = NULL;
 				pp = NULL;
-				goto makedisk;
-			}
-			if (strncmp(diskname, "/dev/", 5) == 0)
-				diskname += 5;
-			g_topology_lock();
-			pp = g_provider_by_name(diskname);
-			if (pp == NULL) {
-				gctl_error(req, "Provider '%s' not found.",
-				    diskname);
-				g_topology_unlock();
-				error = -7;
-				break;
-			}
-			cp = g_new_consumer(sc->sc_geom);
-			if (g_attach(cp, pp) != 0) {
-				gctl_error(req, "Can't attach provider '%s'.",
-				    diskname);
-				g_destroy_consumer(cp);
-				g_topology_unlock();
-				error = -7;
-				break;
-			}
-			if (g_access(cp, 1, 1, 1) != 0) {
-				gctl_error(req, "Can't open provider '%s'.",
-				    diskname);
-				g_detach(cp);
-				g_destroy_consumer(cp);
-				g_topology_unlock();
-				error = -7;
-				break;
+			} else {
+				g_topology_lock();
+				cp = g_raid_open_consumer(sc, diskname);
+				if (cp == NULL) {
+					gctl_error(req, "Can't open '%s'.",
+					    diskname);
+					g_topology_unlock();
+					error = -7;
+					break;
+				}
+				pp = cp->provider;
 			}
-makedisk:
 			pd = malloc(sizeof(*pd), M_MD_JMICRON, M_WAITOK | M_ZERO);
 			pd->pd_disk_pos = i;
 			pd->pd_disk_id = arc4random() & JMICRON_DISK_MASK;
@@ -1126,7 +1106,6 @@ makedisk:
 			if (cp == NULL)
 				continue;
 			cp->private = disk;
-
 			g_topology_unlock();
 
 			/* Read kernel dumping information. */
@@ -1359,38 +1338,18 @@ makedisk:
 				error = -3;
 				break;
 			}
-			if (strncmp(diskname, "/dev/", 5) == 0)
-				diskname += 5;
 
 			/* Try to find provider with specified name. */
 			g_topology_lock();
-			pp = g_provider_by_name(diskname);
-			if (pp == NULL) {
-				gctl_error(req, "Provider '%s' not found.",
+			cp = g_raid_open_consumer(sc, diskname);
+			if (cp == NULL) {
+				gctl_error(req, "Can't open disk '%s'.",
 				    diskname);
 				g_topology_unlock();
 				error = -4;
 				break;
 			}
-			cp = g_new_consumer(sc->sc_geom);
-			if (g_attach(cp, pp) != 0) {
-				gctl_error(req, "Can't attach provider '%s'.",
-				    diskname);
-				g_destroy_consumer(cp);
-				g_topology_unlock();
-				error = -5;
-				break;
-			}
-			if (g_access(cp, 1, 1, 1) != 0) {
-				gctl_error(req, "Can't open provider '%s'.",
-				    diskname);
-				g_detach(cp);
-				g_destroy_consumer(cp);
-				g_topology_unlock();
-				error = -6;
-				break;
-			}
-			g_topology_unlock();
+			pp = cp->provider;
 
 			pd = malloc(sizeof(*pd), M_MD_JMICRON, M_WAITOK | M_ZERO);
 			pd->pd_disk_pos = -3;
@@ -1402,6 +1361,7 @@ makedisk:
 			disk->d_consumer->private = disk;
 			disk->d_md_data = (void *)pd;
 			cp->private = disk;
+			g_topology_unlock();
 
 			/* Read kernel dumping information. */
 			disk->d_kd.offset = 0;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201102161504.p1GF40rR073752>