On 2/28/14, 12:25 AM, Dave Chinner wrote: > From: Dave Chinner <dchinner@xxxxxxxxxx> > > On crc enabled filesystems with obfuscation enabled we need to be > able to recalculate the CRCs on individual buffers. > process_single_fsb_objects() reads a contiguous range of single > block objects as a singel buffer, and hence we cannot correctly > recalculate the CRCs on them. > > Split the loop up into individual buffer reads, processing and > writes rather than a single read, multiple block processing and a > single write. > > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> Looks good to me. Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx> > --- > db/metadump.c | 46 ++++++++++++++++++++++++---------------------- > 1 file changed, 24 insertions(+), 22 deletions(-) > > diff --git a/db/metadump.c b/db/metadump.c > index 5baf83d..14902a7 100644 > --- a/db/metadump.c > +++ b/db/metadump.c > @@ -1331,29 +1331,27 @@ process_single_fsb_objects( > int ret = 0; > int i; > > - push_cur(); > - set_cur(&typtab[btype], XFS_FSB_TO_DADDR(mp, s), c * blkbb, > - DB_RING_IGN, NULL); > + for (i = 0; i < c; i++) { > + push_cur(); > + set_cur(&typtab[btype], XFS_FSB_TO_DADDR(mp, s), blkbb, > + DB_RING_IGN, NULL); > > - if (!iocur_top->data) { > - xfs_agnumber_t agno = XFS_FSB_TO_AGNO(mp, s); > - xfs_agblock_t agbno = XFS_FSB_TO_AGBNO(mp, s); > + if (!iocur_top->data) { > + xfs_agnumber_t agno = XFS_FSB_TO_AGNO(mp, s); > + xfs_agblock_t agbno = XFS_FSB_TO_AGBNO(mp, s); > > - print_warning("cannot read %s block %u/%u (%llu)", > - typtab[btype].name, agno, agbno, s); > - if (stop_on_read_error) > - ret = -EIO; > - goto out_pop; > + print_warning("cannot read %s block %u/%u (%llu)", > + typtab[btype].name, agno, agbno, s); > + if (stop_on_read_error) > + ret = -EIO; > + goto out_pop; > > - } > + } > > - if (dont_obfuscate) { > - ret = write_buf(iocur_top); > - goto out_pop; > - } > + if (dont_obfuscate) > + goto write; > > - dp = iocur_top->data; > - for (i = 0; i < c; i++) { > + dp = iocur_top->data; > switch (btype) { > case TYP_DIR2: > if (o >= mp->m_dirleafblk) > @@ -1371,13 +1369,17 @@ process_single_fsb_objects( > default: > break; > } > + > +write: > + ret = write_buf(iocur_top); > +out_pop: > + pop_cur(); > + if (ret) > + break; > o++; > - dp += mp->m_sb.sb_blocksize; > + s++; > } > - ret = write_buf(iocur_top); > > -out_pop: > - pop_cur(); > return ret; > } > > -- 1.9.0 _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs > _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs