PERFORCE change 122425 for review
Ulf Lilleengen
lulf at FreeBSD.org
Wed Jun 27 20:42:38 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=122425
Change 122425 by lulf at lulf_carrot on 2007/06/27 20:42:09
- Convert 'rename' command to the new event system.
- Add new error codes for rename.
- Change use of some error codes.
- Add EVENT_RENAME_<TYPE> events.
Affected files ...
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.c#22 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.h#17 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_rename.c#2 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_state.c#15 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_subr.c#13 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_var.h#18 edit
Differences ...
==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.c#22 (text+ko) ====
@@ -522,6 +522,7 @@
struct gv_drive *d;
struct bio *bp;
int newstate, flags, err, rename;
+ char *newname;
off_t offset;
sc = arg;
@@ -746,6 +747,58 @@
"error code %d\n", s->name, err);
break;
+ case GV_EVENT_RENAME_VOL:
+ printf("VINUM: event 'rename'\n");
+ v = ev->arg1;
+ newname = ev->arg2;
+ flags = ev->arg3;
+ err = gv_rename_vol(sc, v, newname, flags);
+ if (err)
+ printf("VINUM: error renaming %s to %s:"
+ " error code %d\n", v->name,
+ newname, err);
+ g_free(newname);
+ break;
+
+ case GV_EVENT_RENAME_PLEX:
+ printf("VINUM: event 'rename'\n");
+ p = ev->arg1;
+ newname = ev->arg2;
+ flags = ev->arg3;
+ err = gv_rename_plex(sc, p, newname, flags);
+ if (err)
+ printf("VINUM: error renaming %s to %s:"
+ " error code %d\n", p->name,
+ newname, err);
+ g_free(newname);
+ break;
+
+ case GV_EVENT_RENAME_SD:
+ printf("VINUM: event 'rename'\n");
+ s = ev->arg1;
+ newname = ev->arg2;
+ flags = ev->arg3;
+ err = gv_rename_sd(sc, s, newname, flags);
+ if (err)
+ printf("VINUM: error renaming %s to %s:"
+ " error code %d\n", s->name,
+ newname, err);
+ g_free(newname);
+ break;
+
+ case GV_EVENT_RENAME_DRIVE:
+ printf("VINUM: event 'rename'\n");
+ d = ev->arg1;
+ newname = ev->arg2;
+ flags = ev->arg3;
+ err = gv_rename_drive(sc, d, newname, flags);
+ if (err)
+ printf("VINUM: error renaming %s to %s:"
+ " error code %d\n", d->name,
+ newname, err);
+ g_free(newname);
+ break;
+
case GV_EVENT_THREAD_EXIT:
printf("VINUM: event 'thread exit'\n");
g_free(ev);
==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum.h#17 (text+ko) ====
@@ -49,6 +49,10 @@
/* geom_vinum_rename.c */
void gv_rename(struct g_geom *, struct gctl_req *);
+int gv_rename_drive(struct gv_softc *, struct gv_drive *, char *, int);
+int gv_rename_plex(struct gv_softc *, struct gv_plex *, char *, int);
+int gv_rename_sd(struct gv_softc *, struct gv_sd *, char *, int);
+int gv_rename_vol(struct gv_softc *, struct gv_volume *, char *, int);
/* geom_vinum_rm.c */
void gv_remove(struct g_geom *, struct gctl_req *);
==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_rename.c#2 (text+ko) ====
@@ -42,15 +42,6 @@
#include <geom/vinum/geom_vinum.h>
#include <geom/vinum/geom_vinum_share.h>
-static int gv_rename_drive(struct gv_softc *, struct gctl_req *,
- struct gv_drive *, char *, int);
-static int gv_rename_plex(struct gv_softc *, struct gctl_req *,
- struct gv_plex *, char *, int);
-static int gv_rename_sd(struct gv_softc *, struct gctl_req *,
- struct gv_sd *, char *, int);
-static int gv_rename_vol(struct gv_softc *, struct gctl_req *,
- struct gv_volume *, char *, int);
-
void
gv_rename(struct g_geom *gp, struct gctl_req *req)
{
@@ -59,8 +50,8 @@
struct gv_plex *p;
struct gv_sd *s;
struct gv_drive *d;
- char *newname, *object;
- int err, *flags, type;
+ char *newname, *object, *name;
+ int *flags, type;
sc = gp->softc;
@@ -86,9 +77,9 @@
gctl_error(req, "unknown volume '%s'", object);
return;
}
- err = gv_rename_vol(sc, req, v, newname, *flags);
- if (err)
- return;
+ name = g_malloc(GV_MAXVOLNAME, M_WAITOK | M_ZERO);
+ strlcpy(name, newname, GV_MAXVOLNAME);
+ gv_post_event(sc, GV_EVENT_RENAME_VOL, v, name, *flags, 0);
break;
case GV_TYPE_PLEX:
p = gv_find_plex(sc, object);
@@ -96,9 +87,9 @@
gctl_error(req, "unknown plex '%s'", object);
return;
}
- err = gv_rename_plex(sc, req, p, newname, *flags);
- if (err)
- return;
+ name = g_malloc(GV_MAXPLEXNAME, M_WAITOK | M_ZERO);
+ strlcpy(name, newname, GV_MAXPLEXNAME);
+ gv_post_event(sc, GV_EVENT_RENAME_PLEX, p, name, *flags, 0);
break;
case GV_TYPE_SD:
s = gv_find_sd(sc, object);
@@ -106,9 +97,9 @@
gctl_error(req, "unknown subdisk '%s'", object);
return;
}
- err = gv_rename_sd(sc, req, s, newname, *flags);
- if (err)
- return;
+ name = g_malloc(GV_MAXSDNAME, M_WAITOK | M_ZERO);
+ strlcpy(name, newname, GV_MAXSDNAME);
+ gv_post_event(sc, GV_EVENT_RENAME_SD, s, name, *flags, 0);
break;
case GV_TYPE_DRIVE:
d = gv_find_drive(sc, object);
@@ -116,30 +107,28 @@
gctl_error(req, "unknown drive '%s'", object);
return;
}
- err = gv_rename_drive(sc, req, d, newname, *flags);
- if (err)
- return;
+ name = g_malloc(GV_MAXDRIVENAME, M_WAITOK | M_ZERO);
+ strlcpy(name, newname, GV_MAXDRIVENAME);
+ gv_post_event(sc, GV_EVENT_RENAME_DRIVE, d, name, *flags, 0);
break;
default:
gctl_error(req, "unknown object '%s'", object);
return;
}
-
- gv_save_config(sc);
}
-static int
-gv_rename_drive(struct gv_softc *sc, struct gctl_req *req, struct gv_drive *d,
- char *newname, int flags)
+int
+gv_rename_drive(struct gv_softc *sc, struct gv_drive *d, char *newname,
+ int flags)
{
struct gv_sd *s;
g_topology_assert();
KASSERT(d != NULL, ("gv_rename_drive: NULL d"));
- if (gv_object_type(sc, newname) != -1) {
- gctl_error(req, "drive name '%s' already in use", newname);
- return (-1);
+ if (gv_object_type(sc, newname) != GV_ERR_NOTFOUND) {
+ printf("VINUM: drive name '%s' already in use\n", newname);
+ return (GV_ERR_NAMETAKEN);
}
strncpy(d->name, newname, GV_MAXDRIVENAME);
@@ -150,9 +139,8 @@
return (0);
}
-static int
-gv_rename_plex(struct gv_softc *sc, struct gctl_req *req, struct gv_plex *p,
- char *newname, int flags)
+int
+gv_rename_plex(struct gv_softc *sc, struct gv_plex *p, char *newname, int flags)
{
struct gv_sd *s;
char *plexnum, *plexnump, *oldplex, *oldplexp;
@@ -164,9 +152,9 @@
err = 0;
- if (gv_object_type(sc, newname) != -1) {
- gctl_error(req, "plex name '%s' already in use", newname);
- return (-1);
+ if (gv_object_type(sc, newname) != GV_ERR_NOTFOUND) {
+ printf("VINUM: plex name '%s' already in use\n", newname);
+ return (GV_ERR_NAMETAKEN);
}
/* Needed for sanity checking. */
@@ -187,15 +175,15 @@
strsep(&oldplexp, ".");
strsep(&plexnump, ".");
if (plexnump == NULL || *plexnump == '\0') {
- gctl_error(req, "proposed plex name '%s' is not a valid plex "
- "name", newname);
- err = -1;
+ printf("VINUM: proposed plex name '%s' is not a valid plex "
+ "name\n", newname);
+ err = GV_ERR_INVNAME;
goto failure;
}
if (strcmp(oldplexp, plexnump)) {
- gctl_error(req, "current and proposed plex numbers (%s, %s) "
- "do not match", plexnump, oldplexp);
- err = -1;
+ printf("VINUM: current and proposed plex numbers (%s, %s) "
+ "do not match\n", plexnump, oldplexp);
+ err = GV_ERR_INVNAME;
goto failure;
}
@@ -218,7 +206,7 @@
strsep(&oldsdp, ".");
strsep(&oldsdp, ".");
snprintf(newsd, GV_MAXSDNAME, "%s.%s", p->name, oldsdp);
- err = gv_rename_sd(sc, req, s, newsd, flags);
+ err = gv_rename_sd(sc, s, newsd, flags);
g_free(newsd);
g_free(oldsd);
if (err)
@@ -238,9 +226,8 @@
* since there are no structures below a subdisk. Similarly, we don't have to
* clean up any references elsewhere to the subdisk's name.
*/
-static int
-gv_rename_sd(struct gv_softc *sc, struct gctl_req *req, struct gv_sd *s,
- char * newname, int flags)
+int
+gv_rename_sd(struct gv_softc *sc, struct gv_sd *s, char *newname, int flags)
{
char *new, *newp, *old, *oldp;
int err;
@@ -250,9 +237,9 @@
err = 0;
- if (gv_object_type(sc, newname) != -1) {
- gctl_error(req, "subdisk name %s already in use", newname);
- return (-1);
+ if (gv_object_type(sc, newname) != GV_ERR_NOTFOUND) {
+ printf("VINUM: subdisk name %s already in use\n", newname);
+ return (GV_ERR_NAMETAKEN);
}
/* Needed for sanity checking. */
@@ -274,22 +261,22 @@
strsep(&oldp, ".");
strsep(&newp, ".");
if (newp == NULL || *newp == '\0') {
- gctl_error(req, "proposed sd name '%s' is not a valid sd name",
+ printf("VINUM: proposed sd name '%s' is not a valid sd name\n",
newname);
- err = -1;
+ err = GV_ERR_INVNAME;
goto fail;
}
strsep(&newp, ".");
if (newp == NULL || *newp == '\0') {
- gctl_error(req, "proposed sd name '%s' is not a valid sd name",
+ printf("VINUM: proposed sd name '%s' is not a valid sd name\n",
newname);
- err = -1;
+ err = GV_ERR_INVNAME;
goto fail;
}
if (strcmp(newp, oldp)) {
- gctl_error(req, "current and proposed sd numbers (%s, %s) do "
- "not match", oldp, newp);
- err = -1;
+ printf("VINUM: current and proposed sd numbers (%s, %s) do "
+ "not match\n", oldp, newp);
+ err = GV_ERR_INVNAME;
goto fail;
}
@@ -302,9 +289,9 @@
return (err);
}
-static int
-gv_rename_vol(struct gv_softc *sc, struct gctl_req *req, struct gv_volume *v,
- char *newname, int flags)
+int
+gv_rename_vol(struct gv_softc *sc, struct gv_volume *v, char *newname,
+ int flags)
{
struct gv_plex *p;
char *new, *old, *oldp;
@@ -313,9 +300,9 @@
g_topology_assert();
KASSERT(v != NULL, ("gv_rename_vol: NULL v"));
- if (gv_object_type(sc, newname) != -1) {
- gctl_error(req, "volume name %s already in use", newname);
- return (-1);
+ if (gv_object_type(sc, newname) != GV_ERR_NOTFOUND) {
+ printf("VINUM: volume name %s already in use", newname);
+ return (GV_ERR_NAMETAKEN);
}
/* Rename the volume. */
@@ -335,7 +322,7 @@
*/
strsep(&oldp, ".");
snprintf(new, GV_MAXPLEXNAME, "%s.%s", v->name, oldp);
- err = gv_rename_plex(sc, req, p, new, flags);
+ err = gv_rename_plex(sc, p, new, flags);
g_free(new);
g_free(old);
if (err)
==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_state.c#15 (text+ko) ====
@@ -117,8 +117,6 @@
gctl_error(req, "unknown object '%s'", obj);
break;
}
-
- return;
}
/* Update drive state; return 0 if the state changes, otherwise error. */
==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_subr.c#13 (text+ko) ====
@@ -936,7 +936,7 @@
return (GV_TYPE_DRIVE);
}
- return (GV_ERR_INVTYPE);
+ return (GV_ERR_NOTFOUND);
}
void
==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_var.h#18 (text+ko) ====
@@ -131,6 +131,7 @@
#define GV_ERR_NAMETAKEN (-10) /* Object name is taken. */
#define GV_ERR_NOSPACE (-11) /* No space left on drive/subdisk. */
#define GV_ERR_BADOFFSET (-12) /* Invalid offset specified. */
+#define GV_ERR_INVNAME (-13) /* Invalid object name. */
/*
* hostname is 256 bytes long, but we don't need to shlep multiple copies in
@@ -199,6 +200,10 @@
#define GV_EVENT_ATTACH_SD 23
#define GV_EVENT_DETACH_PLEX 24
#define GV_EVENT_DETACH_SD 25
+#define GV_EVENT_RENAME_VOL 26
+#define GV_EVENT_RENAME_PLEX 27
+#define GV_EVENT_RENAME_SD 28
+#define GV_EVENT_RENAME_DRIVE 29
struct gv_event {
int type;
More information about the p4-projects
mailing list