Skip to content

Commit

Permalink
xfs: growfs: don't read garbage for new secondary superblocks
Browse files Browse the repository at this point in the history
When updating new secondary superblocks in a growfs operation, the
superblock buffer is read from the newly grown region of the
underlying device. This is not guaranteed to be zero, so violates
the underlying assumption that the unused parts of superblocks are
zero filled. Get a new buffer for these secondary superblocks to
ensure that the unused regions are zero filled correctly.

Signed-off-by: Dave Chinner <[email protected]>
Reviewed-by: Carlos Maiolino <[email protected]>
Signed-off-by: Ben Myers <[email protected]>
  • Loading branch information
Dave Chinner authored and Ben Myers committed Nov 8, 2012
1 parent 1f3c785 commit eaef854
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions fs/xfs/xfs_fsops.c
Original file line number Diff line number Diff line change
Expand Up @@ -399,9 +399,26 @@ xfs_growfs_data_private(

/* update secondary superblocks. */
for (agno = 1; agno < nagcount; agno++) {
error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp,
error = 0;
/*
* new secondary superblocks need to be zeroed, not read from
* disk as the contents of the new area we are growing into is
* completely unknown.
*/
if (agno < oagcount) {
error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp,
XFS_AGB_TO_DADDR(mp, agno, XFS_SB_BLOCK(mp)),
XFS_FSS_TO_BB(mp, 1), 0, &bp);
} else {
bp = xfs_trans_get_buf(NULL, mp->m_ddev_targp,
XFS_AGB_TO_DADDR(mp, agno, XFS_SB_BLOCK(mp)),
XFS_FSS_TO_BB(mp, 1), 0);
if (bp)
xfs_buf_zero(bp, 0, BBTOB(bp->b_length));
else
error = ENOMEM;
}

if (error) {
xfs_warn(mp,
"error %d reading secondary superblock for ag %d",
Expand All @@ -423,7 +440,7 @@ xfs_growfs_data_private(
break; /* no point in continuing */
}
}
return 0;
return error;

error0:
xfs_trans_cancel(tp, XFS_TRANS_ABORT);
Expand Down

0 comments on commit eaef854

Please sign in to comment.