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 f180ce896cd7..a7cf7139f9ad 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c | |||
@@ -77,7 +77,7 @@ xfs_inode_alloc( | |||
77 | 77 | ||
78 | ASSERT(atomic_read(&ip->i_pincount) == 0); | 78 | ASSERT(atomic_read(&ip->i_pincount) == 0); |
79 | ASSERT(!spin_is_locked(&ip->i_flags_lock)); | 79 | ASSERT(!spin_is_locked(&ip->i_flags_lock)); |
80 | ASSERT(completion_done(&ip->i_flush)); | 80 | ASSERT(!xfs_isiflocked(ip)); |
81 | ASSERT(ip->i_ino == 0); | 81 | ASSERT(ip->i_ino == 0); |
82 | 82 | ||
83 | mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); | 83 | mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); |
@@ -150,7 +150,7 @@ xfs_inode_free( | |||
150 | /* asserts to verify all state is correct here */ | 150 | /* asserts to verify all state is correct here */ |
151 | ASSERT(atomic_read(&ip->i_pincount) == 0); | 151 | ASSERT(atomic_read(&ip->i_pincount) == 0); |
152 | ASSERT(!spin_is_locked(&ip->i_flags_lock)); | 152 | ASSERT(!spin_is_locked(&ip->i_flags_lock)); |
153 | ASSERT(completion_done(&ip->i_flush)); | 153 | ASSERT(!xfs_isiflocked(ip)); |
154 | 154 | ||
155 | /* | 155 | /* |
156 | * Because we use RCU freeing we need to ensure the inode always | 156 | * Because we use RCU freeing we need to ensure the inode always |
@@ -713,3 +713,19 @@ xfs_isilocked( | |||
713 | return 0; | 713 | return 0; |
714 | } | 714 | } |
715 | #endif | 715 | #endif |
716 | |||
717 | void | ||
718 | __xfs_iflock( | ||
719 | struct xfs_inode *ip) | ||
720 | { | ||
721 | wait_queue_head_t *wq = bit_waitqueue(&ip->i_flags, __XFS_IFLOCK_BIT); | ||
722 | DEFINE_WAIT_BIT(wait, &ip->i_flags, __XFS_IFLOCK_BIT); | ||
723 | |||
724 | do { | ||
725 | prepare_to_wait_exclusive(wq, &wait.wait, TASK_UNINTERRUPTIBLE); | ||
726 | if (xfs_isiflocked(ip)) | ||
727 | io_schedule(); | ||
728 | } while (!xfs_iflock_nowait(ip)); | ||
729 | |||
730 | finish_wait(wq, &wait.wait); | ||
731 | } | ||