aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/xfs/xfs_inode.c40
1 files changed, 12 insertions, 28 deletions
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index fa31360046d4..16c3968c1bbe 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -2467,47 +2467,31 @@ xfs_iunpin(
2467} 2467}
2468 2468
2469/* 2469/*
2470 * This is called to unpin an inode. It can be directed to wait or to return 2470 * This is called to unpin an inode. The caller must have the inode locked
2471 * immediately without waiting for the inode to be unpinned. The caller must 2471 * in at least shared mode so that the buffer cannot be subsequently pinned
2472 * have the inode locked in at least shared mode so that the buffer cannot be 2472 * once someone is waiting for it to be unpinned.
2473 * subsequently pinned once someone is waiting for it to be unpinned.
2474 */ 2473 */
2475STATIC void 2474static void
2476__xfs_iunpin_wait( 2475xfs_iunpin_nowait(
2477 xfs_inode_t *ip, 2476 struct xfs_inode *ip)
2478 int wait)
2479{ 2477{
2480 xfs_inode_log_item_t *iip = ip->i_itemp;
2481
2482 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)); 2478 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL|XFS_ILOCK_SHARED));
2483 if (atomic_read(&ip->i_pincount) == 0)
2484 return;
2485 2479
2486 /* Give the log a push to start the unpinning I/O */ 2480 /* Give the log a push to start the unpinning I/O */
2487 if (iip && iip->ili_last_lsn) 2481 xfs_log_force_lsn(ip->i_mount, ip->i_itemp->ili_last_lsn, 0);
2488 xfs_log_force_lsn(ip->i_mount, iip->ili_last_lsn, 0);
2489 else
2490 xfs_log_force(ip->i_mount, 0);
2491 2482
2492 if (wait)
2493 wait_event(ip->i_ipin_wait, (atomic_read(&ip->i_pincount) == 0));
2494} 2483}
2495 2484
2496void 2485void
2497xfs_iunpin_wait( 2486xfs_iunpin_wait(
2498 xfs_inode_t *ip) 2487 struct xfs_inode *ip)
2499{ 2488{
2500 __xfs_iunpin_wait(ip, 1); 2489 if (xfs_ipincount(ip)) {
2501} 2490 xfs_iunpin_nowait(ip);
2502 2491 wait_event(ip->i_ipin_wait, (xfs_ipincount(ip) == 0));
2503static inline void 2492 }
2504xfs_iunpin_nowait(
2505 xfs_inode_t *ip)
2506{
2507 __xfs_iunpin_wait(ip, 0);
2508} 2493}
2509 2494
2510
2511/* 2495/*
2512 * xfs_iextents_copy() 2496 * xfs_iextents_copy()
2513 * 2497 *