Date: Tue, 4 Oct 2011 16:52:00 +0000 (UTC) From: "Lev A. Serebryakov" <lev@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r225986 - in projects/geom-events/sys: conf geom Message-ID: <201110041652.p94Gq0XE066442@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: lev (ports committer) Date: Tue Oct 4 16:51:59 2011 New Revision: 225986 URL: http://svn.freebsd.org/changeset/base/225986 Log: Add g_notify_* wrappers around devctl_notify(). Added: projects/geom-events/sys/geom/geom_notify.c Modified: projects/geom-events/sys/conf/files projects/geom-events/sys/geom/geom.h Modified: projects/geom-events/sys/conf/files ============================================================================== --- projects/geom-events/sys/conf/files Tue Oct 4 16:48:57 2011 (r225985) +++ projects/geom-events/sys/conf/files Tue Oct 4 16:51:59 2011 (r225986) @@ -2191,6 +2191,7 @@ geom/geom_kern.c standard geom/geom_map.c optional geom_map geom/geom_mbr.c optional geom_mbr geom/geom_mbr_enc.c optional geom_mbr +geom/geom_notify.c standard geom/geom_pc98.c optional geom_pc98 geom/geom_pc98_enc.c optional geom_pc98 geom/geom_redboot.c optional geom_redboot Modified: projects/geom-events/sys/geom/geom.h ============================================================================== --- projects/geom-events/sys/geom/geom.h Tue Oct 4 16:48:57 2011 (r225985) +++ projects/geom-events/sys/geom/geom.h Tue Oct 4 16:51:59 2011 (r225986) @@ -393,4 +393,19 @@ struct g_class *gctl_get_class(struct gc struct g_geom *gctl_get_geom(struct gctl_req *req, struct g_class *mpr, char const *arg); struct g_provider *gctl_get_provider(struct gctl_req *req, char const *arg); +/* geom_notify.c */ + +#ifdef _KERNEL + +#define G_NOTIFY_DISCONNECT_FIXABLE 'F' +#define G_NOTIFY_DISCONNECT_ALIVE 'A' +#define G_NOTIFY_DISCONNECT_DEAD 'D' +#define G_NOTIFY_DISCONNECT_UNKNOWN '?' +void g_notify_disconnect(struct g_provider *pp, struct g_consumer *cp, char state); +void g_notify_sync_start(struct g_provider *pp); +void g_notify_sync_stop(struct g_provider *pp, boolean_t complete); +void g_notify_destroyed(struct g_provider *pp); + +#endif /* _KERNEL */ + #endif /* _GEOM_GEOM_H_ */ Added: projects/geom-events/sys/geom/geom_notify.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/geom-events/sys/geom/geom_notify.c Tue Oct 4 16:51:59 2011 (r225986) @@ -0,0 +1,129 @@ +/*- + * Copyright (c) 2011 Lev Serebryakov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <sys/param.h> +#include <sys/ctype.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/bus.h> +#include <sys/malloc.h> +#include <sys/bio.h> +#include <sys/ktr.h> +#include <sys/proc.h> +#include <sys/stack.h> +#include <sys/errno.h> +#include <machine/stdarg.h> +#include <geom/geom.h> +#include <geom/geom_int.h> + +#include <vm/uma.h> + +static void +g_devctl_notify(struct g_provider *pp, const char *event, const char *format, ...) +{ + char *full_data; + char *additional_data; + char *subsystem; + va_list args; + int len; + int i; + + subsystem = g_malloc(strlen(pp->geom->class->name) + 1, M_WAITOK); + if (subsystem == NULL) + return; + for (i = 0; pp->geom->class->name[i]; i++) + subsystem[i] = tolower(pp->geom->class->name[i]); + subsystem[i] = 0; + + if (format != NULL) { + additional_data = g_malloc(1024, M_WAITOK); + if (additional_data == NULL) { + g_free(subsystem); + return; + } + va_start(args, format); + len = vsnprintf(additional_data, 1024, format, args); + va_end(args); + } else { + additional_data = NULL; + len = 0; + } + + /* Add more space for mandatory arguments, space and zero */ + len += sizeof("geom=") + strlen(pp->geom->name) + + sizeof("provider=") + strlen(pp->name) + 2; + full_data = g_malloc(len, M_WAITOK); + if (full_data == NULL) { + g_free(subsystem); + if (additional_data != NULL) + g_free(additional_data); + return; + } + + if (additional_data != NULL) + snprintf(full_data, len, "geom=%s provider=%s %s", + pp->geom->name, pp->name, additional_data); + else + snprintf(full_data, len, "geom=%s provider=%s", + pp->geom->name, pp->name); + + devctl_notify("GEOM", subsystem, event, full_data); + g_free(subsystem); + if (additional_data != NULL) + g_free(additional_data); + g_free(full_data); +} + + +void +g_notify_disconnect(struct g_provider *pp, struct g_consumer *cp, char state) +{ + g_devctl_notify(pp, "DISCONNECT", "disk=%s state=%c", + (cp != NULL && cp->provider != NULL && cp->provider->name != NULL)? + cp->provider->name:"[unknown]", + state); +} + +void +g_notify_sync_start(struct g_provider *pp) +{ + g_devctl_notify(pp, "SYNCSTART", NULL); +} + +void +g_notify_sync_stop(struct g_provider *pp, boolean_t complete) +{ + g_devctl_notify(pp, "SYNCSTOP", "complete=%c", complete?'Y':'N'); +} + +void +g_notify_destroyed(struct g_provider *pp) +{ + g_devctl_notify(pp, "DESTROYED", NULL); +}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201110041652.p94Gq0XE066442>