Merge branch 'for-linus' of git://git.kernel.dk/linux-2.6-block

* '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()

+31 -6
+22
drivers/block/xsysace.c
··· 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 */
+3 -2
fs/bio-integrity.c
··· 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;
+4 -2
fs/bio.c
··· 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;
+2 -2
include/linux/bio.h
··· 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 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)