OpenZFS 7163 - ztest failures due to excess error injection
Authored by: Matthew Ahrens <mahrens@delphix.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Paul Dagnelie <pcd@delphix.com> Approved by: Robert Mustacchi <rm@joyent.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Ported-by: George Melikov <mail@gmelikov.ru> OpenZFS-issue: https://www.illumos.org/issues/7163 OpenZFS-commit: https://github.com/openzfs/openzfs/commit/f34284d Closes #4484 Closes #5661
This commit is contained in:
parent
dc1fbc43be
commit
2014c09f64
|
@ -5214,7 +5214,7 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id)
|
||||||
char *path0;
|
char *path0;
|
||||||
char *pathrand;
|
char *pathrand;
|
||||||
size_t fsize;
|
size_t fsize;
|
||||||
int bshift = SPA_MAXBLOCKSHIFT + 2; /* don't scrog all labels */
|
int bshift = SPA_MAXBLOCKSHIFT + 2;
|
||||||
int iters = 1000;
|
int iters = 1000;
|
||||||
int maxfaults;
|
int maxfaults;
|
||||||
int mirror_save;
|
int mirror_save;
|
||||||
|
@ -5407,7 +5407,29 @@ ztest_fault_inject(ztest_ds_t *zd, uint64_t id)
|
||||||
(leaves << bshift) + (leaf << bshift) +
|
(leaves << bshift) + (leaf << bshift) +
|
||||||
(ztest_random(1ULL << (bshift - 1)) & -8ULL);
|
(ztest_random(1ULL << (bshift - 1)) & -8ULL);
|
||||||
|
|
||||||
if (offset >= fsize)
|
/*
|
||||||
|
* Only allow damage to the labels at one end of the vdev.
|
||||||
|
*
|
||||||
|
* If all labels are damaged, the device will be totally
|
||||||
|
* inaccessible, which will result in loss of data,
|
||||||
|
* because we also damage (parts of) the other side of
|
||||||
|
* the mirror/raidz.
|
||||||
|
*
|
||||||
|
* Additionally, we will always have both an even and an
|
||||||
|
* odd label, so that we can handle crashes in the
|
||||||
|
* middle of vdev_config_sync().
|
||||||
|
*/
|
||||||
|
if ((leaf & 1) == 0 && offset < VDEV_LABEL_START_SIZE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The two end labels are stored at the "end" of the disk, but
|
||||||
|
* the end of the disk (vdev_psize) is aligned to
|
||||||
|
* sizeof (vdev_label_t).
|
||||||
|
*/
|
||||||
|
uint64_t psize = P2ALIGN(fsize, sizeof (vdev_label_t));
|
||||||
|
if ((leaf & 1) == 1 &&
|
||||||
|
offset + sizeof (bad) > psize - VDEV_LABEL_END_SIZE)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
mutex_enter(&ztest_vdev_lock);
|
mutex_enter(&ztest_vdev_lock);
|
||||||
|
|
Loading…
Reference in New Issue