xref: /openbmc/linux/fs/jfs/jfs_lock.h (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*1a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds /*
363f83c9fSDave Kleikamp  *   Copyright (C) International Business Machines Corp., 2000-2001
463f83c9fSDave Kleikamp  *   Portions Copyright (C) Christoph Hellwig, 2001-2002
51da177e4SLinus Torvalds  */
61da177e4SLinus Torvalds #ifndef _H_JFS_LOCK
71da177e4SLinus Torvalds #define _H_JFS_LOCK
81da177e4SLinus Torvalds 
91da177e4SLinus Torvalds #include <linux/spinlock.h>
101de87444SIngo Molnar #include <linux/mutex.h>
111da177e4SLinus Torvalds #include <linux/sched.h>
121da177e4SLinus Torvalds 
131da177e4SLinus Torvalds /*
141da177e4SLinus Torvalds  *	jfs_lock.h
151da177e4SLinus Torvalds  */
161da177e4SLinus Torvalds 
171da177e4SLinus Torvalds /*
181da177e4SLinus Torvalds  * Conditional sleep where condition is protected by spinlock
191da177e4SLinus Torvalds  *
201da177e4SLinus Torvalds  * lock_cmd and unlock_cmd take and release the spinlock
211da177e4SLinus Torvalds  */
221da177e4SLinus Torvalds #define __SLEEP_COND(wq, cond, lock_cmd, unlock_cmd)	\
231da177e4SLinus Torvalds do {							\
241da177e4SLinus Torvalds 	DECLARE_WAITQUEUE(__wait, current);		\
251da177e4SLinus Torvalds 							\
261da177e4SLinus Torvalds 	add_wait_queue(&wq, &__wait);			\
271da177e4SLinus Torvalds 	for (;;) {					\
281da177e4SLinus Torvalds 		set_current_state(TASK_UNINTERRUPTIBLE);\
291da177e4SLinus Torvalds 		if (cond)				\
301da177e4SLinus Torvalds 			break;				\
311da177e4SLinus Torvalds 		unlock_cmd;				\
324aa0d230SDave Kleikamp 		io_schedule();				\
331da177e4SLinus Torvalds 		lock_cmd;				\
341da177e4SLinus Torvalds 	}						\
353cbb1c8eSMilind Arun Choudhary 	__set_current_state(TASK_RUNNING);			\
361da177e4SLinus Torvalds 	remove_wait_queue(&wq, &__wait);		\
371da177e4SLinus Torvalds } while (0)
381da177e4SLinus Torvalds 
391da177e4SLinus Torvalds #endif				/* _H_JFS_LOCK */
40