Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c141b292 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Felix Blyakher
Browse files

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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarEric Sandeen <sandeen@sandeen.net>
Signed-off-by: default avatarFelix Blyakher <felixb@sgi.com>
parent 7d46be4a
Loading
Loading
Loading
Loading
+10 −2
Original line number Original line Diff line number Diff line
@@ -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);
+1 −1
Original line number Original line Diff line number Diff line
@@ -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);
+5 −5
Original line number Original line Diff line number Diff line
@@ -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);