2005-04-17 02:20:36 +04:00
/*
2006-10-02 18:55:27 +04:00
* Copyright ( C ) International Business Machines Corp . , 2000 - 2001
* Portions Copyright ( C ) Christoph Hellwig , 2001 - 2002
2005-04-17 02:20:36 +04:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
2006-10-02 18:55:27 +04:00
* the Free Software Foundation ; either version 2 of the License , or
2005-04-17 02:20:36 +04:00
* ( at your option ) any later version .
2006-10-02 18:55:27 +04:00
*
2005-04-17 02:20:36 +04:00
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See
* the GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
2006-10-02 18:55:27 +04:00
* along with this program ; if not , write to the Free Software
2005-04-17 02:20:36 +04:00
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
# ifndef _H_JFS_LOCK
# define _H_JFS_LOCK
# include <linux/spinlock.h>
2006-01-25 00:22:50 +03:00
# include <linux/mutex.h>
2005-04-17 02:20:36 +04:00
# include <linux/sched.h>
/*
* jfs_lock . h
*/
/*
* Conditional sleep where condition is protected by spinlock
*
* lock_cmd and unlock_cmd take and release the spinlock
*/
# define __SLEEP_COND(wq, cond, lock_cmd, unlock_cmd) \
do { \
DECLARE_WAITQUEUE ( __wait , current ) ; \
\
add_wait_queue ( & wq , & __wait ) ; \
for ( ; ; ) { \
set_current_state ( TASK_UNINTERRUPTIBLE ) ; \
if ( cond ) \
break ; \
unlock_cmd ; \
schedule ( ) ; \
lock_cmd ; \
} \
current - > state = TASK_RUNNING ; \
remove_wait_queue ( & wq , & __wait ) ; \
} while ( 0 )
# endif /* _H_JFS_LOCK */