mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
Verify block pointers before writing them out
If a block pointer is corrupted (but the block containing it checksums correctly, e.g. due to a bug that overwrites random memory), we can often detect it before the block is read, with the `zfs_blkptr_verify()` function, which is used in `arc_read()`, `zio_free()`, etc. However, such corruption is not typically recoverable. To recover from it we would need to detect the memory error before the block pointer is written to disk. This PR verifies BP's that are contained in indirect blocks and dnodes before they are written to disk, in `dbuf_write_ready()`. This way, we'll get a panic before the on-disk data is corrupted. This will help us to diagnose what's causing the corruption, as well as being much easier to recover from. To minimize performance impact, only checks that can be done without holding the spa_config_lock are performed. Additionally, when corruption is detected, the raw words of the block pointer are logged. (Note that `dprintf_bp()` is a no-op by default, but if enabled it is not safe to use with invalid block pointers.) Reviewed-by: Rich Ercolani <rincebrain@gmail.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Paul Zuchowski <pzuchowski@datto.com> Reviewed-by: Alexander Motin <mav@FreeBSD.org> Signed-off-by: Matthew Ahrens <mahrens@delphix.com> Closes #14817
This commit is contained in:
+7
-1
@@ -531,6 +531,12 @@ enum blk_verify_flag {
|
||||
BLK_VERIFY_HALT
|
||||
};
|
||||
|
||||
enum blk_config_flag {
|
||||
BLK_CONFIG_HELD, // SCL_VDEV held for writer
|
||||
BLK_CONFIG_NEEDED, // SCL_VDEV should be obtained for reader
|
||||
BLK_CONFIG_SKIP, // skip checks which require SCL_VDEV
|
||||
};
|
||||
|
||||
extern int zio_bookmark_compare(const void *, const void *);
|
||||
|
||||
extern zio_t *zio_null(zio_t *pio, spa_t *spa, vdev_t *vd,
|
||||
@@ -646,7 +652,7 @@ extern int zio_resume(spa_t *spa);
|
||||
extern void zio_resume_wait(spa_t *spa);
|
||||
|
||||
extern boolean_t zfs_blkptr_verify(spa_t *spa, const blkptr_t *bp,
|
||||
boolean_t config_held, enum blk_verify_flag blk_verify);
|
||||
enum blk_config_flag blk_config, enum blk_verify_flag blk_verify);
|
||||
|
||||
/*
|
||||
* Initial setup and teardown.
|
||||
|
||||
Reference in New Issue
Block a user