Pull block revert from Jens Axboe: "Silly error snuck into a patch from the last series, let's do a revert to avoid a potential use-after-free" * tag 'for-linus-20190127' of git://git.kernel.dk/linux-block: Revert "block: cover another queue enter recursion via BIO_QUEUE_ENTERED"
Unified · Split
| @@ -1083,18 +1083,7 @@ blk_qc_t generic_make_request(struct bio *bio) · 1082 unmodified lines | |||
| 1083 | /* Create a fresh bio_list for all subordinate requests */ | 1083 | /* Create a fresh bio_list for all subordinate requests */ |
| 1084 | bio_list_on_stack[1] = bio_list_on_stack[0]; | 1084 | bio_list_on_stack[1] = bio_list_on_stack[0]; |
| 1085 | bio_list_init(&bio_list_on_stack[0]); | 1085 | bio_list_init(&bio_list_on_stack[0]); |
| 1086 | |||
| 1087 | /* | ||
| 1088 | * Since we're recursing into make_request here, ensure | ||
| 1089 | * that we mark this bio as already having entered the queue. | ||
| 1090 | * If not, and the queue is going away, we can get stuck | ||
| 1091 | * forever on waiting for the queue reference to drop. But | ||
| 1092 | * that will never happen, as we're already holding a | ||
| 1093 | * reference to it. | ||
| 1094 | */ | ||
| 1095 | bio_set_flag(bio, BIO_QUEUE_ENTERED); | ||
| 1096 | ret = q->make_request_fn(q, bio); | 1086 | ret = q->make_request_fn(q, bio); |
| 1097 | bio_clear_flag(bio, BIO_QUEUE_ENTERED); | ||
| 1098 | 1087 | ||
| 1099 | /* sort new bios into those for a lower level | 1088 | /* sort new bios into those for a lower level |
| 1100 | * and those for the same level | 1089 | * and those for the same level |
| @@ -272,6 +272,16 @@ void blk_queue_split(struct request_queue *q, struct bio **bio) · 271 unmodified lines | |||
| 272 | /* there isn't chance to merge the splitted bio */ | 272 | /* there isn't chance to merge the splitted bio */ |
| 273 | split->bi_opf |= REQ_NOMERGE; | 273 | split->bi_opf |= REQ_NOMERGE; |
| 274 | 274 | ||
| 275 | /* | ||
| 276 | * Since we're recursing into make_request here, ensure | ||
| 277 | * that we mark this bio as already having entered the queue. | ||
| 278 | * If not, and the queue is going away, we can get stuck | ||
| 279 | * forever on waiting for the queue reference to drop. But | ||
| 280 | * that will never happen, as we're already holding a | ||
| 281 | * reference to it. | ||
| 282 | */ | ||
| 283 | bio_set_flag(*bio, BIO_QUEUE_ENTERED); | ||
| 284 | |||
| 275 | bio_chain(split, *bio); | 285 | bio_chain(split, *bio); |
| 276 | trace_block_split(q, split, (*bio)->bi_iter.bi_sector); | 286 | trace_block_split(q, split, (*bio)->bi_iter.bi_sector); |
| 277 | generic_make_request(*bio); | 287 | generic_make_request(*bio); |