4 #include "vserver/dlimit.h"
5 #include "vserver/base.h"
6 #include "vserver/debug.h"
9 #define get_dl_info(i) __get_dl_info(i,__FILE__,__LINE__)
11 static inline struct dl_info *__get_dl_info(struct dl_info *dli,
12 const char *_file, int _line)
16 vxlprintk(VXD_CBIT(dlim, 4), "get_dl_info(%p[#%d.%d])",
17 dli, dli?dli->dl_tag:0, dli?atomic_read(&dli->dl_usecnt):0,
19 atomic_inc(&dli->dl_usecnt);
24 #define free_dl_info(i) \
25 call_rcu(&i->dl_rcu, rcu_free_dl_info);
27 #define put_dl_info(i) __put_dl_info(i,__FILE__,__LINE__)
29 static inline void __put_dl_info(struct dl_info *dli,
30 const char *_file, int _line)
34 vxlprintk(VXD_CBIT(dlim, 4), "put_dl_info(%p[#%d.%d])",
35 dli, dli?dli->dl_tag:0, dli?atomic_read(&dli->dl_usecnt):0,
37 if (atomic_dec_and_test(&dli->dl_usecnt))
42 #define __dlimit_char(d) ((d)?'*':' ')
44 static inline int __dl_alloc_space(struct super_block *sb,
45 tag_t tag, dlsize_t nr, const char *file, int line)
47 struct dl_info *dli = NULL;
52 dli = locate_dl_info(sb, tag);
56 spin_lock(&dli->dl_lock);
57 ret = (dli->dl_space_used + nr > dli->dl_space_total);
59 dli->dl_space_used += nr;
60 spin_unlock(&dli->dl_lock);
63 vxlprintk(VXD_CBIT(dlim, 1),
64 "ALLOC (%p,#%d)%c %lld bytes (%d)",
65 sb, tag, __dlimit_char(dli), (long long)nr,
70 static inline void __dl_free_space(struct super_block *sb,
71 tag_t tag, dlsize_t nr, const char *_file, int _line)
73 struct dl_info *dli = NULL;
77 dli = locate_dl_info(sb, tag);
81 spin_lock(&dli->dl_lock);
82 if (dli->dl_space_used > nr)
83 dli->dl_space_used -= nr;
85 dli->dl_space_used = 0;
86 spin_unlock(&dli->dl_lock);
89 vxlprintk(VXD_CBIT(dlim, 1),
90 "FREE (%p,#%d)%c %lld bytes",
91 sb, tag, __dlimit_char(dli), (long long)nr,
95 static inline int __dl_alloc_inode(struct super_block *sb,
96 tag_t tag, const char *_file, int _line)
101 dli = locate_dl_info(sb, tag);
105 spin_lock(&dli->dl_lock);
106 ret = (dli->dl_inodes_used >= dli->dl_inodes_total);
108 dli->dl_inodes_used++;
109 spin_unlock(&dli->dl_lock);
112 vxlprintk(VXD_CBIT(dlim, 0),
113 "ALLOC (%p,#%d)%c inode (%d)",
114 sb, tag, __dlimit_char(dli), ret, _file, _line);
118 static inline void __dl_free_inode(struct super_block *sb,
119 tag_t tag, const char *_file, int _line)
123 dli = locate_dl_info(sb, tag);
127 spin_lock(&dli->dl_lock);
128 if (dli->dl_inodes_used > 1)
129 dli->dl_inodes_used--;
131 dli->dl_inodes_used = 0;
132 spin_unlock(&dli->dl_lock);
135 vxlprintk(VXD_CBIT(dlim, 0),
136 "FREE (%p,#%d)%c inode",
137 sb, tag, __dlimit_char(dli), _file, _line);
140 static inline void __dl_adjust_block(struct super_block *sb, tag_t tag,
141 unsigned long long *free_blocks, unsigned long long *root_blocks,
142 const char *_file, int _line)
145 uint64_t broot, bfree;
147 dli = locate_dl_info(sb, tag);
151 spin_lock(&dli->dl_lock);
152 broot = (dli->dl_space_total -
153 (dli->dl_space_total >> 10) * dli->dl_nrlmult)
154 >> sb->s_blocksize_bits;
155 bfree = (dli->dl_space_total - dli->dl_space_used)
156 >> sb->s_blocksize_bits;
157 spin_unlock(&dli->dl_lock);
159 vxlprintk(VXD_CBIT(dlim, 2),
160 "ADJUST: %lld,%lld on %lld,%lld [mult=%d]",
161 (long long)bfree, (long long)broot,
162 *free_blocks, *root_blocks, dli->dl_nrlmult,
165 if (*free_blocks > bfree)
166 *free_blocks = bfree;
169 if (*root_blocks > broot)
170 *root_blocks = broot;
175 #define DLIMIT_ALLOC_SPACE(in, bytes) \
176 __dl_alloc_space((in)->i_sb, (in)->i_tag, (dlsize_t)(bytes), \
179 #define DLIMIT_FREE_SPACE(in, bytes) \
180 __dl_free_space((in)->i_sb, (in)->i_tag, (dlsize_t)(bytes), \
183 #define DLIMIT_ALLOC_BLOCK(in, nr) \
184 __dl_alloc_space((in)->i_sb, (in)->i_tag, \
185 ((dlsize_t)(nr)) << (in)->i_sb->s_blocksize_bits, \
188 #define DLIMIT_FREE_BLOCK(in, nr) \
189 __dl_free_space((in)->i_sb, (in)->i_tag, \
190 ((dlsize_t)(nr)) << (in)->i_sb->s_blocksize_bits, \
194 #define DLIMIT_ALLOC_INODE(in) \
195 __dl_alloc_inode((in)->i_sb, (in)->i_tag, __FILE__, __LINE__ )
197 #define DLIMIT_FREE_INODE(in) \
198 __dl_free_inode((in)->i_sb, (in)->i_tag, __FILE__, __LINE__ )
201 #define DLIMIT_ADJUST_BLOCK(sb, tag, fb, rb) \
202 __dl_adjust_block(sb, tag, fb, rb, __FILE__, __LINE__ )
206 #warning duplicate inclusion