diff options
Diffstat (limited to 'fs/xfs/xfs_vnodeops.c')
-rw-r--r-- | fs/xfs/xfs_vnodeops.c | 90 |
1 files changed, 0 insertions, 90 deletions
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 7fb577c9f9d8..cdcc835bc5a5 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
@@ -2849,96 +2849,6 @@ xfs_reclaim( | |||
2849 | return 0; | 2849 | return 0; |
2850 | } | 2850 | } |
2851 | 2851 | ||
2852 | int | ||
2853 | xfs_finish_reclaim( | ||
2854 | xfs_inode_t *ip, | ||
2855 | int locked, | ||
2856 | int sync_mode) | ||
2857 | { | ||
2858 | xfs_perag_t *pag = xfs_get_perag(ip->i_mount, ip->i_ino); | ||
2859 | |||
2860 | /* The hash lock here protects a thread in xfs_iget_core from | ||
2861 | * racing with us on linking the inode back with a vnode. | ||
2862 | * Once we have the XFS_IRECLAIM flag set it will not touch | ||
2863 | * us. | ||
2864 | */ | ||
2865 | write_lock(&pag->pag_ici_lock); | ||
2866 | spin_lock(&ip->i_flags_lock); | ||
2867 | if (__xfs_iflags_test(ip, XFS_IRECLAIM) || | ||
2868 | !__xfs_iflags_test(ip, XFS_IRECLAIMABLE)) { | ||
2869 | spin_unlock(&ip->i_flags_lock); | ||
2870 | write_unlock(&pag->pag_ici_lock); | ||
2871 | if (locked) { | ||
2872 | xfs_ifunlock(ip); | ||
2873 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | ||
2874 | } | ||
2875 | return 1; | ||
2876 | } | ||
2877 | __xfs_iflags_set(ip, XFS_IRECLAIM); | ||
2878 | spin_unlock(&ip->i_flags_lock); | ||
2879 | write_unlock(&pag->pag_ici_lock); | ||
2880 | xfs_put_perag(ip->i_mount, pag); | ||
2881 | |||
2882 | /* | ||
2883 | * If the inode is still dirty, then flush it out. If the inode | ||
2884 | * is not in the AIL, then it will be OK to flush it delwri as | ||
2885 | * long as xfs_iflush() does not keep any references to the inode. | ||
2886 | * We leave that decision up to xfs_iflush() since it has the | ||
2887 | * knowledge of whether it's OK to simply do a delwri flush of | ||
2888 | * the inode or whether we need to wait until the inode is | ||
2889 | * pulled from the AIL. | ||
2890 | * We get the flush lock regardless, though, just to make sure | ||
2891 | * we don't free it while it is being flushed. | ||
2892 | */ | ||
2893 | if (!locked) { | ||
2894 | xfs_ilock(ip, XFS_ILOCK_EXCL); | ||
2895 | xfs_iflock(ip); | ||
2896 | } | ||
2897 | |||
2898 | /* | ||
2899 | * In the case of a forced shutdown we rely on xfs_iflush() to | ||
2900 | * wait for the inode to be unpinned before returning an error. | ||
2901 | */ | ||
2902 | if (!is_bad_inode(VFS_I(ip)) && xfs_iflush(ip, sync_mode) == 0) { | ||
2903 | /* synchronize with xfs_iflush_done */ | ||
2904 | xfs_iflock(ip); | ||
2905 | xfs_ifunlock(ip); | ||
2906 | } | ||
2907 | |||
2908 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | ||
2909 | xfs_ireclaim(ip); | ||
2910 | return 0; | ||
2911 | } | ||
2912 | |||
2913 | int | ||
2914 | xfs_finish_reclaim_all( | ||
2915 | xfs_mount_t *mp, | ||
2916 | int noblock, | ||
2917 | int mode) | ||
2918 | { | ||
2919 | xfs_inode_t *ip, *n; | ||
2920 | |||
2921 | restart: | ||
2922 | XFS_MOUNT_ILOCK(mp); | ||
2923 | list_for_each_entry_safe(ip, n, &mp->m_del_inodes, i_reclaim) { | ||
2924 | if (noblock) { | ||
2925 | if (xfs_ilock_nowait(ip, XFS_ILOCK_EXCL) == 0) | ||
2926 | continue; | ||
2927 | if (xfs_ipincount(ip) || | ||
2928 | !xfs_iflock_nowait(ip)) { | ||
2929 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | ||
2930 | continue; | ||
2931 | } | ||
2932 | } | ||
2933 | XFS_MOUNT_IUNLOCK(mp); | ||
2934 | if (xfs_finish_reclaim(ip, noblock, mode)) | ||
2935 | delay(1); | ||
2936 | goto restart; | ||
2937 | } | ||
2938 | XFS_MOUNT_IUNLOCK(mp); | ||
2939 | return 0; | ||
2940 | } | ||
2941 | |||
2942 | /* | 2852 | /* |
2943 | * xfs_alloc_file_space() | 2853 | * xfs_alloc_file_space() |
2944 | * This routine allocates disk space for the given file. | 2854 | * This routine allocates disk space for the given file. |