xfs: only issues a cache flush on unmount if barriers are enabled

Currently we unconditionally issue a flush from xfs_free_buftarg, but
since 2.6.29-rc1 this gives a warning in the style of

	end_request: I/O error, dev vdb, sector 0

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Eric Sandeen <sandeen@sandeen.net>
Signed-off-by: Felix Blyakher <felixb@sgi.com>
This commit is contained in:
Christoph Hellwig 2009-03-03 14:48:37 -05:00 committed by Felix Blyakher
parent 7d46be4a25
commit c141b2928f
3 changed files with 16 additions and 8 deletions

View file

@ -34,6 +34,12 @@
#include <linux/backing-dev.h> #include <linux/backing-dev.h>
#include <linux/freezer.h> #include <linux/freezer.h>
#include "xfs_sb.h"
#include "xfs_inum.h"
#include "xfs_ag.h"
#include "xfs_dmapi.h"
#include "xfs_mount.h"
static kmem_zone_t *xfs_buf_zone; static kmem_zone_t *xfs_buf_zone;
STATIC int xfsbufd(void *); STATIC int xfsbufd(void *);
STATIC int xfsbufd_wakeup(int, gfp_t); STATIC int xfsbufd_wakeup(int, gfp_t);
@ -1435,9 +1441,11 @@ xfs_unregister_buftarg(
void void
xfs_free_buftarg( xfs_free_buftarg(
xfs_buftarg_t *btp) struct xfs_mount *mp,
struct xfs_buftarg *btp)
{ {
xfs_flush_buftarg(btp, 1); xfs_flush_buftarg(btp, 1);
if (mp->m_flags & XFS_MOUNT_BARRIER)
xfs_blkdev_issue_flush(btp); xfs_blkdev_issue_flush(btp);
xfs_free_bufhash(btp); xfs_free_bufhash(btp);
iput(btp->bt_mapping->host); iput(btp->bt_mapping->host);

View file

@ -413,7 +413,7 @@ static inline int XFS_bwrite(xfs_buf_t *bp)
* Handling of buftargs. * Handling of buftargs.
*/ */
extern xfs_buftarg_t *xfs_alloc_buftarg(struct block_device *, int); extern xfs_buftarg_t *xfs_alloc_buftarg(struct block_device *, int);
extern void xfs_free_buftarg(xfs_buftarg_t *); extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *);
extern void xfs_wait_buftarg(xfs_buftarg_t *); extern void xfs_wait_buftarg(xfs_buftarg_t *);
extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int); extern int xfs_setsize_buftarg(xfs_buftarg_t *, unsigned int, unsigned int);
extern int xfs_flush_buftarg(xfs_buftarg_t *, int); extern int xfs_flush_buftarg(xfs_buftarg_t *, int);

View file

@ -734,15 +734,15 @@ xfs_close_devices(
{ {
if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) { if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp) {
struct block_device *logdev = mp->m_logdev_targp->bt_bdev; struct block_device *logdev = mp->m_logdev_targp->bt_bdev;
xfs_free_buftarg(mp->m_logdev_targp); xfs_free_buftarg(mp, mp->m_logdev_targp);
xfs_blkdev_put(logdev); xfs_blkdev_put(logdev);
} }
if (mp->m_rtdev_targp) { if (mp->m_rtdev_targp) {
struct block_device *rtdev = mp->m_rtdev_targp->bt_bdev; struct block_device *rtdev = mp->m_rtdev_targp->bt_bdev;
xfs_free_buftarg(mp->m_rtdev_targp); xfs_free_buftarg(mp, mp->m_rtdev_targp);
xfs_blkdev_put(rtdev); xfs_blkdev_put(rtdev);
} }
xfs_free_buftarg(mp->m_ddev_targp); xfs_free_buftarg(mp, mp->m_ddev_targp);
} }
/* /*
@ -811,9 +811,9 @@ xfs_open_devices(
out_free_rtdev_targ: out_free_rtdev_targ:
if (mp->m_rtdev_targp) if (mp->m_rtdev_targp)
xfs_free_buftarg(mp->m_rtdev_targp); xfs_free_buftarg(mp, mp->m_rtdev_targp);
out_free_ddev_targ: out_free_ddev_targ:
xfs_free_buftarg(mp->m_ddev_targp); xfs_free_buftarg(mp, mp->m_ddev_targp);
out_close_rtdev: out_close_rtdev:
if (rtdev) if (rtdev)
xfs_blkdev_put(rtdev); xfs_blkdev_put(rtdev);