diff options
-rw-r--r-- | fs/xfs/xfs_buf.c | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index 170d6c0afe71..0eee0f1f099e 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c | |||
@@ -1146,27 +1146,6 @@ xfs_bioerror_relse( | |||
1146 | return -EIO; | 1146 | return -EIO; |
1147 | } | 1147 | } |
1148 | 1148 | ||
1149 | STATIC int | ||
1150 | xfs_bdstrat_cb( | ||
1151 | struct xfs_buf *bp) | ||
1152 | { | ||
1153 | if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { | ||
1154 | trace_xfs_bdstrat_shut(bp, _RET_IP_); | ||
1155 | /* | ||
1156 | * Metadata write that didn't get logged but | ||
1157 | * written delayed anyway. These aren't associated | ||
1158 | * with a transaction, and can be ignored. | ||
1159 | */ | ||
1160 | if (!bp->b_iodone && !XFS_BUF_ISREAD(bp)) | ||
1161 | return xfs_bioerror_relse(bp); | ||
1162 | else | ||
1163 | return xfs_bioerror(bp); | ||
1164 | } | ||
1165 | |||
1166 | xfs_buf_iorequest(bp); | ||
1167 | return 0; | ||
1168 | } | ||
1169 | |||
1170 | int | 1149 | int |
1171 | xfs_bwrite( | 1150 | xfs_bwrite( |
1172 | struct xfs_buf *bp) | 1151 | struct xfs_buf *bp) |
@@ -1178,7 +1157,20 @@ xfs_bwrite( | |||
1178 | bp->b_flags |= XBF_WRITE; | 1157 | bp->b_flags |= XBF_WRITE; |
1179 | bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q | XBF_WRITE_FAIL); | 1158 | bp->b_flags &= ~(XBF_ASYNC | XBF_READ | _XBF_DELWRI_Q | XBF_WRITE_FAIL); |
1180 | 1159 | ||
1181 | xfs_bdstrat_cb(bp); | 1160 | if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { |
1161 | trace_xfs_bdstrat_shut(bp, _RET_IP_); | ||
1162 | |||
1163 | /* | ||
1164 | * Metadata write that didn't get logged but written anyway. | ||
1165 | * These aren't associated with a transaction, and can be | ||
1166 | * ignored. | ||
1167 | */ | ||
1168 | if (!bp->b_iodone) | ||
1169 | return xfs_bioerror_relse(bp); | ||
1170 | return xfs_bioerror(bp); | ||
1171 | } | ||
1172 | |||
1173 | xfs_buf_iorequest(bp); | ||
1182 | 1174 | ||
1183 | error = xfs_buf_iowait(bp); | 1175 | error = xfs_buf_iowait(bp); |
1184 | if (error) { | 1176 | if (error) { |
@@ -1861,7 +1853,17 @@ __xfs_buf_delwri_submit( | |||
1861 | xfs_buf_hold(bp); | 1853 | xfs_buf_hold(bp); |
1862 | else | 1854 | else |
1863 | list_del_init(&bp->b_list); | 1855 | list_del_init(&bp->b_list); |
1864 | xfs_bdstrat_cb(bp); | 1856 | |
1857 | if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) { | ||
1858 | trace_xfs_bdstrat_shut(bp, _RET_IP_); | ||
1859 | |||
1860 | if (!bp->b_iodone) | ||
1861 | xfs_bioerror_relse(bp); | ||
1862 | else | ||
1863 | xfs_bioerror(bp); | ||
1864 | continue; | ||
1865 | } | ||
1866 | xfs_buf_iorequest(bp); | ||
1865 | } | 1867 | } |
1866 | blk_finish_plug(&plug); | 1868 | blk_finish_plug(&plug); |
1867 | 1869 | ||