diff options
Diffstat (limited to 'fs/xfs/xfs_iget.c')
| -rw-r--r-- | fs/xfs/xfs_iget.c | 20 | 
1 files changed, 18 insertions, 2 deletions
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index f180ce896cd..a7cf7139f9a 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -77,7 +77,7 @@ xfs_inode_alloc(  	ASSERT(atomic_read(&ip->i_pincount) == 0);  	ASSERT(!spin_is_locked(&ip->i_flags_lock)); -	ASSERT(completion_done(&ip->i_flush)); +	ASSERT(!xfs_isiflocked(ip));  	ASSERT(ip->i_ino == 0);  	mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); @@ -150,7 +150,7 @@ xfs_inode_free(  	/* asserts to verify all state is correct here */  	ASSERT(atomic_read(&ip->i_pincount) == 0);  	ASSERT(!spin_is_locked(&ip->i_flags_lock)); -	ASSERT(completion_done(&ip->i_flush)); +	ASSERT(!xfs_isiflocked(ip));  	/*  	 * Because we use RCU freeing we need to ensure the inode always @@ -713,3 +713,19 @@ xfs_isilocked(  	return 0;  }  #endif + +void +__xfs_iflock( +	struct xfs_inode	*ip) +{ +	wait_queue_head_t *wq = bit_waitqueue(&ip->i_flags, __XFS_IFLOCK_BIT); +	DEFINE_WAIT_BIT(wait, &ip->i_flags, __XFS_IFLOCK_BIT); + +	do { +		prepare_to_wait_exclusive(wq, &wait.wait, TASK_UNINTERRUPTIBLE); +		if (xfs_isiflocked(ip)) +			io_schedule(); +	} while (!xfs_iflock_nowait(ip)); + +	finish_wait(wq, &wait.wait); +}  |