Commit c2b006c1 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Alex Elder

xfs: let xfs_bwrite callers handle the xfs_buf_relse

Remove the xfs_buf_relse from xfs_bwrite and let the caller handle it to
mirror the delwri and read paths.

Also remove the mount pointer passed to xfs_bwrite, which is superflous now
that we have a mount pointer in the buftarg.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Signed-off-by: default avatarAlex Elder <aelder@sgi.com>
parent 61551f1e
...@@ -2128,9 +2128,10 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) ...@@ -2128,9 +2128,10 @@ xfs_attr_rmtval_set(xfs_da_args_t *args)
xfs_buf_iomove(bp, 0, tmp, src, XBRW_WRITE); xfs_buf_iomove(bp, 0, tmp, src, XBRW_WRITE);
if (tmp < XFS_BUF_SIZE(bp)) if (tmp < XFS_BUF_SIZE(bp))
xfs_buf_zero(bp, tmp, XFS_BUF_SIZE(bp) - tmp); xfs_buf_zero(bp, tmp, XFS_BUF_SIZE(bp) - tmp);
if ((error = xfs_bwrite(mp, bp))) {/* GROT: NOTE: synchronous write */ error = xfs_bwrite(bp); /* GROT: NOTE: synchronous write */
return (error); xfs_buf_relse(bp);
} if (error)
return error;
src += tmp; src += tmp;
valuelen -= tmp; valuelen -= tmp;
......
...@@ -1014,7 +1014,6 @@ xfs_buf_ioerror( ...@@ -1014,7 +1014,6 @@ xfs_buf_ioerror(
int int
xfs_bwrite( xfs_bwrite(
struct xfs_mount *mp,
struct xfs_buf *bp) struct xfs_buf *bp)
{ {
int error; int error;
...@@ -1026,9 +1025,10 @@ xfs_bwrite( ...@@ -1026,9 +1025,10 @@ xfs_bwrite(
xfs_bdstrat_cb(bp); xfs_bdstrat_cb(bp);
error = xfs_buf_iowait(bp); error = xfs_buf_iowait(bp);
if (error) if (error) {
xfs_force_shutdown(mp, SHUTDOWN_META_IO_ERROR); xfs_force_shutdown(bp->b_target->bt_mount,
xfs_buf_relse(bp); SHUTDOWN_META_IO_ERROR);
}
return error; return error;
} }
......
...@@ -197,7 +197,7 @@ extern void xfs_buf_unlock(xfs_buf_t *); ...@@ -197,7 +197,7 @@ extern void xfs_buf_unlock(xfs_buf_t *);
((bp)->b_sema.count <= 0) ((bp)->b_sema.count <= 0)
/* Buffer Read and Write Routines */ /* Buffer Read and Write Routines */
extern int xfs_bwrite(struct xfs_mount *mp, struct xfs_buf *bp); extern int xfs_bwrite(struct xfs_buf *bp);
extern void xfsbdstrat(struct xfs_mount *, struct xfs_buf *); extern void xfsbdstrat(struct xfs_mount *, struct xfs_buf *);
extern int xfs_bdstrat_cb(struct xfs_buf *); extern int xfs_bdstrat_cb(struct xfs_buf *);
......
...@@ -1242,11 +1242,11 @@ xfs_qm_dqflush( ...@@ -1242,11 +1242,11 @@ xfs_qm_dqflush(
} }
if (flags & SYNC_WAIT) if (flags & SYNC_WAIT)
error = xfs_bwrite(mp, bp); error = xfs_bwrite(bp);
else { else
xfs_buf_delwri_queue(bp); xfs_buf_delwri_queue(bp);
xfs_buf_relse(bp);
} xfs_buf_relse(bp);
trace_xfs_dqflush_done(dqp); trace_xfs_dqflush_done(dqp);
......
...@@ -216,10 +216,11 @@ xfs_growfs_data_private( ...@@ -216,10 +216,11 @@ xfs_growfs_data_private(
tmpsize = agsize - XFS_PREALLOC_BLOCKS(mp); tmpsize = agsize - XFS_PREALLOC_BLOCKS(mp);
agf->agf_freeblks = cpu_to_be32(tmpsize); agf->agf_freeblks = cpu_to_be32(tmpsize);
agf->agf_longest = cpu_to_be32(tmpsize); agf->agf_longest = cpu_to_be32(tmpsize);
error = xfs_bwrite(mp, bp); error = xfs_bwrite(bp);
if (error) { xfs_buf_relse(bp);
if (error)
goto error0; goto error0;
}
/* /*
* AG inode header block * AG inode header block
*/ */
...@@ -240,10 +241,11 @@ xfs_growfs_data_private( ...@@ -240,10 +241,11 @@ xfs_growfs_data_private(
agi->agi_dirino = cpu_to_be32(NULLAGINO); agi->agi_dirino = cpu_to_be32(NULLAGINO);
for (bucket = 0; bucket < XFS_AGI_UNLINKED_BUCKETS; bucket++) for (bucket = 0; bucket < XFS_AGI_UNLINKED_BUCKETS; bucket++)
agi->agi_unlinked[bucket] = cpu_to_be32(NULLAGINO); agi->agi_unlinked[bucket] = cpu_to_be32(NULLAGINO);
error = xfs_bwrite(mp, bp); error = xfs_bwrite(bp);
if (error) { xfs_buf_relse(bp);
if (error)
goto error0; goto error0;
}
/* /*
* BNO btree root block * BNO btree root block
*/ */
...@@ -262,10 +264,11 @@ xfs_growfs_data_private( ...@@ -262,10 +264,11 @@ xfs_growfs_data_private(
arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp));
arec->ar_blockcount = cpu_to_be32( arec->ar_blockcount = cpu_to_be32(
agsize - be32_to_cpu(arec->ar_startblock)); agsize - be32_to_cpu(arec->ar_startblock));
error = xfs_bwrite(mp, bp); error = xfs_bwrite(bp);
if (error) { xfs_buf_relse(bp);
if (error)
goto error0; goto error0;
}
/* /*
* CNT btree root block * CNT btree root block
*/ */
...@@ -285,10 +288,11 @@ xfs_growfs_data_private( ...@@ -285,10 +288,11 @@ xfs_growfs_data_private(
arec->ar_blockcount = cpu_to_be32( arec->ar_blockcount = cpu_to_be32(
agsize - be32_to_cpu(arec->ar_startblock)); agsize - be32_to_cpu(arec->ar_startblock));
nfree += be32_to_cpu(arec->ar_blockcount); nfree += be32_to_cpu(arec->ar_blockcount);
error = xfs_bwrite(mp, bp); error = xfs_bwrite(bp);
if (error) { xfs_buf_relse(bp);
if (error)
goto error0; goto error0;
}
/* /*
* INO btree root block * INO btree root block
*/ */
...@@ -303,10 +307,10 @@ xfs_growfs_data_private( ...@@ -303,10 +307,10 @@ xfs_growfs_data_private(
block->bb_numrecs = 0; block->bb_numrecs = 0;
block->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK); block->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK);
block->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK); block->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK);
error = xfs_bwrite(mp, bp); error = xfs_bwrite(bp);
if (error) { xfs_buf_relse(bp);
if (error)
goto error0; goto error0;
}
} }
xfs_trans_agblocks_delta(tp, nfree); xfs_trans_agblocks_delta(tp, nfree);
/* /*
...@@ -396,9 +400,9 @@ xfs_growfs_data_private( ...@@ -396,9 +400,9 @@ xfs_growfs_data_private(
* just issue a warning and continue. The real work is * just issue a warning and continue. The real work is
* already done and committed. * already done and committed.
*/ */
if (!(error = xfs_bwrite(mp, bp))) { error = xfs_bwrite(bp);
continue; xfs_buf_relse(bp);
} else { if (error) {
xfs_warn(mp, xfs_warn(mp,
"write error %d updating secondary superblock for ag %d", "write error %d updating secondary superblock for ag %d",
error, agno); error, agno);
......
...@@ -2597,11 +2597,11 @@ xfs_iflush( ...@@ -2597,11 +2597,11 @@ xfs_iflush(
goto cluster_corrupt_out; goto cluster_corrupt_out;
if (flags & SYNC_WAIT) if (flags & SYNC_WAIT)
error = xfs_bwrite(mp, bp); error = xfs_bwrite(bp);
else { else
xfs_buf_delwri_queue(bp); xfs_buf_delwri_queue(bp);
xfs_buf_relse(bp);
} xfs_buf_relse(bp);
return error; return error;
corrupt_out: corrupt_out:
......
...@@ -268,9 +268,12 @@ xlog_bwrite( ...@@ -268,9 +268,12 @@ xlog_bwrite(
xfs_buf_lock(bp); xfs_buf_lock(bp);
XFS_BUF_SET_COUNT(bp, BBTOB(nbblks)); XFS_BUF_SET_COUNT(bp, BBTOB(nbblks));
if ((error = xfs_bwrite(log->l_mp, bp))) error = xfs_bwrite(bp);
if (error) {
xfs_ioerror_alert("xlog_bwrite", log->l_mp, xfs_ioerror_alert("xlog_bwrite", log->l_mp,
bp, XFS_BUF_ADDR(bp)); bp, XFS_BUF_ADDR(bp));
}
xfs_buf_relse(bp);
return error; return error;
} }
...@@ -2172,15 +2175,15 @@ xlog_recover_buffer_pass2( ...@@ -2172,15 +2175,15 @@ xlog_recover_buffer_pass2(
(XFS_BUF_COUNT(bp) != MAX(log->l_mp->m_sb.sb_blocksize, (XFS_BUF_COUNT(bp) != MAX(log->l_mp->m_sb.sb_blocksize,
(__uint32_t)XFS_INODE_CLUSTER_SIZE(log->l_mp)))) { (__uint32_t)XFS_INODE_CLUSTER_SIZE(log->l_mp)))) {
XFS_BUF_STALE(bp); XFS_BUF_STALE(bp);
error = xfs_bwrite(mp, bp); error = xfs_bwrite(bp);
} else { } else {
ASSERT(bp->b_target->bt_mount == mp); ASSERT(bp->b_target->bt_mount == mp);
bp->b_iodone = xlog_recover_iodone; bp->b_iodone = xlog_recover_iodone;
xfs_buf_delwri_queue(bp); xfs_buf_delwri_queue(bp);
xfs_buf_relse(bp);
} }
return (error); xfs_buf_relse(bp);
return error;
} }
STATIC int STATIC int
......
...@@ -322,6 +322,7 @@ xfs_sync_fsdata( ...@@ -322,6 +322,7 @@ xfs_sync_fsdata(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
struct xfs_buf *bp; struct xfs_buf *bp;
int error;
/* /*
* If the buffer is pinned then push on the log so we won't get stuck * If the buffer is pinned then push on the log so we won't get stuck
...@@ -334,8 +335,9 @@ xfs_sync_fsdata( ...@@ -334,8 +335,9 @@ xfs_sync_fsdata(
bp = xfs_getsb(mp, 0); bp = xfs_getsb(mp, 0);
if (xfs_buf_ispinned(bp)) if (xfs_buf_ispinned(bp))
xfs_log_force(mp, 0); xfs_log_force(mp, 0);
error = xfs_bwrite(bp);
return xfs_bwrite(mp, bp); xfs_buf_relse(bp);
return error;
} }
/* /*
......
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