diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/xfs/xfs_inode.c | 40 |
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 | */ |
2475 | STATIC void | 2474 | static void |
2476 | __xfs_iunpin_wait( | 2475 | xfs_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 | ||
2496 | void | 2485 | void |
2497 | xfs_iunpin_wait( | 2486 | xfs_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)); | |
2503 | static inline void | 2492 | } |
2504 | xfs_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 | * |