diff options
Diffstat (limited to 'fs/xfs/xfs_iget.c')
-rw-r--r-- | fs/xfs/xfs_iget.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 3960a066d7ff..8c3e46394d48 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); |
@@ -94,8 +94,6 @@ xfs_inode_alloc( | |||
94 | ip->i_update_core = 0; | 94 | ip->i_update_core = 0; |
95 | ip->i_delayed_blks = 0; | 95 | ip->i_delayed_blks = 0; |
96 | memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); | 96 | memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); |
97 | ip->i_size = 0; | ||
98 | ip->i_new_size = 0; | ||
99 | 97 | ||
100 | return ip; | 98 | return ip; |
101 | } | 99 | } |
@@ -150,7 +148,7 @@ xfs_inode_free( | |||
150 | /* asserts to verify all state is correct here */ | 148 | /* asserts to verify all state is correct here */ |
151 | ASSERT(atomic_read(&ip->i_pincount) == 0); | 149 | ASSERT(atomic_read(&ip->i_pincount) == 0); |
152 | ASSERT(!spin_is_locked(&ip->i_flags_lock)); | 150 | ASSERT(!spin_is_locked(&ip->i_flags_lock)); |
153 | ASSERT(completion_done(&ip->i_flush)); | 151 | ASSERT(!xfs_isiflocked(ip)); |
154 | 152 | ||
155 | /* | 153 | /* |
156 | * Because we use RCU freeing we need to ensure the inode always | 154 | * Because we use RCU freeing we need to ensure the inode always |
@@ -450,8 +448,6 @@ again: | |||
450 | 448 | ||
451 | *ipp = ip; | 449 | *ipp = ip; |
452 | 450 | ||
453 | ASSERT(ip->i_df.if_ext_max == | ||
454 | XFS_IFORK_DSIZE(ip) / sizeof(xfs_bmbt_rec_t)); | ||
455 | /* | 451 | /* |
456 | * If we have a real type for an on-disk inode, we can set ops(&unlock) | 452 | * If we have a real type for an on-disk inode, we can set ops(&unlock) |
457 | * now. If it's a new inode being created, xfs_ialloc will handle it. | 453 | * now. If it's a new inode being created, xfs_ialloc will handle it. |
@@ -715,3 +711,19 @@ xfs_isilocked( | |||
715 | return 0; | 711 | return 0; |
716 | } | 712 | } |
717 | #endif | 713 | #endif |
714 | |||
715 | void | ||
716 | __xfs_iflock( | ||
717 | struct xfs_inode *ip) | ||
718 | { | ||
719 | wait_queue_head_t *wq = bit_waitqueue(&ip->i_flags, __XFS_IFLOCK_BIT); | ||
720 | DEFINE_WAIT_BIT(wait, &ip->i_flags, __XFS_IFLOCK_BIT); | ||
721 | |||
722 | do { | ||
723 | prepare_to_wait_exclusive(wq, &wait.wait, TASK_UNINTERRUPTIBLE); | ||
724 | if (xfs_isiflocked(ip)) | ||
725 | io_schedule(); | ||
726 | } while (!xfs_iflock_nowait(ip)); | ||
727 | |||
728 | finish_wait(wq, &wait.wait); | ||
729 | } | ||