Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 Jun 2007 20:42:36 GMT
From:      Ulf Lilleengen <lulf@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 122425 for review
Message-ID:  <200706272042.l5RKgacc016514@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=122425

Change 122425 by lulf@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;



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