Lines Matching refs:lock

32  * trace is also emitted for the previous lock acquisition.
45 spinlock_t lock;
61 static unsigned int __find_holder(struct block_lock *lock,
67 if (lock->holders[i] == task)
74 /* call this *after* you increment lock->count */
75 static void __add_holder(struct block_lock *lock, struct task_struct *task)
77 unsigned int h = __find_holder(lock, NULL);
83 lock->holders[h] = task;
86 t = lock->traces + h;
91 /* call this *before* you decrement lock->count */
92 static void __del_holder(struct block_lock *lock, struct task_struct *task)
94 unsigned int h = __find_holder(lock, task);
96 lock->holders[h] = NULL;
100 static int __check_holder(struct block_lock *lock)
105 if (lock->holders[i] == current) {
106 DMERR("recursive lock detected in metadata");
109 stack_trace_print(lock->traces[i].entries,
110 lock->traces[i].nr_entries, 4);
150 static void __wake_many(struct block_lock *lock)
154 BUG_ON(lock->count < 0);
155 list_for_each_entry_safe(w, tmp, &lock->waiters, list) {
156 if (lock->count >= MAX_HOLDERS)
160 if (lock->count > 0)
163 lock->count = -1;
164 __add_holder(lock, w->task);
169 lock->count++;
170 __add_holder(lock, w->task);
175 static void bl_init(struct block_lock *lock)
179 spin_lock_init(&lock->lock);
180 lock->count = 0;
181 INIT_LIST_HEAD(&lock->waiters);
183 lock->holders[i] = NULL;
186 static int __available_for_read(struct block_lock *lock)
188 return lock->count >= 0 &&
189 lock->count < MAX_HOLDERS &&
190 list_empty(&lock->waiters);
193 static int bl_down_read(struct block_lock *lock)
198 spin_lock(&lock->lock);
199 r = __check_holder(lock);
201 spin_unlock(&lock->lock);
205 if (__available_for_read(lock)) {
206 lock->count++;
207 __add_holder(lock, current);
208 spin_unlock(&lock->lock);
216 list_add_tail(&w.list, &lock->waiters);
217 spin_unlock(&lock->lock);
224 static int bl_down_read_nonblock(struct block_lock *lock)
228 spin_lock(&lock->lock);
229 r = __check_holder(lock);
233 if (__available_for_read(lock)) {
234 lock->count++;
235 __add_holder(lock, current);
241 spin_unlock(&lock->lock);
245 static void bl_up_read(struct block_lock *lock)
247 spin_lock(&lock->lock);
248 BUG_ON(lock->count <= 0);
249 __del_holder(lock, current);
250 --lock->count;
251 if (!list_empty(&lock->waiters))
252 __wake_many(lock);
253 spin_unlock(&lock->lock);
256 static int bl_down_write(struct block_lock *lock)
261 spin_lock(&lock->lock);
262 r = __check_holder(lock);
264 spin_unlock(&lock->lock);
268 if (lock->count == 0 && list_empty(&lock->waiters)) {
269 lock->count = -1;
270 __add_holder(lock, current);
271 spin_unlock(&lock->lock);
283 list_add(&w.list, &lock->waiters);
284 spin_unlock(&lock->lock);
292 static void bl_up_write(struct block_lock *lock)
294 spin_lock(&lock->lock);
295 __del_holder(lock, current);
296 lock->count = 0;
297 if (!list_empty(&lock->waiters))
298 __wake_many(lock);
299 spin_unlock(&lock->lock);
352 struct block_lock lock;
361 bl_init(&aux->lock);
482 r = bl_down_read(&aux->lock);
493 bl_up_read(&aux->lock);
518 r = bl_down_write(&aux->lock);
529 bl_up_write(&aux->lock);
553 r = bl_down_read_nonblock(&aux->lock);
563 bl_up_read(&aux->lock);
589 r = bl_down_write(&aux->lock);
608 bl_up_write(&aux->lock);
610 bl_up_read(&aux->lock);