unsigned int from, nr, arg;
        int err = 0;
 
-       mmc_claim_host(card->host);
-
        if (!mmc_can_erase(card)) {
                err = -EOPNOTSUPP;
                goto out;
        __blk_end_request(req, err, blk_rq_bytes(req));
        spin_unlock_irq(&md->lock);
 
-       mmc_release_host(card->host);
-
        return err ? 0 : 1;
 }
 
        unsigned int from, nr, arg;
        int err = 0;
 
-       mmc_claim_host(card->host);
-
        if (!mmc_can_secure_erase_trim(card)) {
                err = -EOPNOTSUPP;
                goto out;
        __blk_end_request(req, err, blk_rq_bytes(req));
        spin_unlock_irq(&md->lock);
 
-       mmc_release_host(card->host);
-
        return err ? 0 : 1;
 }
 
                (rq_data_dir(req) == WRITE) &&
                REL_WRITES_SUPPORTED(card);
 
-       mmc_claim_host(card->host);
-
        do {
                struct mmc_command cmd;
                u32 readcmd, writecmd, status = 0;
                spin_unlock_irq(&md->lock);
        } while (ret);
 
-       mmc_release_host(card->host);
-
        return 1;
 
  cmd_err:
                spin_unlock_irq(&md->lock);
        }
 
-       mmc_release_host(card->host);
-
        spin_lock_irq(&md->lock);
        while (ret)
                ret = __blk_end_request(req, -EIO, blk_rq_cur_bytes(req));
 
 static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req)
 {
+       int ret;
+       struct mmc_blk_data *md = mq->data;
+       struct mmc_card *card = md->queue.card;
+
+       mmc_claim_host(card->host);
+
        if (req->cmd_flags & REQ_DISCARD) {
                if (req->cmd_flags & REQ_SECURE)
-                       return mmc_blk_issue_secdiscard_rq(mq, req);
+                       ret = mmc_blk_issue_secdiscard_rq(mq, req);
                else
-                       return mmc_blk_issue_discard_rq(mq, req);
+                       ret = mmc_blk_issue_discard_rq(mq, req);
        } else if (req->cmd_flags & REQ_FLUSH) {
-               return mmc_blk_issue_flush(mq, req);
+               ret = mmc_blk_issue_flush(mq, req);
        } else {
-               return mmc_blk_issue_rw_rq(mq, req);
+               ret = mmc_blk_issue_rw_rq(mq, req);
        }
+
+       mmc_release_host(card->host);
+       return ret;
 }
 
 static inline int mmc_blk_readonly(struct mmc_card *card)