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>