osd.h revision 188894
1122394Sharti/*-
2122394Sharti * Copyright (c) 2007 Pawel Jakub Dawidek <pjd@FreeBSD.org>
3122394Sharti * All rights reserved.
4122394Sharti *
5122394Sharti * Redistribution and use in source and binary forms, with or without
6122394Sharti * modification, are permitted provided that the following conditions
7133211Sharti * are met:
8133211Sharti * 1. Redistributions of source code must retain the above copyright
9133211Sharti *    notice, this list of conditions and the following disclaimer.
10133211Sharti * 2. Redistributions in binary form must reproduce the above copyright
11133211Sharti *    notice, this list of conditions and the following disclaimer in the
12133211Sharti *    documentation and/or other materials provided with the distribution.
13122394Sharti *
14122394Sharti * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
15122394Sharti * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16133211Sharti * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17133211Sharti * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
18133211Sharti * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19133211Sharti * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20133211Sharti * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21133211Sharti * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22133211Sharti * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23133211Sharti * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24133211Sharti * SUCH DAMAGE.
25133211Sharti *
26133211Sharti * $FreeBSD: head/sys/sys/osd.h 188894 2009-02-21 11:15:38Z jamie $
27133211Sharti */
28122394Sharti
29156066Sharti#ifndef _SYS_OSD_H_
30122394Sharti#define _SYS_OSD_H_
31122394Sharti
32122394Sharti#include <sys/queue.h>
33122394Sharti
34122394Sharti/*
35124861Sharti * Lock key:
36150920Sharti *   (c) container lock (e.g. jail's pr_mtx) and/or osd_object_lock
37122394Sharti *   (l) osd_list_lock
38122394Sharti */
39122394Shartistruct osd {
40122394Sharti	u_int		  osd_nslots;	/* (c) */
41122394Sharti	void		**osd_slots;	/* (c) */
42122394Sharti	LIST_ENTRY(osd)	  osd_next;	/* (l) */
43122394Sharti};
44122394Sharti
45122394Sharti#ifdef _KERNEL
46122394Sharti
47122394Sharti#define	OSD_THREAD	0
48122394Sharti#define	OSD_JAIL	1
49122394Sharti
50145557Sharti#define	OSD_FIRST	OSD_THREAD
51145557Sharti#define	OSD_LAST	OSD_JAIL
52145557Sharti
53145557Shartitypedef void (*osd_destructor_t)(void *value);
54145557Shartitypedef int (*osd_method_t)(void *obj, void *data);
55156066Sharti
56122394Shartiint osd_register(u_int type, osd_destructor_t destructor,
57122394Sharti    osd_method_t *methods);
58122394Shartivoid osd_deregister(u_int type, u_int slot);
59122394Sharti
60122394Shartiint osd_set(u_int type, struct osd *osd, u_int slot, void *value);
61122394Shartivoid *osd_get(u_int type, struct osd *osd, u_int slot);
62122394Shartivoid osd_del(u_int type, struct osd *osd, u_int slot);
63122394Shartiint osd_call(u_int type, u_int method, void *obj, void *data);
64146525Sharti
65146525Shartivoid osd_exit(u_int type, struct osd *osd);
66122394Sharti
67122394Sharti#define	osd_thread_register(destructor)					\
68122394Sharti	osd_register(OSD_THREAD, (destructor), NULL)
69122394Sharti#define	osd_thread_deregister(slot)					\
70122394Sharti	osd_deregister(OSD_THREAD, (slot))
71122394Sharti#define	osd_thread_set(td, slot, value)					\
72122394Sharti	osd_set(OSD_THREAD, &(td)->td_osd, (slot), (value))
73122394Sharti#define	osd_thread_get(td, slot)					\
74122394Sharti	osd_get(OSD_THREAD, &(td)->td_osd, (slot))
75122394Sharti#define	osd_thread_del(td, slot)	do {				\
76122394Sharti	KASSERT((td) == curthread, ("Not curthread."));			\
77122394Sharti	osd_del(OSD_THREAD, &(td)->td_osd, (slot));			\
78122394Sharti} while (0)
79122394Sharti#define	osd_thread_call(td, method, data)				\
80122394Sharti	osd_call(OSD_THREAD, (method), (td), (data))
81122394Sharti#define	osd_thread_exit(td)						\
82122394Sharti	osd_exit(OSD_THREAD, &(td)->td_osd)
83122394Sharti
84122394Sharti#define	osd_jail_register(destructor)					\
85122394Sharti	osd_register(OSD_JAIL, (destructor), NULL)
86124861Sharti#define	osd_jail_deregister(slot)					\
87122394Sharti	osd_deregister(OSD_JAIL, (slot))
88122394Sharti#define	osd_jail_set(pr, slot, value)					\
89122394Sharti	osd_set(OSD_JAIL, &(pr)->pr_osd, (slot), (value))
90122394Sharti#define	osd_jail_get(pr, slot)						\
91122394Sharti	osd_get(OSD_JAIL, &(pr)->pr_osd, (slot))
92122394Sharti#define	osd_jail_del(pr, slot)						\
93122394Sharti	osd_del(OSD_JAIL, &(pr)->pr_osd, (slot))
94122394Sharti#define	osd_jail_call(pr, method, data)					\
95122394Sharti	osd_call(OSD_JAIL, (method), (pr), (data))
96122394Sharti#define	osd_jail_exit(pr)						\
97122394Sharti	osd_exit(OSD_JAIL, &(pr)->pr_osd)
98122394Sharti
99122394Sharti#endif	/* _KERNEL */
100122394Sharti
101122394Sharti#endif	/* !_SYS_OSD_H_ */
102122394Sharti