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:
parent
7d46be4a25
commit
c141b2928f
3 changed files with 16 additions and 8 deletions
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue