diff options
Diffstat (limited to 'fs/xfs/xfs_inode.c')
-rw-r--r-- | fs/xfs/xfs_inode.c | 143 |
1 files changed, 43 insertions, 100 deletions
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 391d36b0e68c..fa31360046d4 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
@@ -151,7 +151,7 @@ xfs_imap_to_bp( | |||
151 | "an error %d on %s. Returning error.", | 151 | "an error %d on %s. Returning error.", |
152 | error, mp->m_fsname); | 152 | error, mp->m_fsname); |
153 | } else { | 153 | } else { |
154 | ASSERT(buf_flags & XFS_BUF_TRYLOCK); | 154 | ASSERT(buf_flags & XBF_TRYLOCK); |
155 | } | 155 | } |
156 | return error; | 156 | return error; |
157 | } | 157 | } |
@@ -239,7 +239,7 @@ xfs_inotobp( | |||
239 | if (error) | 239 | if (error) |
240 | return error; | 240 | return error; |
241 | 241 | ||
242 | error = xfs_imap_to_bp(mp, tp, &imap, &bp, XFS_BUF_LOCK, imap_flags); | 242 | error = xfs_imap_to_bp(mp, tp, &imap, &bp, XBF_LOCK, imap_flags); |
243 | if (error) | 243 | if (error) |
244 | return error; | 244 | return error; |
245 | 245 | ||
@@ -285,7 +285,7 @@ xfs_itobp( | |||
285 | return error; | 285 | return error; |
286 | 286 | ||
287 | if (!bp) { | 287 | if (!bp) { |
288 | ASSERT(buf_flags & XFS_BUF_TRYLOCK); | 288 | ASSERT(buf_flags & XBF_TRYLOCK); |
289 | ASSERT(tp == NULL); | 289 | ASSERT(tp == NULL); |
290 | *bpp = NULL; | 290 | *bpp = NULL; |
291 | return EAGAIN; | 291 | return EAGAIN; |
@@ -807,7 +807,7 @@ xfs_iread( | |||
807 | * Get pointers to the on-disk inode and the buffer containing it. | 807 | * Get pointers to the on-disk inode and the buffer containing it. |
808 | */ | 808 | */ |
809 | error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp, | 809 | error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp, |
810 | XFS_BUF_LOCK, iget_flags); | 810 | XBF_LOCK, iget_flags); |
811 | if (error) | 811 | if (error) |
812 | return error; | 812 | return error; |
813 | dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); | 813 | dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); |
@@ -1751,7 +1751,7 @@ xfs_iunlink( | |||
1751 | * Here we put the head pointer into our next pointer, | 1751 | * Here we put the head pointer into our next pointer, |
1752 | * and then we fall through to point the head at us. | 1752 | * and then we fall through to point the head at us. |
1753 | */ | 1753 | */ |
1754 | error = xfs_itobp(mp, tp, ip, &dip, &ibp, XFS_BUF_LOCK); | 1754 | error = xfs_itobp(mp, tp, ip, &dip, &ibp, XBF_LOCK); |
1755 | if (error) | 1755 | if (error) |
1756 | return error; | 1756 | return error; |
1757 | 1757 | ||
@@ -1833,7 +1833,7 @@ xfs_iunlink_remove( | |||
1833 | * of dealing with the buffer when there is no need to | 1833 | * of dealing with the buffer when there is no need to |
1834 | * change it. | 1834 | * change it. |
1835 | */ | 1835 | */ |
1836 | error = xfs_itobp(mp, tp, ip, &dip, &ibp, XFS_BUF_LOCK); | 1836 | error = xfs_itobp(mp, tp, ip, &dip, &ibp, XBF_LOCK); |
1837 | if (error) { | 1837 | if (error) { |
1838 | cmn_err(CE_WARN, | 1838 | cmn_err(CE_WARN, |
1839 | "xfs_iunlink_remove: xfs_itobp() returned an error %d on %s. Returning error.", | 1839 | "xfs_iunlink_remove: xfs_itobp() returned an error %d on %s. Returning error.", |
@@ -1895,7 +1895,7 @@ xfs_iunlink_remove( | |||
1895 | * Now last_ibp points to the buffer previous to us on | 1895 | * Now last_ibp points to the buffer previous to us on |
1896 | * the unlinked list. Pull us from the list. | 1896 | * the unlinked list. Pull us from the list. |
1897 | */ | 1897 | */ |
1898 | error = xfs_itobp(mp, tp, ip, &dip, &ibp, XFS_BUF_LOCK); | 1898 | error = xfs_itobp(mp, tp, ip, &dip, &ibp, XBF_LOCK); |
1899 | if (error) { | 1899 | if (error) { |
1900 | cmn_err(CE_WARN, | 1900 | cmn_err(CE_WARN, |
1901 | "xfs_iunlink_remove: xfs_itobp() returned an error %d on %s. Returning error.", | 1901 | "xfs_iunlink_remove: xfs_itobp() returned an error %d on %s. Returning error.", |
@@ -1946,8 +1946,9 @@ xfs_ifree_cluster( | |||
1946 | xfs_inode_t *ip, **ip_found; | 1946 | xfs_inode_t *ip, **ip_found; |
1947 | xfs_inode_log_item_t *iip; | 1947 | xfs_inode_log_item_t *iip; |
1948 | xfs_log_item_t *lip; | 1948 | xfs_log_item_t *lip; |
1949 | xfs_perag_t *pag = xfs_get_perag(mp, inum); | 1949 | struct xfs_perag *pag; |
1950 | 1950 | ||
1951 | pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, inum)); | ||
1951 | if (mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(mp)) { | 1952 | if (mp->m_sb.sb_blocksize >= XFS_INODE_CLUSTER_SIZE(mp)) { |
1952 | blks_per_cluster = 1; | 1953 | blks_per_cluster = 1; |
1953 | ninodes = mp->m_sb.sb_inopblock; | 1954 | ninodes = mp->m_sb.sb_inopblock; |
@@ -2039,7 +2040,7 @@ xfs_ifree_cluster( | |||
2039 | 2040 | ||
2040 | bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, blkno, | 2041 | bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, blkno, |
2041 | mp->m_bsize * blks_per_cluster, | 2042 | mp->m_bsize * blks_per_cluster, |
2042 | XFS_BUF_LOCK); | 2043 | XBF_LOCK); |
2043 | 2044 | ||
2044 | pre_flushed = 0; | 2045 | pre_flushed = 0; |
2045 | lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); | 2046 | lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); |
@@ -2088,7 +2089,7 @@ xfs_ifree_cluster( | |||
2088 | } | 2089 | } |
2089 | 2090 | ||
2090 | kmem_free(ip_found); | 2091 | kmem_free(ip_found); |
2091 | xfs_put_perag(mp, pag); | 2092 | xfs_perag_put(pag); |
2092 | } | 2093 | } |
2093 | 2094 | ||
2094 | /* | 2095 | /* |
@@ -2150,7 +2151,7 @@ xfs_ifree( | |||
2150 | 2151 | ||
2151 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); | 2152 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); |
2152 | 2153 | ||
2153 | error = xfs_itobp(ip->i_mount, tp, ip, &dip, &ibp, XFS_BUF_LOCK); | 2154 | error = xfs_itobp(ip->i_mount, tp, ip, &dip, &ibp, XBF_LOCK); |
2154 | if (error) | 2155 | if (error) |
2155 | return error; | 2156 | return error; |
2156 | 2157 | ||
@@ -2483,13 +2484,16 @@ __xfs_iunpin_wait( | |||
2483 | return; | 2484 | return; |
2484 | 2485 | ||
2485 | /* Give the log a push to start the unpinning I/O */ | 2486 | /* Give the log a push to start the unpinning I/O */ |
2486 | xfs_log_force(ip->i_mount, (iip && iip->ili_last_lsn) ? | 2487 | if (iip && iip->ili_last_lsn) |
2487 | iip->ili_last_lsn : 0, XFS_LOG_FORCE); | 2488 | xfs_log_force_lsn(ip->i_mount, iip->ili_last_lsn, 0); |
2489 | else | ||
2490 | xfs_log_force(ip->i_mount, 0); | ||
2491 | |||
2488 | if (wait) | 2492 | if (wait) |
2489 | wait_event(ip->i_ipin_wait, (atomic_read(&ip->i_pincount) == 0)); | 2493 | wait_event(ip->i_ipin_wait, (atomic_read(&ip->i_pincount) == 0)); |
2490 | } | 2494 | } |
2491 | 2495 | ||
2492 | static inline void | 2496 | void |
2493 | xfs_iunpin_wait( | 2497 | xfs_iunpin_wait( |
2494 | xfs_inode_t *ip) | 2498 | xfs_inode_t *ip) |
2495 | { | 2499 | { |
@@ -2675,7 +2679,7 @@ xfs_iflush_cluster( | |||
2675 | xfs_buf_t *bp) | 2679 | xfs_buf_t *bp) |
2676 | { | 2680 | { |
2677 | xfs_mount_t *mp = ip->i_mount; | 2681 | xfs_mount_t *mp = ip->i_mount; |
2678 | xfs_perag_t *pag = xfs_get_perag(mp, ip->i_ino); | 2682 | struct xfs_perag *pag; |
2679 | unsigned long first_index, mask; | 2683 | unsigned long first_index, mask; |
2680 | unsigned long inodes_per_cluster; | 2684 | unsigned long inodes_per_cluster; |
2681 | int ilist_size; | 2685 | int ilist_size; |
@@ -2686,6 +2690,7 @@ xfs_iflush_cluster( | |||
2686 | int bufwasdelwri; | 2690 | int bufwasdelwri; |
2687 | int i; | 2691 | int i; |
2688 | 2692 | ||
2693 | pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); | ||
2689 | ASSERT(pag->pagi_inodeok); | 2694 | ASSERT(pag->pagi_inodeok); |
2690 | ASSERT(pag->pag_ici_init); | 2695 | ASSERT(pag->pag_ici_init); |
2691 | 2696 | ||
@@ -2693,7 +2698,7 @@ xfs_iflush_cluster( | |||
2693 | ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); | 2698 | ilist_size = inodes_per_cluster * sizeof(xfs_inode_t *); |
2694 | ilist = kmem_alloc(ilist_size, KM_MAYFAIL|KM_NOFS); | 2699 | ilist = kmem_alloc(ilist_size, KM_MAYFAIL|KM_NOFS); |
2695 | if (!ilist) | 2700 | if (!ilist) |
2696 | return 0; | 2701 | goto out_put; |
2697 | 2702 | ||
2698 | mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1); | 2703 | mask = ~(((XFS_INODE_CLUSTER_SIZE(mp) >> mp->m_sb.sb_inodelog)) - 1); |
2699 | first_index = XFS_INO_TO_AGINO(mp, ip->i_ino) & mask; | 2704 | first_index = XFS_INO_TO_AGINO(mp, ip->i_ino) & mask; |
@@ -2762,6 +2767,8 @@ xfs_iflush_cluster( | |||
2762 | out_free: | 2767 | out_free: |
2763 | read_unlock(&pag->pag_ici_lock); | 2768 | read_unlock(&pag->pag_ici_lock); |
2764 | kmem_free(ilist); | 2769 | kmem_free(ilist); |
2770 | out_put: | ||
2771 | xfs_perag_put(pag); | ||
2765 | return 0; | 2772 | return 0; |
2766 | 2773 | ||
2767 | 2774 | ||
@@ -2805,6 +2812,7 @@ cluster_corrupt_out: | |||
2805 | */ | 2812 | */ |
2806 | xfs_iflush_abort(iq); | 2813 | xfs_iflush_abort(iq); |
2807 | kmem_free(ilist); | 2814 | kmem_free(ilist); |
2815 | xfs_perag_put(pag); | ||
2808 | return XFS_ERROR(EFSCORRUPTED); | 2816 | return XFS_ERROR(EFSCORRUPTED); |
2809 | } | 2817 | } |
2810 | 2818 | ||
@@ -2827,8 +2835,6 @@ xfs_iflush( | |||
2827 | xfs_dinode_t *dip; | 2835 | xfs_dinode_t *dip; |
2828 | xfs_mount_t *mp; | 2836 | xfs_mount_t *mp; |
2829 | int error; | 2837 | int error; |
2830 | int noblock = (flags == XFS_IFLUSH_ASYNC_NOBLOCK); | ||
2831 | enum { INT_DELWRI = (1 << 0), INT_ASYNC = (1 << 1) }; | ||
2832 | 2838 | ||
2833 | XFS_STATS_INC(xs_iflush_count); | 2839 | XFS_STATS_INC(xs_iflush_count); |
2834 | 2840 | ||
@@ -2841,19 +2847,6 @@ xfs_iflush( | |||
2841 | mp = ip->i_mount; | 2847 | mp = ip->i_mount; |
2842 | 2848 | ||
2843 | /* | 2849 | /* |
2844 | * If the inode isn't dirty, then just release the inode flush lock and | ||
2845 | * do nothing. Treat stale inodes the same; we cannot rely on the | ||
2846 | * backing buffer remaining stale in cache for the remaining life of | ||
2847 | * the stale inode and so xfs_itobp() below may give us a buffer that | ||
2848 | * no longer contains inodes below. Doing this stale check here also | ||
2849 | * avoids forcing the log on pinned, stale inodes. | ||
2850 | */ | ||
2851 | if (xfs_inode_clean(ip) || xfs_iflags_test(ip, XFS_ISTALE)) { | ||
2852 | xfs_ifunlock(ip); | ||
2853 | return 0; | ||
2854 | } | ||
2855 | |||
2856 | /* | ||
2857 | * We can't flush the inode until it is unpinned, so wait for it if we | 2850 | * We can't flush the inode until it is unpinned, so wait for it if we |
2858 | * are allowed to block. We know noone new can pin it, because we are | 2851 | * are allowed to block. We know noone new can pin it, because we are |
2859 | * holding the inode lock shared and you need to hold it exclusively to | 2852 | * holding the inode lock shared and you need to hold it exclusively to |
@@ -2864,7 +2857,7 @@ xfs_iflush( | |||
2864 | * in the same cluster are dirty, they will probably write the inode | 2857 | * in the same cluster are dirty, they will probably write the inode |
2865 | * out for us if they occur after the log force completes. | 2858 | * out for us if they occur after the log force completes. |
2866 | */ | 2859 | */ |
2867 | if (noblock && xfs_ipincount(ip)) { | 2860 | if (!(flags & SYNC_WAIT) && xfs_ipincount(ip)) { |
2868 | xfs_iunpin_nowait(ip); | 2861 | xfs_iunpin_nowait(ip); |
2869 | xfs_ifunlock(ip); | 2862 | xfs_ifunlock(ip); |
2870 | return EAGAIN; | 2863 | return EAGAIN; |
@@ -2872,6 +2865,19 @@ xfs_iflush( | |||
2872 | xfs_iunpin_wait(ip); | 2865 | xfs_iunpin_wait(ip); |
2873 | 2866 | ||
2874 | /* | 2867 | /* |
2868 | * For stale inodes we cannot rely on the backing buffer remaining | ||
2869 | * stale in cache for the remaining life of the stale inode and so | ||
2870 | * xfs_itobp() below may give us a buffer that no longer contains | ||
2871 | * inodes below. We have to check this after ensuring the inode is | ||
2872 | * unpinned so that it is safe to reclaim the stale inode after the | ||
2873 | * flush call. | ||
2874 | */ | ||
2875 | if (xfs_iflags_test(ip, XFS_ISTALE)) { | ||
2876 | xfs_ifunlock(ip); | ||
2877 | return 0; | ||
2878 | } | ||
2879 | |||
2880 | /* | ||
2875 | * This may have been unpinned because the filesystem is shutting | 2881 | * This may have been unpinned because the filesystem is shutting |
2876 | * down forcibly. If that's the case we must not write this inode | 2882 | * down forcibly. If that's the case we must not write this inode |
2877 | * to disk, because the log record didn't make it to disk! | 2883 | * to disk, because the log record didn't make it to disk! |
@@ -2885,60 +2891,10 @@ xfs_iflush( | |||
2885 | } | 2891 | } |
2886 | 2892 | ||
2887 | /* | 2893 | /* |
2888 | * Decide how buffer will be flushed out. This is done before | ||
2889 | * the call to xfs_iflush_int because this field is zeroed by it. | ||
2890 | */ | ||
2891 | if (iip != NULL && iip->ili_format.ilf_fields != 0) { | ||
2892 | /* | ||
2893 | * Flush out the inode buffer according to the directions | ||
2894 | * of the caller. In the cases where the caller has given | ||
2895 | * us a choice choose the non-delwri case. This is because | ||
2896 | * the inode is in the AIL and we need to get it out soon. | ||
2897 | */ | ||
2898 | switch (flags) { | ||
2899 | case XFS_IFLUSH_SYNC: | ||
2900 | case XFS_IFLUSH_DELWRI_ELSE_SYNC: | ||
2901 | flags = 0; | ||
2902 | break; | ||
2903 | case XFS_IFLUSH_ASYNC_NOBLOCK: | ||
2904 | case XFS_IFLUSH_ASYNC: | ||
2905 | case XFS_IFLUSH_DELWRI_ELSE_ASYNC: | ||
2906 | flags = INT_ASYNC; | ||
2907 | break; | ||
2908 | case XFS_IFLUSH_DELWRI: | ||
2909 | flags = INT_DELWRI; | ||
2910 | break; | ||
2911 | default: | ||
2912 | ASSERT(0); | ||
2913 | flags = 0; | ||
2914 | break; | ||
2915 | } | ||
2916 | } else { | ||
2917 | switch (flags) { | ||
2918 | case XFS_IFLUSH_DELWRI_ELSE_SYNC: | ||
2919 | case XFS_IFLUSH_DELWRI_ELSE_ASYNC: | ||
2920 | case XFS_IFLUSH_DELWRI: | ||
2921 | flags = INT_DELWRI; | ||
2922 | break; | ||
2923 | case XFS_IFLUSH_ASYNC_NOBLOCK: | ||
2924 | case XFS_IFLUSH_ASYNC: | ||
2925 | flags = INT_ASYNC; | ||
2926 | break; | ||
2927 | case XFS_IFLUSH_SYNC: | ||
2928 | flags = 0; | ||
2929 | break; | ||
2930 | default: | ||
2931 | ASSERT(0); | ||
2932 | flags = 0; | ||
2933 | break; | ||
2934 | } | ||
2935 | } | ||
2936 | |||
2937 | /* | ||
2938 | * Get the buffer containing the on-disk inode. | 2894 | * Get the buffer containing the on-disk inode. |
2939 | */ | 2895 | */ |
2940 | error = xfs_itobp(mp, NULL, ip, &dip, &bp, | 2896 | error = xfs_itobp(mp, NULL, ip, &dip, &bp, |
2941 | noblock ? XFS_BUF_TRYLOCK : XFS_BUF_LOCK); | 2897 | (flags & SYNC_WAIT) ? XBF_LOCK : XBF_TRYLOCK); |
2942 | if (error || !bp) { | 2898 | if (error || !bp) { |
2943 | xfs_ifunlock(ip); | 2899 | xfs_ifunlock(ip); |
2944 | return error; | 2900 | return error; |
@@ -2956,7 +2912,7 @@ xfs_iflush( | |||
2956 | * get stuck waiting in the write for too long. | 2912 | * get stuck waiting in the write for too long. |
2957 | */ | 2913 | */ |
2958 | if (XFS_BUF_ISPINNED(bp)) | 2914 | if (XFS_BUF_ISPINNED(bp)) |
2959 | xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); | 2915 | xfs_log_force(mp, 0); |
2960 | 2916 | ||
2961 | /* | 2917 | /* |
2962 | * inode clustering: | 2918 | * inode clustering: |
@@ -2966,13 +2922,10 @@ xfs_iflush( | |||
2966 | if (error) | 2922 | if (error) |
2967 | goto cluster_corrupt_out; | 2923 | goto cluster_corrupt_out; |
2968 | 2924 | ||
2969 | if (flags & INT_DELWRI) { | 2925 | if (flags & SYNC_WAIT) |
2970 | xfs_bdwrite(mp, bp); | ||
2971 | } else if (flags & INT_ASYNC) { | ||
2972 | error = xfs_bawrite(mp, bp); | ||
2973 | } else { | ||
2974 | error = xfs_bwrite(mp, bp); | 2926 | error = xfs_bwrite(mp, bp); |
2975 | } | 2927 | else |
2928 | xfs_bdwrite(mp, bp); | ||
2976 | return error; | 2929 | return error; |
2977 | 2930 | ||
2978 | corrupt_out: | 2931 | corrupt_out: |
@@ -3007,16 +2960,6 @@ xfs_iflush_int( | |||
3007 | iip = ip->i_itemp; | 2960 | iip = ip->i_itemp; |
3008 | mp = ip->i_mount; | 2961 | mp = ip->i_mount; |
3009 | 2962 | ||
3010 | |||
3011 | /* | ||
3012 | * If the inode isn't dirty, then just release the inode | ||
3013 | * flush lock and do nothing. | ||
3014 | */ | ||
3015 | if (xfs_inode_clean(ip)) { | ||
3016 | xfs_ifunlock(ip); | ||
3017 | return 0; | ||
3018 | } | ||
3019 | |||
3020 | /* set *dip = inode's place in the buffer */ | 2963 | /* set *dip = inode's place in the buffer */ |
3021 | dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); | 2964 | dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset); |
3022 | 2965 | ||