diff options
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_super.c')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 2302454d8d47..d2701cc624b9 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -278,6 +278,72 @@ xfs_blkdev_put( | |||
278 | close_bdev_excl(bdev); | 278 | close_bdev_excl(bdev); |
279 | } | 279 | } |
280 | 280 | ||
281 | /* | ||
282 | * Try to write out the superblock using barriers. | ||
283 | */ | ||
284 | STATIC int | ||
285 | xfs_barrier_test( | ||
286 | xfs_mount_t *mp) | ||
287 | { | ||
288 | xfs_buf_t *sbp = xfs_getsb(mp, 0); | ||
289 | int error; | ||
290 | |||
291 | XFS_BUF_UNDONE(sbp); | ||
292 | XFS_BUF_UNREAD(sbp); | ||
293 | XFS_BUF_UNDELAYWRITE(sbp); | ||
294 | XFS_BUF_WRITE(sbp); | ||
295 | XFS_BUF_UNASYNC(sbp); | ||
296 | XFS_BUF_ORDERED(sbp); | ||
297 | |||
298 | xfsbdstrat(mp, sbp); | ||
299 | error = xfs_iowait(sbp); | ||
300 | |||
301 | /* | ||
302 | * Clear all the flags we set and possible error state in the | ||
303 | * buffer. We only did the write to try out whether barriers | ||
304 | * worked and shouldn't leave any traces in the superblock | ||
305 | * buffer. | ||
306 | */ | ||
307 | XFS_BUF_DONE(sbp); | ||
308 | XFS_BUF_ERROR(sbp, 0); | ||
309 | XFS_BUF_UNORDERED(sbp); | ||
310 | |||
311 | xfs_buf_relse(sbp); | ||
312 | return error; | ||
313 | } | ||
314 | |||
315 | void | ||
316 | xfs_mountfs_check_barriers(xfs_mount_t *mp) | ||
317 | { | ||
318 | int error; | ||
319 | |||
320 | if (mp->m_logdev_targp != mp->m_ddev_targp) { | ||
321 | xfs_fs_cmn_err(CE_NOTE, mp, | ||
322 | "Disabling barriers, not supported with external log device"); | ||
323 | mp->m_flags &= ~XFS_MOUNT_BARRIER; | ||
324 | } | ||
325 | |||
326 | if (mp->m_ddev_targp->pbr_bdev->bd_disk->queue->ordered == | ||
327 | QUEUE_ORDERED_NONE) { | ||
328 | xfs_fs_cmn_err(CE_NOTE, mp, | ||
329 | "Disabling barriers, not supported by the underlying device"); | ||
330 | mp->m_flags &= ~XFS_MOUNT_BARRIER; | ||
331 | } | ||
332 | |||
333 | error = xfs_barrier_test(mp); | ||
334 | if (error) { | ||
335 | xfs_fs_cmn_err(CE_NOTE, mp, | ||
336 | "Disabling barriers, trial barrier write failed"); | ||
337 | mp->m_flags &= ~XFS_MOUNT_BARRIER; | ||
338 | } | ||
339 | } | ||
340 | |||
341 | void | ||
342 | xfs_blkdev_issue_flush( | ||
343 | xfs_buftarg_t *buftarg) | ||
344 | { | ||
345 | blkdev_issue_flush(buftarg->pbr_bdev, NULL); | ||
346 | } | ||
281 | 347 | ||
282 | STATIC struct inode * | 348 | STATIC struct inode * |
283 | linvfs_alloc_inode( | 349 | linvfs_alloc_inode( |