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); 62298661Scemvoid **osd_reserve(u_int slot); 63298661Scemint osd_set_reserved(u_int type, struct osd *osd, u_int slot, void **rsv, 64297422Sjamie void *value); 65298661Scemvoid osd_free_reserved(void **rsv); 66185029Spjdvoid *osd_get(u_int type, struct osd *osd, u_int slot); 67185029Spjdvoid osd_del(u_int type, struct osd *osd, u_int slot); 68188894Sjamieint osd_call(u_int type, u_int method, void *obj, void *data); 69185029Spjd 70185029Spjdvoid osd_exit(u_int type, struct osd *osd); 71185029Spjd 72185029Spjd#define osd_thread_register(destructor) \ 73188894Sjamie osd_register(OSD_THREAD, (destructor), NULL) 74185029Spjd#define osd_thread_deregister(slot) \ 75185029Spjd osd_deregister(OSD_THREAD, (slot)) 76185029Spjd#define osd_thread_set(td, slot, value) \ 77185029Spjd osd_set(OSD_THREAD, &(td)->td_osd, (slot), (value)) 78297422Sjamie#define osd_thread_set_reserved(td, slot, rsv, value) \ 79297422Sjamie osd_set_reserved(OSD_THREAD, &(td)->td_osd, (slot), (rsv), (value)) 80185029Spjd#define osd_thread_get(td, slot) \ 81185029Spjd osd_get(OSD_THREAD, &(td)->td_osd, (slot)) 82185029Spjd#define osd_thread_del(td, slot) do { \ 83185029Spjd KASSERT((td) == curthread, ("Not curthread.")); \ 84185029Spjd osd_del(OSD_THREAD, &(td)->td_osd, (slot)); \ 85185029Spjd} while (0) 86188894Sjamie#define osd_thread_call(td, method, data) \ 87188894Sjamie osd_call(OSD_THREAD, (method), (td), (data)) 88185029Spjd#define osd_thread_exit(td) \ 89185029Spjd osd_exit(OSD_THREAD, &(td)->td_osd) 90185029Spjd 91191673Sjamie#define osd_jail_register(destructor, methods) \ 92191673Sjamie osd_register(OSD_JAIL, (destructor), (methods)) 93185029Spjd#define osd_jail_deregister(slot) \ 94185029Spjd osd_deregister(OSD_JAIL, (slot)) 95185029Spjd#define osd_jail_set(pr, slot, value) \ 96185029Spjd osd_set(OSD_JAIL, &(pr)->pr_osd, (slot), (value)) 97297422Sjamie#define osd_jail_set_reserved(pr, slot, rsv, value) \ 98297422Sjamie osd_set_reserved(OSD_JAIL, &(pr)->pr_osd, (slot), (rsv), (value)) 99185029Spjd#define osd_jail_get(pr, slot) \ 100185029Spjd osd_get(OSD_JAIL, &(pr)->pr_osd, (slot)) 101185029Spjd#define osd_jail_del(pr, slot) \ 102185029Spjd osd_del(OSD_JAIL, &(pr)->pr_osd, (slot)) 103188894Sjamie#define osd_jail_call(pr, method, data) \ 104188894Sjamie osd_call(OSD_JAIL, (method), (pr), (data)) 105185029Spjd#define osd_jail_exit(pr) \ 106185029Spjd osd_exit(OSD_JAIL, &(pr)->pr_osd) 107185029Spjd 108185029Spjd#endif /* _KERNEL */ 109185029Spjd 110185029Spjd#endif /* !_SYS_OSD_H_ */ 111