This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / include / linux / vs_dlimit.h
1 #ifndef _VX_VS_DLIMIT_H
2 #define _VX_VS_DLIMIT_H
3
4
5 // #define VX_DEBUG
6
7 #include <linux/kernel.h>
8 #include <linux/rcupdate.h>
9 #include <linux/sched.h>
10
11 #include "vserver/context.h"
12 #include "vserver/dlimit.h"
13
14 #if defined(VX_DEBUG)
15 #define vxdprintk(x...) printk("vxd: " x)
16 #else
17 #define vxdprintk(x...)
18 #endif
19
20
21 #define get_dl_info(i)  __get_dl_info(i,__FILE__,__LINE__)
22
23 static inline struct dl_info *__get_dl_info(struct dl_info *dli,
24         const char *_file, int _line)
25 {
26         if (!dli)
27                 return NULL;
28         vxdprintk("get_dl_info(%p[#%d.%d])\t%s:%d\n",
29                 dli, dli?dli->dl_xid:0, dli?atomic_read(&dli->dl_usecnt):0,
30                 _file, _line);
31         atomic_inc(&dli->dl_usecnt);
32         return dli;
33 }
34
35
36 #define free_dl_info(i) \
37         call_rcu(&i->dl_rcu, rcu_free_dl_info, i);
38
39 #define put_dl_info(i)  __put_dl_info(i,__FILE__,__LINE__)
40
41 static inline void __put_dl_info(struct dl_info *dli, const char *_file, int _line)
42 {
43         if (!dli)
44                 return;
45         vxdprintk("put_dl_info(%p[#%d.%d])\t%s:%d\n",
46                 dli, dli?dli->dl_xid:0, dli?atomic_read(&dli->dl_usecnt):0,
47                 _file, _line);
48         if (atomic_dec_and_test(&dli->dl_usecnt))
49                 free_dl_info(dli);
50 }
51
52
53 extern int vx_debug_dlimit;
54
55 #define __dlimit_char(d)        ((d)?'*':' ')
56
57 static inline int __dl_alloc_space(struct super_block *sb,
58         xid_t xid, dlsize_t nr, const char *file, int line)
59 {
60         struct dl_info *dli = NULL;
61         int ret = 0;
62
63         if (nr == 0)
64                 goto out;
65         dli = locate_dl_info(sb, xid);
66         if (!dli)
67                 goto out;
68
69         spin_lock(&dli->dl_lock);
70         ret = (dli->dl_space_used + nr > dli->dl_space_total);
71         if (!ret)
72                 dli->dl_space_used += nr;
73         spin_unlock(&dli->dl_lock);
74         put_dl_info(dli);
75 out:
76         if (vx_debug_dlimit)
77                 printk("ALLOC (%p,#%d)%c %lld bytes (%d)@ %s:%d\n",
78                         sb, xid, __dlimit_char(dli), nr, ret, file, line);
79         return ret;
80 }
81
82 static inline void __dl_free_space(struct super_block *sb,
83         xid_t xid, dlsize_t nr, const char *file, int line)
84 {
85         struct dl_info *dli = NULL;
86
87         if (nr == 0)
88                 goto out;
89         dli = locate_dl_info(sb, xid);
90         if (!dli)
91                 goto out;
92
93         spin_lock(&dli->dl_lock);
94         dli->dl_space_used -= nr;
95         spin_unlock(&dli->dl_lock);
96         put_dl_info(dli);
97 out:
98         if (vx_debug_dlimit)
99                 printk("FREE  (%p,#%d)%c %lld bytes @ %s:%d\n",
100                         sb, xid, __dlimit_char(dli), nr, file, line);
101 }
102
103 static inline int __dl_alloc_inode(struct super_block *sb,
104         xid_t xid, const char *file, int line)
105 {
106         struct dl_info *dli;
107         int ret = 0;
108
109         dli = locate_dl_info(sb, xid);
110         if (!dli)
111                 goto out;
112
113         spin_lock(&dli->dl_lock);
114         ret = (dli->dl_inodes_used >= dli->dl_inodes_total);
115         if (!ret)
116                 dli->dl_inodes_used++;
117         spin_unlock(&dli->dl_lock);
118         put_dl_info(dli);
119 out:
120         if (vx_debug_dlimit)
121                 printk("ALLOC (%p,#%d)%c inode (%d)@ %s:%d\n",
122                         sb, xid, __dlimit_char(dli), ret, file, line);
123         return ret;
124 }
125
126 static inline void __dl_free_inode(struct super_block *sb,
127         xid_t xid, const char *file, int line)
128 {
129         struct dl_info *dli;
130
131         dli = locate_dl_info(sb, xid);
132         if (!dli)
133                 goto out;
134
135         spin_lock(&dli->dl_lock);
136         dli->dl_inodes_used--;
137         spin_unlock(&dli->dl_lock);
138         put_dl_info(dli);
139 out:
140         if (vx_debug_dlimit)
141                 printk("FREE  (%p,#%d)%c inode @ %s:%d\n",
142                         sb, xid, __dlimit_char(dli), file, line);
143 }
144
145
146
147 #define DLIMIT_ALLOC_BLOCK(sb, xid, nr) \
148         __dl_alloc_space(sb, xid, \
149                 ((dlsize_t)(nr)) << (sb)->s_blocksize_bits, \
150                 __FILE__, __LINE__ )
151
152 #define DLIMIT_FREE_BLOCK(sb, xid, nr) \
153         __dl_free_space(sb, xid, \
154                 ((dlsize_t)(nr)) << (sb)->s_blocksize_bits, \
155                 __FILE__, __LINE__ )
156
157 #define DLIMIT_ALLOC_INODE(sb, xid) \
158         __dl_alloc_inode(sb, xid, __FILE__, __LINE__ )
159
160 #define DLIMIT_FREE_INODE(sb, xid) \
161         __dl_free_inode(sb, xid, __FILE__, __LINE__ )
162
163
164 #define DLIMIT_ADJUST_BLOCK(sb, xid, fb, rb)
165
166
167 #else
168 #warning duplicate inclusion
169 #endif