xfsrestore: fix 2GB directory dump limitation for multi-stream
The drive_simple restore path has a 2GB directory limit. Instead of
ASSERTing if nreadneeded64 is greater than INTGENMAX (2GB), add a loop
to handle it.
Signed-off-by: Rich Johnston <rjohnston@sgi.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
diff --git a/common/drive_simple.c b/common/drive_simple.c
index 086d162..401cd7f 100644
--- a/common/drive_simple.c
+++ b/common/drive_simple.c
@@ -765,18 +765,20 @@
/* use read_buf util func to eat up difference
*/
nreadneeded64 = mark - strmoff;
- ASSERT( nreadneeded64 <= INTGENMAX );
- nreadneeded = ( intgen_t )nreadneeded64;
- nread = read_buf( 0,
- ( size_t )nreadneeded,
- ( void * )drivep,
- ( rfp_t )drivep->d_opsp->do_read,
- ( rrbfp_t )drivep->d_opsp->do_return_read_buf,
- &rval );
- if ( rval ) {
- return rval;
+ while ( nreadneeded64 > 0 ) {
+ if ( nreadneeded64 > INTGENMAX )
+ nreadneeded = INTGENMAX;
+ else
+ nreadneeded = ( intgen_t )nreadneeded64;
+ nread = read_buf( 0, nreadneeded, drivep,
+ ( rfp_t )drivep->d_opsp->do_read,
+ ( rrbfp_t )drivep->d_opsp->do_return_read_buf,
+ &rval );
+ if ( rval ) {
+ return rval;
+ }
+ nreadneeded64 -= nread;
}
- ASSERT( nread == nreadneeded );
/* verify we are on the mark
*/