Commit ebad861b authored by Dave Chinner's avatar Dave Chinner Committed by Alex Elder
Browse files

xfs: store xfs_mount in the buftarg instead of in the xfs_buf


Each buffer contains both a buftarg pointer and a mount pointer. If
we add a mount pointer into the buftarg, we can avoid needing the
b_mount field in every buffer and grab it from the buftarg when
needed instead. This shrinks the xfs_buf by 8 bytes.
Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarAlex Elder <aelder@sgi.com>
parent 5adc94c2
...@@ -894,7 +894,7 @@ xfs_buf_lock( ...@@ -894,7 +894,7 @@ xfs_buf_lock(
trace_xfs_buf_lock(bp, _RET_IP_); trace_xfs_buf_lock(bp, _RET_IP_);
if (atomic_read(&bp->b_pin_count) && (bp->b_flags & XBF_STALE)) if (atomic_read(&bp->b_pin_count) && (bp->b_flags & XBF_STALE))
xfs_log_force(bp->b_mount, 0); xfs_log_force(bp->b_target->bt_mount, 0);
if (atomic_read(&bp->b_io_remaining)) if (atomic_read(&bp->b_io_remaining))
blk_run_address_space(bp->b_target->bt_mapping); blk_run_address_space(bp->b_target->bt_mapping);
down(&bp->b_sema); down(&bp->b_sema);
...@@ -1017,7 +1017,6 @@ xfs_bwrite( ...@@ -1017,7 +1017,6 @@ xfs_bwrite(
{ {
int error; int error;
bp->b_mount = mp;
bp->b_flags |= XBF_WRITE; bp->b_flags |= XBF_WRITE;
bp->b_flags &= ~(XBF_ASYNC | XBF_READ); bp->b_flags &= ~(XBF_ASYNC | XBF_READ);
...@@ -1038,8 +1037,6 @@ xfs_bdwrite( ...@@ -1038,8 +1037,6 @@ xfs_bdwrite(
{ {
trace_xfs_buf_bdwrite(bp, _RET_IP_); trace_xfs_buf_bdwrite(bp, _RET_IP_);
bp->b_mount = mp;
bp->b_flags &= ~XBF_READ; bp->b_flags &= ~XBF_READ;
bp->b_flags |= (XBF_DELWRI | XBF_ASYNC); bp->b_flags |= (XBF_DELWRI | XBF_ASYNC);
...@@ -1128,7 +1125,7 @@ int ...@@ -1128,7 +1125,7 @@ int
xfs_bdstrat_cb( xfs_bdstrat_cb(
struct xfs_buf *bp) struct xfs_buf *bp)
{ {
if (XFS_FORCED_SHUTDOWN(bp->b_mount)) { if (XFS_FORCED_SHUTDOWN(bp->b_target->bt_mount)) {
trace_xfs_bdstrat_shut(bp, _RET_IP_); trace_xfs_bdstrat_shut(bp, _RET_IP_);
/* /*
* Metadata write that didn't get logged but * Metadata write that didn't get logged but
...@@ -1644,6 +1641,7 @@ xfs_alloc_delwrite_queue( ...@@ -1644,6 +1641,7 @@ xfs_alloc_delwrite_queue(
xfs_buftarg_t * xfs_buftarg_t *
xfs_alloc_buftarg( xfs_alloc_buftarg(
struct xfs_mount *mp,
struct block_device *bdev, struct block_device *bdev,
int external, int external,
const char *fsname) const char *fsname)
...@@ -1652,6 +1650,7 @@ xfs_alloc_buftarg( ...@@ -1652,6 +1650,7 @@ xfs_alloc_buftarg(
btp = kmem_zalloc(sizeof(*btp), KM_SLEEP); btp = kmem_zalloc(sizeof(*btp), KM_SLEEP);
btp->bt_mount = mp;
btp->bt_dev = bdev->bd_dev; btp->bt_dev = bdev->bd_dev;
btp->bt_bdev = bdev; btp->bt_bdev = bdev;
if (xfs_setsize_buftarg_early(btp, bdev)) if (xfs_setsize_buftarg_early(btp, bdev))
......
...@@ -132,6 +132,7 @@ typedef struct xfs_buftarg { ...@@ -132,6 +132,7 @@ typedef struct xfs_buftarg {
dev_t bt_dev; dev_t bt_dev;
struct block_device *bt_bdev; struct block_device *bt_bdev;
struct address_space *bt_mapping; struct address_space *bt_mapping;
struct xfs_mount *bt_mount;
unsigned int bt_bsize; unsigned int bt_bsize;
unsigned int bt_sshift; unsigned int bt_sshift;
size_t bt_smask; size_t bt_smask;
...@@ -189,7 +190,6 @@ typedef struct xfs_buf { ...@@ -189,7 +190,6 @@ typedef struct xfs_buf {
struct completion b_iowait; /* queue for I/O waiters */ struct completion b_iowait; /* queue for I/O waiters */
void *b_fspriv; void *b_fspriv;
void *b_fspriv2; void *b_fspriv2;
struct xfs_mount *b_mount;
unsigned short b_error; /* error code on I/O */ unsigned short b_error; /* error code on I/O */
unsigned int b_page_count; /* size of page array */ unsigned int b_page_count; /* size of page array */
unsigned int b_offset; /* page offset in first page */ unsigned int b_offset; /* page offset in first page */
...@@ -377,7 +377,8 @@ static inline void xfs_buf_relse(xfs_buf_t *bp) ...@@ -377,7 +377,8 @@ static inline void xfs_buf_relse(xfs_buf_t *bp)
/* /*
* Handling of buftargs. * Handling of buftargs.
*/ */
extern xfs_buftarg_t *xfs_alloc_buftarg(struct block_device *, int, const char *); extern xfs_buftarg_t *xfs_alloc_buftarg(struct xfs_mount *,
struct block_device *, int, const char *);
extern void xfs_free_buftarg(struct xfs_mount *, struct xfs_buftarg *); 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);
......
...@@ -758,18 +758,20 @@ xfs_open_devices( ...@@ -758,18 +758,20 @@ xfs_open_devices(
* Setup xfs_mount buffer target pointers * Setup xfs_mount buffer target pointers
*/ */
error = ENOMEM; error = ENOMEM;
mp->m_ddev_targp = xfs_alloc_buftarg(ddev, 0, mp->m_fsname); mp->m_ddev_targp = xfs_alloc_buftarg(mp, ddev, 0, mp->m_fsname);
if (!mp->m_ddev_targp) if (!mp->m_ddev_targp)
goto out_close_rtdev; goto out_close_rtdev;
if (rtdev) { if (rtdev) {
mp->m_rtdev_targp = xfs_alloc_buftarg(rtdev, 1, mp->m_fsname); mp->m_rtdev_targp = xfs_alloc_buftarg(mp, rtdev, 1,
mp->m_fsname);
if (!mp->m_rtdev_targp) if (!mp->m_rtdev_targp)
goto out_free_ddev_targ; goto out_free_ddev_targ;
} }
if (logdev && logdev != ddev) { if (logdev && logdev != ddev) {
mp->m_logdev_targp = xfs_alloc_buftarg(logdev, 1, mp->m_fsname); mp->m_logdev_targp = xfs_alloc_buftarg(mp, logdev, 1,
mp->m_fsname);
if (!mp->m_logdev_targp) if (!mp->m_logdev_targp)
goto out_free_rtdev_targ; goto out_free_rtdev_targ;
} else { } else {
......
...@@ -692,8 +692,7 @@ xfs_buf_item_init( ...@@ -692,8 +692,7 @@ xfs_buf_item_init(
* the first. If we do already have one, there is * the first. If we do already have one, there is
* nothing to do here so return. * nothing to do here so return.
*/ */
if (bp->b_mount != mp) ASSERT(bp->b_target->bt_mount == mp);
bp->b_mount = mp;
if (XFS_BUF_FSPRIVATE(bp, void *) != NULL) { if (XFS_BUF_FSPRIVATE(bp, void *) != NULL) {
lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *);
if (lip->li_type == XFS_LI_BUF) { if (lip->li_type == XFS_LI_BUF) {
......
...@@ -322,10 +322,11 @@ xlog_recover_iodone( ...@@ -322,10 +322,11 @@ xlog_recover_iodone(
* this during recovery. One strike! * this during recovery. One strike!
*/ */
xfs_ioerror_alert("xlog_recover_iodone", xfs_ioerror_alert("xlog_recover_iodone",
bp->b_mount, bp, XFS_BUF_ADDR(bp)); bp->b_target->bt_mount, bp,
xfs_force_shutdown(bp->b_mount, SHUTDOWN_META_IO_ERROR); XFS_BUF_ADDR(bp));
xfs_force_shutdown(bp->b_target->bt_mount,
SHUTDOWN_META_IO_ERROR);
} }
bp->b_mount = NULL;
XFS_BUF_CLR_IODONE_FUNC(bp); XFS_BUF_CLR_IODONE_FUNC(bp);
xfs_biodone(bp); xfs_biodone(bp);
} }
...@@ -2276,8 +2277,7 @@ xlog_recover_do_buffer_trans( ...@@ -2276,8 +2277,7 @@ xlog_recover_do_buffer_trans(
XFS_BUF_STALE(bp); XFS_BUF_STALE(bp);
error = xfs_bwrite(mp, bp); error = xfs_bwrite(mp, bp);
} else { } else {
ASSERT(bp->b_mount == NULL || bp->b_mount == mp); ASSERT(bp->b_target->bt_mount == mp);
bp->b_mount = mp;
XFS_BUF_SET_IODONE_FUNC(bp, xlog_recover_iodone); XFS_BUF_SET_IODONE_FUNC(bp, xlog_recover_iodone);
xfs_bdwrite(mp, bp); xfs_bdwrite(mp, bp);
} }
...@@ -2541,8 +2541,7 @@ xlog_recover_do_inode_trans( ...@@ -2541,8 +2541,7 @@ xlog_recover_do_inode_trans(
} }
write_inode_buffer: write_inode_buffer:
ASSERT(bp->b_mount == NULL || bp->b_mount == mp); ASSERT(bp->b_target->bt_mount == mp);
bp->b_mount = mp;
XFS_BUF_SET_IODONE_FUNC(bp, xlog_recover_iodone); XFS_BUF_SET_IODONE_FUNC(bp, xlog_recover_iodone);
xfs_bdwrite(mp, bp); xfs_bdwrite(mp, bp);
error: error:
...@@ -2679,8 +2678,7 @@ xlog_recover_do_dquot_trans( ...@@ -2679,8 +2678,7 @@ xlog_recover_do_dquot_trans(
memcpy(ddq, recddq, item->ri_buf[1].i_len); memcpy(ddq, recddq, item->ri_buf[1].i_len);
ASSERT(dq_f->qlf_size == 2); ASSERT(dq_f->qlf_size == 2);
ASSERT(bp->b_mount == NULL || bp->b_mount == mp); ASSERT(bp->b_target->bt_mount == mp);
bp->b_mount = mp;
XFS_BUF_SET_IODONE_FUNC(bp, xlog_recover_iodone); XFS_BUF_SET_IODONE_FUNC(bp, xlog_recover_iodone);
xfs_bdwrite(mp, bp); xfs_bdwrite(mp, bp);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment