Date: Tue, 4 Oct 2011 16:47:18 +0000 (UTC) From: "Lev A. Serebryakov" <lev@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r225984 - in projects/geom-events: sbin/geom/class/raid3 sys/geom/raid3 Message-ID: <201110041647.p94GlIo3066146@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: lev (ports committer) Date: Tue Oct 4 16:47:18 2011 New Revision: 225984 URL: http://svn.freebsd.org/changeset/base/225984 Log: Locally fix kern/160562: Allow to insert new component to geom_raid3 without specifying number. Now "geom_raid3" requires "-n <number>" argument for "insert" command, which insert new component instead of removed (or failed) one. It is not convient in most cases (one lost component). This patch allows not to specify component number. In such case new component is added instead of first missed component. Modified: projects/geom-events/sbin/geom/class/raid3/geom_raid3.c projects/geom-events/sbin/geom/class/raid3/graid3.8 projects/geom-events/sys/geom/raid3/g_raid3_ctl.c Modified: projects/geom-events/sbin/geom/class/raid3/geom_raid3.c ============================================================================== --- projects/geom-events/sbin/geom/class/raid3/geom_raid3.c Tue Oct 4 15:06:11 2011 (r225983) +++ projects/geom-events/sbin/geom/class/raid3/geom_raid3.c Tue Oct 4 16:47:18 2011 (r225984) @@ -76,10 +76,10 @@ struct g_command class_commands[] = { { "insert", G_FLAG_VERBOSE, NULL, { { 'h', "hardcode", NULL, G_TYPE_BOOL }, - { 'n', "number", NULL, G_TYPE_NUMBER }, + { 'n', "number", G_VAL_OPTIONAL, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-hv] <-n number> name prov" + "[-hv] [-n number] name prov" }, { "label", G_FLAG_VERBOSE, raid3_main, { Modified: projects/geom-events/sbin/geom/class/raid3/graid3.8 ============================================================================== --- projects/geom-events/sbin/geom/class/raid3/graid3.8 Tue Oct 4 15:06:11 2011 (r225983) +++ projects/geom-events/sbin/geom/class/raid3/graid3.8 Tue Oct 4 16:47:18 2011 (r225984) @@ -53,7 +53,7 @@ .Nm .Cm insert .Op Fl hv -.Fl n Ar number +.Op Fl n Ar number .Ar name .Ar prov .Nm @@ -171,6 +171,8 @@ Add the given component to the existing removed previously with the .Cm remove command or if one component is missing and will not be connected again. +If no number is given, the new component will be added instead of the first +missed component. .Pp Additional options include: .Bl -tag -width ".Fl h" Modified: projects/geom-events/sys/geom/raid3/g_raid3_ctl.c ============================================================================== --- projects/geom-events/sys/geom/raid3/g_raid3_ctl.c Tue Oct 4 15:06:11 2011 (r225983) +++ projects/geom-events/sys/geom/raid3/g_raid3_ctl.c Tue Oct 4 16:47:18 2011 (r225984) @@ -404,7 +404,7 @@ g_raid3_ctl_insert(struct gctl_req *req, u_char *sector; off_t compsize; intmax_t *no; - int *hardcode, *nargs, error; + int *hardcode, *nargs, error, autono; nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs)); if (nargs == NULL) { @@ -425,11 +425,10 @@ g_raid3_ctl_insert(struct gctl_req *req, gctl_error(req, "No 'arg%u' argument.", 1); return; } - no = gctl_get_paraml(req, "number", sizeof(*no)); - if (no == NULL) { - gctl_error(req, "No '%s' argument.", "no"); - return; - } + if (gctl_get_param(req, "number", NULL) != NULL) + no = gctl_get_paraml(req, "number", sizeof(*no)); + else + no = NULL; if (strncmp(name, "/dev/", 5) == 0) name += 5; g_topology_lock(); @@ -465,16 +464,28 @@ g_raid3_ctl_insert(struct gctl_req *req, gctl_error(req, "No such device: %s.", name); goto end; } - if (*no >= sc->sc_ndisks) { - sx_xunlock(&sc->sc_lock); - gctl_error(req, "Invalid component number."); - goto end; - } - disk = &sc->sc_disks[*no]; - if (disk->d_state != G_RAID3_DISK_STATE_NODISK) { - sx_xunlock(&sc->sc_lock); - gctl_error(req, "Component %jd is already connected.", *no); - goto end; + if (no != NULL) { + if (*no >= sc->sc_ndisks) { + sx_xunlock(&sc->sc_lock); + gctl_error(req, "Invalid component number."); + goto end; + } + disk = &sc->sc_disks[*no]; + if (disk->d_state != G_RAID3_DISK_STATE_NODISK) { + sx_xunlock(&sc->sc_lock); + gctl_error(req, "Component %jd is already connected.", *no); + goto end; + } + } else { + disk = NULL; + for (autono = 0; autono < sc->sc_ndisks && disk == NULL; autono++) + if (sc->sc_disks[autono].d_state == G_RAID3_DISK_STATE_NODISK) + disk = &sc->sc_disks[autono]; + if (disk == NULL) { + sx_xunlock(&sc->sc_lock); + gctl_error(req, "No unconnected components."); + goto end; + } } if (((sc->sc_sectorsize / (sc->sc_ndisks - 1)) % pp->sectorsize) != 0) { sx_xunlock(&sc->sc_lock);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201110041647.p94GlIo3066146>