* 'for-linus' of git://git.kernel.dk/linux-2.6-block: Fix Xilinx SystemACE driver to handle empty CF slot block: fix memory leak in bio_clone() block: Add gfp_mask parameter to bio_integrity_clone()
Unified · Split
| @@ -489,6 +489,28 @@ static void ace_fsm_dostate(struct ace_device *ace) · 488 unmodified lines | ||
| 489 | 489 | ace->fsm_state, ace->id_req_count); |
| 490 | 490 | #endif |
| 491 | 491 | |
| 492 | + /* Verify that there is actually a CF in the slot. If not, then | |
| 493 | + * bail out back to the idle state and wake up all the waiters */ | |
| 494 | + status = ace_in32(ace, ACE_STATUS); | |
| 495 | + if ((status & ACE_STATUS_CFDETECT) == 0) { | |
| 496 | + ace->fsm_state = ACE_FSM_STATE_IDLE; | |
| 497 | + ace->media_change = 1; | |
| 498 | + set_capacity(ace->gd, 0); | |
| 499 | + dev_info(ace->dev, "No CF in slot\n"); | |
| 500 | + | |
| 501 | + /* Drop all pending requests */ | |
| 502 | + while ((req = elv_next_request(ace->queue)) != NULL) | |
| 503 | + end_request(req, 0); | |
| 504 | + | |
| 505 | + /* Drop back to IDLE state and notify waiters */ | |
| 506 | + ace->fsm_state = ACE_FSM_STATE_IDLE; | |
| 507 | + ace->id_result = -EIO; | |
| 508 | + while (ace->id_req_count) { | |
| 509 | + complete(&ace->id_completion); | |
| 510 | + ace->id_req_count--; | |
| 511 | + } | |
| 512 | + } | |
| 513 | + | |
| 492 | 514 | switch (ace->fsm_state) { |
| 493 | 515 | case ACE_FSM_STATE_IDLE: |
| 494 | 516 | /* See if there is anything to do */ |
| @@ -685,19 +685,20 @@ EXPORT_SYMBOL(bio_integrity_split); · 684 unmodified lines | ||
| 685 | 685 | * bio_integrity_clone - Callback for cloning bios with integrity metadata |
| 686 | 686 | * @bio: New bio |
| 687 | 687 | * @bio_src: Original bio |
| 688 | + * @gfp_mask: Memory allocation mask | |
| 688 | 689 | * @bs: bio_set to allocate bip from |
| 689 | 690 | * |
| 690 | 691 | * Description: Called to allocate a bip when cloning a bio |
| 691 | 692 | */ |
| 692 | 693 | int bio_integrity_clone(struct bio *bio, struct bio *bio_src, |
| 693 | − struct bio_set *bs) | |
| 694 | + gfp_t gfp_mask, struct bio_set *bs) | |
| 694 | 695 | { |
| 695 | 696 | struct bio_integrity_payload *bip_src = bio_src->bi_integrity; |
| 696 | 697 | struct bio_integrity_payload *bip; |
| 697 | 698 | |
| 698 | 699 | BUG_ON(bip_src == NULL); |
| 699 | 700 | |
| 700 | − bip = bio_integrity_alloc_bioset(bio, GFP_NOIO, bip_src->bip_vcnt, bs); | |
| 701 | + bip = bio_integrity_alloc_bioset(bio, gfp_mask, bip_src->bip_vcnt, bs); | |
| 701 | 702 | |
| 702 | 703 | if (bip == NULL) |
| 703 | 704 | return -EIO; |
| @@ -463,10 +463,12 @@ struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask) · 462 unmodified lines | ||
| 463 | 463 | if (bio_integrity(bio)) { |
| 464 | 464 | int ret; |
| 465 | 465 | |
| 466 | − ret = bio_integrity_clone(b, bio, fs_bio_set); | |
| 466 | + ret = bio_integrity_clone(b, bio, gfp_mask, fs_bio_set); | |
| 467 | 467 | |
| 468 | − if (ret < 0) | |
| 468 | + if (ret < 0) { | |
| 469 | + bio_put(b); | |
| 469 | 470 | return NULL; |
| 471 | + } | |
| 470 | 472 | } |
| 471 | 473 | |
| 472 | 474 | return b; |
| @@ -531,7 +531,7 @@ extern void bio_integrity_endio(struct bio *, int); · 530 unmodified lines | ||
| 531 | 531 | extern void bio_integrity_advance(struct bio *, unsigned int); |
| 532 | 532 | extern void bio_integrity_trim(struct bio *, unsigned int, unsigned int); |
| 533 | 533 | extern void bio_integrity_split(struct bio *, struct bio_pair *, int); |
| 534 | −extern int bio_integrity_clone(struct bio *, struct bio *, struct bio_set *); | |
| 534 | +extern int bio_integrity_clone(struct bio *, struct bio *, gfp_t, struct bio_set *); | |
| 535 | 535 | extern int bioset_integrity_create(struct bio_set *, int); |
| 536 | 536 | extern void bioset_integrity_free(struct bio_set *); |
| 537 | 537 | extern void bio_integrity_init_slab(void); |
| @@ -542,7 +542,7 @@ extern void bio_integrity_init_slab(void); · 4 unmodified lines | ||
| 542 | 542 | #define bioset_integrity_create(a, b) (0) |
| 543 | 543 | #define bio_integrity_prep(a) (0) |
| 544 | 544 | #define bio_integrity_enabled(a) (0) |
| 545 | −#define bio_integrity_clone(a, b, c) (0) | |
| 545 | +#define bio_integrity_clone(a, b, c,d ) (0) | |
| 546 | 546 | #define bioset_integrity_free(a) do { } while (0) |
| 547 | 547 | #define bio_integrity_free(a, b) do { } while (0) |
| 548 | 548 | #define bio_integrity_endio(a, b) do { } while (0) |