Revert "mmc_block: fix queue cleanup"
author黄涛 <huangtao@rock-chips.com>
Sat, 30 Jul 2011 14:49:01 +0000 (22:49 +0800)
committer黄涛 <huangtao@rock-chips.com>
Sat, 30 Jul 2011 14:49:01 +0000 (22:49 +0800)
This reverts commit a895a6359c2dfa5a7571fd8c23811364aab503b6.

drivers/mmc/card/block.c
drivers/mmc/card/queue.c

index 8d2bd242ac63eec01b938286f1b9b37da4a213e2..25cc7167fee64d2ac38936d9c39ddf3006e02fbf 100644 (file)
@@ -91,8 +91,6 @@ static void mmc_blk_put(struct mmc_blk_data *md)
                if (!devmaj)
                        devidx = md->disk->first_minor >> MMC_SHIFT;
 
-               blk_cleanup_queue(md->queue.queue);
-
                __clear_bit(devidx, dev_use);
 
                put_disk(md->disk);
index c5a7a855f4b1c5f0a8ad7472a8f7896127d03ea8..49e582356c65ab34bc17b1db1bbae002bc5faaff 100644 (file)
@@ -90,10 +90,9 @@ static void mmc_request(struct request_queue *q)
        struct request *req;
 
        if (!mq) {
-               while ((req = blk_fetch_request(q)) != NULL) {
-                       req->cmd_flags |= REQ_QUIET;
+               printk(KERN_ERR "MMC: killing requests for dead queue\n");
+               while ((req = blk_fetch_request(q)) != NULL)
                        __blk_end_request_all(req, -EIO);
-               }
                return;
        }
 
@@ -224,18 +223,17 @@ void mmc_cleanup_queue(struct mmc_queue *mq)
        struct request_queue *q = mq->queue;
        unsigned long flags;
 
+       /* Mark that we should start throwing out stragglers */
+       spin_lock_irqsave(q->queue_lock, flags);
+       q->queuedata = NULL;
+       spin_unlock_irqrestore(q->queue_lock, flags);
+
        /* Make sure the queue isn't suspended, as that will deadlock */
        mmc_queue_resume(mq);
 
        /* Then terminate our worker thread */
        kthread_stop(mq->thread);
 
-       /* Empty the queue */
-       spin_lock_irqsave(q->queue_lock, flags);
-       q->queuedata = NULL;
-       blk_start_queue(q);
-       spin_unlock_irqrestore(q->queue_lock, flags);
-
        if (mq->bounce_sg)
                kfree(mq->bounce_sg);
        mq->bounce_sg = NULL;
@@ -247,6 +245,8 @@ void mmc_cleanup_queue(struct mmc_queue *mq)
                kfree(mq->bounce_buf);
        mq->bounce_buf = NULL;
 
+       blk_cleanup_queue(mq->queue);
+
        mq->card = NULL;
 }
 EXPORT_SYMBOL(mmc_cleanup_queue);