diff options
Diffstat (limited to 'fs/xfs/xfs_vnodeops.c')
-rw-r--r-- | fs/xfs/xfs_vnodeops.c | 29 |
1 files changed, 12 insertions, 17 deletions
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 9a2ae8c0ecc4..79270430dafc 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
@@ -554,7 +554,7 @@ xfs_inactive( | |||
554 | return VN_INACTIVE_CACHE; | 554 | return VN_INACTIVE_CACHE; |
555 | } | 555 | } |
556 | 556 | ||
557 | xfs_ilock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); | 557 | xfs_ilock(ip, XFS_ILOCK_EXCL); |
558 | xfs_trans_ijoin(tp, ip, 0); | 558 | xfs_trans_ijoin(tp, ip, 0); |
559 | 559 | ||
560 | if (S_ISLNK(ip->i_d.di_mode)) { | 560 | if (S_ISLNK(ip->i_d.di_mode)) { |
@@ -591,21 +591,24 @@ xfs_inactive( | |||
591 | ASSERT(ip->i_d.di_forkoff != 0); | 591 | ASSERT(ip->i_d.di_forkoff != 0); |
592 | 592 | ||
593 | error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); | 593 | error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); |
594 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | ||
595 | if (error) | 594 | if (error) |
596 | goto error_unlock; | 595 | goto out_unlock; |
596 | |||
597 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | ||
597 | 598 | ||
598 | error = xfs_attr_inactive(ip); | 599 | error = xfs_attr_inactive(ip); |
599 | if (error) | 600 | if (error) |
600 | goto error_unlock; | 601 | goto out; |
601 | 602 | ||
602 | tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); | 603 | tp = xfs_trans_alloc(mp, XFS_TRANS_INACTIVE); |
603 | error = xfs_trans_reserve(tp, 0, | 604 | error = xfs_trans_reserve(tp, 0, |
604 | XFS_IFREE_LOG_RES(mp), | 605 | XFS_IFREE_LOG_RES(mp), |
605 | 0, XFS_TRANS_PERM_LOG_RES, | 606 | 0, XFS_TRANS_PERM_LOG_RES, |
606 | XFS_INACTIVE_LOG_COUNT); | 607 | XFS_INACTIVE_LOG_COUNT); |
607 | if (error) | 608 | if (error) { |
608 | goto error_cancel; | 609 | xfs_trans_cancel(tp, 0); |
610 | goto out; | ||
611 | } | ||
609 | 612 | ||
610 | xfs_ilock(ip, XFS_ILOCK_EXCL); | 613 | xfs_ilock(ip, XFS_ILOCK_EXCL); |
611 | xfs_trans_ijoin(tp, ip, 0); | 614 | xfs_trans_ijoin(tp, ip, 0); |
@@ -658,21 +661,13 @@ xfs_inactive( | |||
658 | * Release the dquots held by inode, if any. | 661 | * Release the dquots held by inode, if any. |
659 | */ | 662 | */ |
660 | xfs_qm_dqdetach(ip); | 663 | xfs_qm_dqdetach(ip); |
661 | xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); | 664 | out_unlock: |
662 | 665 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | |
663 | out: | 666 | out: |
664 | return VN_INACTIVE_CACHE; | 667 | return VN_INACTIVE_CACHE; |
665 | out_cancel: | 668 | out_cancel: |
666 | xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); | 669 | xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | XFS_TRANS_ABORT); |
667 | xfs_iunlock(ip, XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL); | 670 | goto out_unlock; |
668 | return VN_INACTIVE_CACHE; | ||
669 | |||
670 | error_cancel: | ||
671 | ASSERT(XFS_FORCED_SHUTDOWN(mp)); | ||
672 | xfs_trans_cancel(tp, 0); | ||
673 | error_unlock: | ||
674 | xfs_iunlock(ip, XFS_IOLOCK_EXCL); | ||
675 | return VN_INACTIVE_CACHE; | ||
676 | } | 671 | } |
677 | 672 | ||
678 | /* | 673 | /* |