svn commit: r218734 - projects/graid/head/sys/geom/raid
Alexander Motin
mav at FreeBSD.org
Wed Feb 16 15:04:01 UTC 2011
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;
More information about the svn-src-projects
mailing list