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:
George Melikov 2017-01-26 23:34:29 +03:00 committed by Brian Behlendorf
parent dc1fbc43be
commit 2014c09f64
1 changed files with 24 additions and 2 deletions

View File

@ -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);