diff options
author | trasz <trasz@FreeBSD.org> | 2009-01-11 13:51:04 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2009-01-11 13:51:04 +0000 |
commit | 95c0ca9565e8be51c0f9d81da969bea349292876 (patch) | |
tree | 6cb3700dd41f880fa5751ae0a60e05080d308406 | |
parent | b95d10610bda5db5546103e55dddd01fad4a6eae (diff) | |
download | FreeBSD-src-95c0ca9565e8be51c0f9d81da969bea349292876.zip FreeBSD-src-95c0ca9565e8be51c0f9d81da969bea349292876.tar.gz |
Prevent a panic that happens on SMP machines when removing a disk with
many writes queued up.
Reviewed by: phk, scottl
Approved by: rwatson (mentor)
Sponsored by: FreeBSD Foundation
-rw-r--r-- | sys/geom/geom_vfs.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/sys/geom/geom_vfs.c b/sys/geom/geom_vfs.c index 86c909d..1fce07a 100644 --- a/sys/geom/geom_vfs.c +++ b/sys/geom/geom_vfs.c @@ -71,6 +71,16 @@ g_vfs_done(struct bio *bip) struct buf *bp; int vfslocked; + /* + * Provider ('bio_to') could have withered away sometime + * between incrementing the 'nend' in g_io_deliver() and now, + * making 'bio_to' a dangling pointer. We cannot do that + * in g_wither_geom(), as it would require going over + * the 'g_bio_run_up' list, resetting the pointer. + */ + if (bip->bio_from->provider == NULL) + bip->bio_to = NULL; + if (bip->bio_error) { printf("g_vfs_done():"); g_print_bio(bip); @@ -136,7 +146,7 @@ g_vfs_orphan(struct g_consumer *cp) g_detach(cp); /* - * Do not destroy the geom. Filesystem will do this during unmount. + * Do not destroy the geom. Filesystem will do that during unmount. */ } |