History

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

Linus Torvalds committed 17 years ago

Commit 18553c32 parents 326d851 bfbd4424 files · +31 −6Browse files

Unified · Split

4 files
  1. drivers/block/xsysace.c +22 −0
  2. fs/bio-integrity.c +3 −2
  3. fs/bio.c +4 −2
  4. include/linux/bio.h +2 −2
drivers/block/xsysace.c+22−0
@@ -489,6 +489,28 @@ static void ace_fsm_dostate(struct ace_device *ace) · 488 unmodified lines
489489 ace->fsm_state, ace->id_req_count);
490490 #endif
491491
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+
492514 switch (ace->fsm_state) {
493515 case ACE_FSM_STATE_IDLE:
494516 /* See if there is anything to do */
fs/bio-integrity.c+3−2
@@ -685,19 +685,20 @@ EXPORT_SYMBOL(bio_integrity_split); · 684 unmodified lines
685685 * bio_integrity_clone - Callback for cloning bios with integrity metadata
686686 * @bio: New bio
687687 * @bio_src: Original bio
688+ * @gfp_mask: Memory allocation mask
688689 * @bs: bio_set to allocate bip from
689690 *
690691 * Description: Called to allocate a bip when cloning a bio
691692 */
692693 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)
694695 {
695696 struct bio_integrity_payload *bip_src = bio_src->bi_integrity;
696697 struct bio_integrity_payload *bip;
697698
698699 BUG_ON(bip_src == NULL);
699700
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);
701702
702703 if (bip == NULL)
703704 return -EIO;
fs/bio.c+4−2
@@ -463,10 +463,12 @@ struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask) · 462 unmodified lines
463463 if (bio_integrity(bio)) {
464464 int ret;
465465
466− ret = bio_integrity_clone(b, bio, fs_bio_set);
466+ ret = bio_integrity_clone(b, bio, gfp_mask, fs_bio_set);
467467
468− if (ret < 0)
468+ if (ret < 0) {
469+ bio_put(b);
469470 return NULL;
471+ }
470472 }
471473
472474 return b;
include/linux/bio.h+2−2
@@ -531,7 +531,7 @@ extern void bio_integrity_endio(struct bio *, int); · 530 unmodified lines
531531 extern void bio_integrity_advance(struct bio *, unsigned int);
532532 extern void bio_integrity_trim(struct bio *, unsigned int, unsigned int);
533533 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 *);
535535 extern int bioset_integrity_create(struct bio_set *, int);
536536 extern void bioset_integrity_free(struct bio_set *);
537537 extern void bio_integrity_init_slab(void);
@@ -542,7 +542,7 @@ extern void bio_integrity_init_slab(void); · 4 unmodified lines
542542 #define bioset_integrity_create(a, b) (0)
543543 #define bio_integrity_prep(a) (0)
544544 #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)
546546 #define bioset_integrity_free(a) do { } while (0)
547547 #define bio_integrity_free(a, b) do { } while (0)
548548 #define bio_integrity_endio(a, b) do { } while (0)