summaryrefslogtreecommitdiffstats
path: root/sys/sys/osd.h
diff options
context:
space:
mode:
authorjamie <jamie@FreeBSD.org>2009-02-21 11:15:38 +0000
committerjamie <jamie@FreeBSD.org>2009-02-21 11:15:38 +0000
commit1631f0aa0ab88c016fb58469d9a616a487937c15 (patch)
tree0bbef0cc4b4641eea7fce090eee1e3b2a9ee2bcc /sys/sys/osd.h
parent42a7dd58e4032ee5f5b726aa625cd53514b2d6cb (diff)
downloadFreeBSD-src-1631f0aa0ab88c016fb58469d9a616a487937c15.zip
FreeBSD-src-1631f0aa0ab88c016fb58469d9a616a487937c15.tar.gz
Add support for methods to the OSD subsystem. Each object type has a
predefined set of methods, which are set in osd_register() and called via osd_call(). Currently, no methods are defined, though prison objects will have some in the future. Expand the locking from a single per-type mutex to three different kinds of locks (four if you include the requirement that the container (e.g. prison) be locked when getting/setting data). This clears up one existing issue, as well as others added by the method support. Approved by: bz (mentor)
Diffstat (limited to 'sys/sys/osd.h')
-rw-r--r--sys/sys/osd.h24
1 files changed, 18 insertions, 6 deletions
diff --git a/sys/sys/osd.h b/sys/sys/osd.h
index 281f580..c0f17a5 100644
--- a/sys/sys/osd.h
+++ b/sys/sys/osd.h
@@ -31,10 +31,15 @@
#include <sys/queue.h>
+/*
+ * Lock key:
+ * (c) container lock (e.g. jail's pr_mtx) and/or osd_object_lock
+ * (l) osd_list_lock
+ */
struct osd {
- u_int osd_nslots;
- void **osd_slots;
- LIST_ENTRY(osd) osd_next;
+ u_int osd_nslots; /* (c) */
+ void **osd_slots; /* (c) */
+ LIST_ENTRY(osd) osd_next; /* (l) */
};
#ifdef _KERNEL
@@ -46,18 +51,21 @@ struct osd {
#define OSD_LAST OSD_JAIL
typedef void (*osd_destructor_t)(void *value);
+typedef int (*osd_method_t)(void *obj, void *data);
-int osd_register(u_int type, osd_destructor_t destructor);
+int osd_register(u_int type, osd_destructor_t destructor,
+ osd_method_t *methods);
void osd_deregister(u_int type, u_int slot);
int osd_set(u_int type, struct osd *osd, u_int slot, void *value);
void *osd_get(u_int type, struct osd *osd, u_int slot);
void osd_del(u_int type, struct osd *osd, u_int slot);
+int osd_call(u_int type, u_int method, void *obj, void *data);
void osd_exit(u_int type, struct osd *osd);
#define osd_thread_register(destructor) \
- osd_register(OSD_THREAD, (destructor))
+ osd_register(OSD_THREAD, (destructor), NULL)
#define osd_thread_deregister(slot) \
osd_deregister(OSD_THREAD, (slot))
#define osd_thread_set(td, slot, value) \
@@ -68,11 +76,13 @@ void osd_exit(u_int type, struct osd *osd);
KASSERT((td) == curthread, ("Not curthread.")); \
osd_del(OSD_THREAD, &(td)->td_osd, (slot)); \
} while (0)
+#define osd_thread_call(td, method, data) \
+ osd_call(OSD_THREAD, (method), (td), (data))
#define osd_thread_exit(td) \
osd_exit(OSD_THREAD, &(td)->td_osd)
#define osd_jail_register(destructor) \
- osd_register(OSD_JAIL, (destructor))
+ osd_register(OSD_JAIL, (destructor), NULL)
#define osd_jail_deregister(slot) \
osd_deregister(OSD_JAIL, (slot))
#define osd_jail_set(pr, slot, value) \
@@ -81,6 +91,8 @@ void osd_exit(u_int type, struct osd *osd);
osd_get(OSD_JAIL, &(pr)->pr_osd, (slot))
#define osd_jail_del(pr, slot) \
osd_del(OSD_JAIL, &(pr)->pr_osd, (slot))
+#define osd_jail_call(pr, method, data) \
+ osd_call(OSD_JAIL, (method), (pr), (data))
#define osd_jail_exit(pr) \
osd_exit(OSD_JAIL, &(pr)->pr_osd)
OpenPOWER on IntegriCloud