mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
Make sure we don't cross stripe boundaries when reviving striped plexes.
This makes crash recovery work for stripe sizes that are not multiples of DEFAULT_REVIVE_BLOCKSIZE (currently 64 kB). While we're here, fix a few cosmetic nits. Reviewed by: grog Sponsored by: Enitel ASA (http://www.enitel.no/)
This commit is contained in:
parent
45fe9882b0
commit
cd085280b5
1 changed files with 6 additions and 4 deletions
|
|
@ -101,9 +101,11 @@ revive_block(int sdno)
|
|||
|
||||
case plex_striped:
|
||||
stripeoffset = sd->revived % plex->stripesize; /* offset from beginning of stripe */
|
||||
if (stripeoffset + (size >> DEV_BSHIFT) > plex->stripesize)
|
||||
size = (plex->stripesize - stripeoffset) << DEV_BSHIFT;
|
||||
plexblkno = sd->plexoffset /* base */
|
||||
+ (sd->revived - stripeoffset) * plex->subdisks /* offset to beginning of stripe */
|
||||
+ sd->revived % plex->stripesize; /* offset from beginning of stripe */
|
||||
+ stripeoffset; /* offset from beginning of stripe */
|
||||
break;
|
||||
|
||||
case plex_raid4:
|
||||
|
|
@ -111,7 +113,7 @@ revive_block(int sdno)
|
|||
stripeoffset = sd->revived % plex->stripesize; /* offset from beginning of stripe */
|
||||
plexblkno = sd->plexoffset /* base */
|
||||
+ (sd->revived - stripeoffset) * (plex->subdisks - 1) /* offset to beginning of stripe */
|
||||
+stripeoffset; /* offset from beginning of stripe */
|
||||
+ stripeoffset; /* offset from beginning of stripe */
|
||||
stripe = (sd->revived / plex->stripesize); /* stripe number */
|
||||
|
||||
/* Make sure we don't go beyond the end of the band. */
|
||||
|
|
@ -157,8 +159,8 @@ revive_block(int sdno)
|
|||
lock = lockrange(plexblkno << DEV_BSHIFT, bp, plex); /* lock it */
|
||||
if (vol != NULL) /* it's part of a volume, */
|
||||
/*
|
||||
* First, read the data from the volume. We
|
||||
* don't care which plex, that's bre's job.
|
||||
* First, read the data from the volume. We
|
||||
* don't care which plex, that's bre's job.
|
||||
*/
|
||||
bp->b_dev = VINUMDEV(plex->volno, 0, 0, VINUM_VOLUME_TYPE); /* create the device number */
|
||||
else /* it's an unattached plex */
|
||||
|
|
|
|||
Loading…
Reference in a new issue