Fail early on bio corruption confirmed on 5.2-rc1
Unable to import zpool with "Large kmem_alloc" warning due to corrupted bio's with invalid # of page vectors. See #8867 for details. Fail early with ENOMEM. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Signed-off-by: Tomohiro Kusumi <kusumi.tomohiro@gmail.com> Closes #8867 Closes #8961
This commit is contained in:
parent
46db9d6161
commit
aa7aab6c45
@ -621,6 +621,7 @@ retry:
|
|||||||
bio_offset = io_offset;
|
bio_offset = io_offset;
|
||||||
bio_size = io_size;
|
bio_size = io_size;
|
||||||
for (i = 0; i <= dr->dr_bio_count; i++) {
|
for (i = 0; i <= dr->dr_bio_count; i++) {
|
||||||
|
unsigned int nr_iovecs;
|
||||||
|
|
||||||
/* Finished constructing bio's for given buffer */
|
/* Finished constructing bio's for given buffer */
|
||||||
if (bio_size <= 0)
|
if (bio_size <= 0)
|
||||||
@ -638,10 +639,11 @@ retry:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* bio_alloc() with __GFP_WAIT never returns NULL */
|
/* bio_alloc() with __GFP_WAIT never returns NULL */
|
||||||
dr->dr_bio[i] = bio_alloc(GFP_NOIO,
|
nr_iovecs = MIN(abd_nr_pages_off(zio->io_abd, bio_size,
|
||||||
MIN(abd_nr_pages_off(zio->io_abd, bio_size, abd_offset),
|
abd_offset), BIO_MAX_PAGES);
|
||||||
BIO_MAX_PAGES));
|
dr->dr_bio[i] = bio_alloc(GFP_NOIO, nr_iovecs);
|
||||||
if (unlikely(dr->dr_bio[i] == NULL)) {
|
if (unlikely(dr->dr_bio[i] == NULL ||
|
||||||
|
(unsigned int)dr->dr_bio[i]->bi_max_vecs != nr_iovecs)) {
|
||||||
vdev_disk_dio_free(dr);
|
vdev_disk_dio_free(dr);
|
||||||
return (SET_ERROR(ENOMEM));
|
return (SET_ERROR(ENOMEM));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user