1185029Spjd/*- 2185029Spjd * Copyright (c) 2007 Pawel Jakub Dawidek <pjd@FreeBSD.org> 3185029Spjd * All rights reserved. 4185029Spjd * 5185029Spjd * Redistribution and use in source and binary forms, with or without 6185029Spjd * modification, are permitted provided that the following conditions 7185029Spjd * are met: 8185029Spjd * 1. Redistributions of source code must retain the above copyright 9185029Spjd * notice, this list of conditions and the following disclaimer. 10185029Spjd * 2. Redistributions in binary form must reproduce the above copyright 11185029Spjd * notice, this list of conditions and the following disclaimer in the 12185029Spjd * documentation and/or other materials provided with the distribution. 13185029Spjd * 14185029Spjd * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND 15185029Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16185029Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17185029Spjd * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE 18185029Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19185029Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20185029Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21185029Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22185029Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23185029Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24185029Spjd * SUCH DAMAGE. 25185029Spjd * 26185029Spjd * $FreeBSD$ 27185029Spjd */ 28185029Spjd 29185029Spjd#ifndef _SYS_OSD_H_ 30185029Spjd#define _SYS_OSD_H_ 31185029Spjd 32185029Spjd#include <sys/queue.h> 33185029Spjd 34188894Sjamie/* 35188894Sjamie * Lock key: 36188894Sjamie * (c) container lock (e.g. jail's pr_mtx) and/or osd_object_lock 37188894Sjamie * (l) osd_list_lock 38188894Sjamie */ 39185029Spjdstruct osd { 40188894Sjamie u_int osd_nslots; /* (c) */ 41188894Sjamie void **osd_slots; /* (c) */ 42188894Sjamie LIST_ENTRY(osd) osd_next; /* (l) */ 43185029Spjd}; 44185029Spjd 45185029Spjd#ifdef _KERNEL 46185029Spjd 47185029Spjd#define OSD_THREAD 0 48185029Spjd#define OSD_JAIL 1 49216615Slstewart#define OSD_KHELP 2 50185029Spjd 51185029Spjd#define OSD_FIRST OSD_THREAD 52216615Slstewart#define OSD_LAST OSD_KHELP 53185029Spjd 54185029Spjdtypedef void (*osd_destructor_t)(void *value); 55188894Sjamietypedef int (*osd_method_t)(void *obj, void *data); 56185029Spjd 57188894Sjamieint osd_register(u_int type, osd_destructor_t destructor, 58188894Sjamie osd_method_t *methods); 59185029Spjdvoid osd_deregister(u_int type, u_int slot); 60185029Spjd 61185029Spjdint osd_set(u_int type, struct osd *osd, u_int slot, void *value); 62185029Spjdvoid *osd_get(u_int type, struct osd *osd, u_int slot); 63185029Spjdvoid osd_del(u_int type, struct osd *osd, u_int slot); 64188894Sjamieint osd_call(u_int type, u_int method, void *obj, void *data); 65185029Spjd 66185029Spjdvoid osd_exit(u_int type, struct osd *osd); 67185029Spjd 68185029Spjd#define osd_thread_register(destructor) \ 69188894Sjamie osd_register(OSD_THREAD, (destructor), NULL) 70185029Spjd#define osd_thread_deregister(slot) \ 71185029Spjd osd_deregister(OSD_THREAD, (slot)) 72185029Spjd#define osd_thread_set(td, slot, value) \ 73185029Spjd osd_set(OSD_THREAD, &(td)->td_osd, (slot), (value)) 74185029Spjd#define osd_thread_get(td, slot) \ 75185029Spjd osd_get(OSD_THREAD, &(td)->td_osd, (slot)) 76185029Spjd#define osd_thread_del(td, slot) do { \ 77185029Spjd KASSERT((td) == curthread, ("Not curthread.")); \ 78185029Spjd osd_del(OSD_THREAD, &(td)->td_osd, (slot)); \ 79185029Spjd} while (0) 80188894Sjamie#define osd_thread_call(td, method, data) \ 81188894Sjamie osd_call(OSD_THREAD, (method), (td), (data)) 82185029Spjd#define osd_thread_exit(td) \ 83185029Spjd osd_exit(OSD_THREAD, &(td)->td_osd) 84185029Spjd 85191673Sjamie#define osd_jail_register(destructor, methods) \ 86191673Sjamie osd_register(OSD_JAIL, (destructor), (methods)) 87185029Spjd#define osd_jail_deregister(slot) \ 88185029Spjd osd_deregister(OSD_JAIL, (slot)) 89185029Spjd#define osd_jail_set(pr, slot, value) \ 90185029Spjd osd_set(OSD_JAIL, &(pr)->pr_osd, (slot), (value)) 91185029Spjd#define osd_jail_get(pr, slot) \ 92185029Spjd osd_get(OSD_JAIL, &(pr)->pr_osd, (slot)) 93185029Spjd#define osd_jail_del(pr, slot) \ 94185029Spjd osd_del(OSD_JAIL, &(pr)->pr_osd, (slot)) 95188894Sjamie#define osd_jail_call(pr, method, data) \ 96188894Sjamie osd_call(OSD_JAIL, (method), (pr), (data)) 97185029Spjd#define osd_jail_exit(pr) \ 98185029Spjd osd_exit(OSD_JAIL, &(pr)->pr_osd) 99185029Spjd 100185029Spjd#endif /* _KERNEL */ 101185029Spjd 102185029Spjd#endif /* !_SYS_OSD_H_ */ 103