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 Levonint 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