Commit 0924b585 authored by Dave Chinner's avatar Dave Chinner Committed by Niv Sardi

[XFS] fix uninitialised variable bug in dquot release.

gcc is warning about an uninitialised variable in xfs_growfs_rt().
This is a false positive. Fix it by changing the scope of the
transaction pointer to wholly within the internal loop inside
the function.

While there, preemptively change xfs_growfs_rt_alloc() in the
same way as it has exactly the same structure as xfs_growfs_rt()
but gcc is not warning about it. Yet.
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarNiv Sardi <xaiki@sgi.com>
parent 2e656092
...@@ -85,7 +85,6 @@ xfs_growfs_rt_alloc( ...@@ -85,7 +85,6 @@ xfs_growfs_rt_alloc(
{ {
xfs_fileoff_t bno; /* block number in file */ xfs_fileoff_t bno; /* block number in file */
xfs_buf_t *bp; /* temporary buffer for zeroing */ xfs_buf_t *bp; /* temporary buffer for zeroing */
int cancelflags; /* flags for xfs_trans_cancel */
int committed; /* transaction committed flag */ int committed; /* transaction committed flag */
xfs_daddr_t d; /* disk block address */ xfs_daddr_t d; /* disk block address */
int error; /* error return value */ int error; /* error return value */
...@@ -96,15 +95,16 @@ xfs_growfs_rt_alloc( ...@@ -96,15 +95,16 @@ xfs_growfs_rt_alloc(
xfs_bmbt_irec_t map; /* block map output */ xfs_bmbt_irec_t map; /* block map output */
int nmap; /* number of block maps */ int nmap; /* number of block maps */
int resblks; /* space reservation */ int resblks; /* space reservation */
xfs_trans_t *tp; /* transaction pointer */
/* /*
* Allocate space to the file, as necessary. * Allocate space to the file, as necessary.
*/ */
while (oblocks < nblocks) { while (oblocks < nblocks) {
int cancelflags = 0;
xfs_trans_t *tp;
tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_ALLOC); tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_ALLOC);
resblks = XFS_GROWFSRT_SPACE_RES(mp, nblocks - oblocks); resblks = XFS_GROWFSRT_SPACE_RES(mp, nblocks - oblocks);
cancelflags = 0;
/* /*
* Reserve space & log for one extent added to the file. * Reserve space & log for one extent added to the file.
*/ */
...@@ -171,7 +171,9 @@ xfs_growfs_rt_alloc( ...@@ -171,7 +171,9 @@ xfs_growfs_rt_alloc(
mp->m_bsize, 0); mp->m_bsize, 0);
if (bp == NULL) { if (bp == NULL) {
error = XFS_ERROR(EIO); error = XFS_ERROR(EIO);
goto error_cancel; error_cancel:
xfs_trans_cancel(tp, cancelflags);
goto error;
} }
memset(XFS_BUF_PTR(bp), 0, mp->m_sb.sb_blocksize); memset(XFS_BUF_PTR(bp), 0, mp->m_sb.sb_blocksize);
xfs_trans_log_buf(tp, bp, 0, mp->m_sb.sb_blocksize - 1); xfs_trans_log_buf(tp, bp, 0, mp->m_sb.sb_blocksize - 1);
...@@ -188,8 +190,6 @@ xfs_growfs_rt_alloc( ...@@ -188,8 +190,6 @@ xfs_growfs_rt_alloc(
oblocks = map.br_startoff + map.br_blockcount; oblocks = map.br_startoff + map.br_blockcount;
} }
return 0; return 0;
error_cancel:
xfs_trans_cancel(tp, cancelflags);
error: error:
return error; return error;
} }
...@@ -1856,7 +1856,6 @@ xfs_growfs_rt( ...@@ -1856,7 +1856,6 @@ xfs_growfs_rt(
{ {
xfs_rtblock_t bmbno; /* bitmap block number */ xfs_rtblock_t bmbno; /* bitmap block number */
xfs_buf_t *bp; /* temporary buffer */ xfs_buf_t *bp; /* temporary buffer */
int cancelflags; /* flags for xfs_trans_cancel */
int error; /* error return value */ int error; /* error return value */
xfs_inode_t *ip; /* bitmap inode, used as lock */ xfs_inode_t *ip; /* bitmap inode, used as lock */
xfs_mount_t *nmp; /* new (fake) mount structure */ xfs_mount_t *nmp; /* new (fake) mount structure */
...@@ -1872,10 +1871,8 @@ xfs_growfs_rt( ...@@ -1872,10 +1871,8 @@ xfs_growfs_rt(
xfs_extlen_t rsumblocks; /* current number of rt summary blks */ xfs_extlen_t rsumblocks; /* current number of rt summary blks */
xfs_sb_t *sbp; /* old superblock */ xfs_sb_t *sbp; /* old superblock */
xfs_fsblock_t sumbno; /* summary block number */ xfs_fsblock_t sumbno; /* summary block number */
xfs_trans_t *tp; /* transaction pointer */
sbp = &mp->m_sb; sbp = &mp->m_sb;
cancelflags = 0;
/* /*
* Initial error checking. * Initial error checking.
*/ */
...@@ -1942,6 +1939,9 @@ xfs_growfs_rt( ...@@ -1942,6 +1939,9 @@ xfs_growfs_rt(
((sbp->sb_rextents & ((1 << mp->m_blkbit_log) - 1)) != 0); ((sbp->sb_rextents & ((1 << mp->m_blkbit_log) - 1)) != 0);
bmbno < nrbmblocks; bmbno < nrbmblocks;
bmbno++) { bmbno++) {
xfs_trans_t *tp;
int cancelflags = 0;
*nmp = *mp; *nmp = *mp;
nsbp = &nmp->m_sb; nsbp = &nmp->m_sb;
/* /*
...@@ -1967,16 +1967,15 @@ xfs_growfs_rt( ...@@ -1967,16 +1967,15 @@ xfs_growfs_rt(
* Start a transaction, get the log reservation. * Start a transaction, get the log reservation.
*/ */
tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_FREE); tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFSRT_FREE);
cancelflags = 0;
if ((error = xfs_trans_reserve(tp, 0, if ((error = xfs_trans_reserve(tp, 0,
XFS_GROWRTFREE_LOG_RES(nmp), 0, 0, 0))) XFS_GROWRTFREE_LOG_RES(nmp), 0, 0, 0)))
break; goto error_cancel;
/* /*
* Lock out other callers by grabbing the bitmap inode lock. * Lock out other callers by grabbing the bitmap inode lock.
*/ */
if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0,
XFS_ILOCK_EXCL, &ip))) XFS_ILOCK_EXCL, &ip)))
break; goto error_cancel;
ASSERT(ip == mp->m_rbmip); ASSERT(ip == mp->m_rbmip);
/* /*
* Update the bitmap inode's size. * Update the bitmap inode's size.
...@@ -1990,7 +1989,7 @@ xfs_growfs_rt( ...@@ -1990,7 +1989,7 @@ xfs_growfs_rt(
*/ */
if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rsumino, 0, if ((error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rsumino, 0,
XFS_ILOCK_EXCL, &ip))) XFS_ILOCK_EXCL, &ip)))
break; goto error_cancel;
ASSERT(ip == mp->m_rsumip); ASSERT(ip == mp->m_rsumip);
/* /*
* Update the summary inode's size. * Update the summary inode's size.
...@@ -2005,7 +2004,7 @@ xfs_growfs_rt( ...@@ -2005,7 +2004,7 @@ xfs_growfs_rt(
mp->m_rsumlevels != nmp->m_rsumlevels) { mp->m_rsumlevels != nmp->m_rsumlevels) {
error = xfs_rtcopy_summary(mp, nmp, tp); error = xfs_rtcopy_summary(mp, nmp, tp);
if (error) if (error)
break; goto error_cancel;
} }
/* /*
* Update superblock fields. * Update superblock fields.
...@@ -2031,8 +2030,11 @@ xfs_growfs_rt( ...@@ -2031,8 +2030,11 @@ xfs_growfs_rt(
bp = NULL; bp = NULL;
error = xfs_rtfree_range(nmp, tp, sbp->sb_rextents, error = xfs_rtfree_range(nmp, tp, sbp->sb_rextents,
nsbp->sb_rextents - sbp->sb_rextents, &bp, &sumbno); nsbp->sb_rextents - sbp->sb_rextents, &bp, &sumbno);
if (error) if (error) {
error_cancel:
xfs_trans_cancel(tp, cancelflags);
break; break;
}
/* /*
* Mark more blocks free in the superblock. * Mark more blocks free in the superblock.
*/ */
...@@ -2045,15 +2047,10 @@ xfs_growfs_rt( ...@@ -2045,15 +2047,10 @@ xfs_growfs_rt(
mp->m_rsumsize = nrsumsize; mp->m_rsumsize = nrsumsize;
error = xfs_trans_commit(tp, 0); error = xfs_trans_commit(tp, 0);
if (error) { if (error)
tp = NULL;
break; break;
}
} }
if (error && tp)
xfs_trans_cancel(tp, cancelflags);
/* /*
* Free the fake mp structure. * Free the fake mp structure.
*/ */
......
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