11f5207b7SJohn Levon void _spin_lock(int name);
21f5207b7SJohn Levon void _spin_unlock(int name);
31f5207b7SJohn Levon int _spin_trylock(int name);
41f5207b7SJohn Levon 
51f5207b7SJohn Levon int a;
61f5207b7SJohn Levon int b;
func(void)71f5207b7SJohn Levon int func (void)
81f5207b7SJohn Levon {
91f5207b7SJohn Levon 	int mylock = 1;
101f5207b7SJohn Levon 	int mylock2 = 1;
111f5207b7SJohn Levon 	int mylock3 = 1;
121f5207b7SJohn Levon 
131f5207b7SJohn Levon 	if (!_spin_trylock(mylock)) {
141f5207b7SJohn Levon 		return;
151f5207b7SJohn Levon 	}
161f5207b7SJohn Levon 
171f5207b7SJohn Levon 	_spin_unlock(mylock);
181f5207b7SJohn Levon 	_spin_unlock(mylock2);
191f5207b7SJohn Levon 
201f5207b7SJohn Levon 	if (a)
211f5207b7SJohn Levon 		_spin_unlock(mylock);
221f5207b7SJohn Levon 	_spin_lock(mylock2);
231f5207b7SJohn Levon 
241f5207b7SJohn Levon 	if (!_spin_trylock(mylock3))
251f5207b7SJohn Levon 		return;
261f5207b7SJohn Levon 	return;
271f5207b7SJohn Levon }
281f5207b7SJohn Levon /*
291f5207b7SJohn Levon  * check-name: Smatch locking #2
301f5207b7SJohn Levon  * check-command: smatch --project=kernel sm_locking2.c
311f5207b7SJohn Levon  *
321f5207b7SJohn Levon  * check-output-start
33*31ad075eSJohn Levon sm_locking2.c:21 func() error: double unlocked 'mylock' (orig line 17)
34*31ad075eSJohn Levon sm_locking2.c:26 func() warn: inconsistent returns 'mylock3'.
35*31ad075eSJohn Levon   Locked on  : 26
36*31ad075eSJohn Levon   Unlocked on: 25
371f5207b7SJohn Levon  * check-output-end
381f5207b7SJohn Levon  */
39