Message ID | 4E1D5108.8040309@samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 13 July 2011 10:02, Jaehoon Chung <jh80.chung@samsung.com> wrote: > Hi. > > I send to mailing for [RFC] Kernel NULL pointer dereference. > This patch is fixed it. > > In similar case, when discard request, check condition and > performed mmc_blk_issue_rw_rq(mq, NULL) for ongoing async transfer. > > But When flush request, entered the mmc_blk_issue_flush() then return. > (then didn't complete ongoing aync transfer). > > I think that need to complete for ongoing aync transfer before flush request. > I did consider this when I added the check for discard but I didn't realize it is necessary for flush too. There is no real downside of completing the async request before flush in terms of performance anyway. Thanks for catching this bug. > @@ -1200,6 +1200,9 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) > else > ret = mmc_blk_issue_discard_rq(mq, req); > } else if (req && req->cmd_flags & REQ_FLUSH) { > + /* complete ongoing async transfer before issuing flush */ > + if (card->host->areq) > + mmc_blk_issue_rw_rq(mq, NULL); These 2 lines are the same as for the discard condition. I still prefer 2 lines of repeating code rather than one big if-statement covering both discard and flush. Acked-by: Per Forlin <per.forlin@linaro.org> Regards, Per -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index 38d0149..1ff5486 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -1200,6 +1200,9 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) else ret = mmc_blk_issue_discard_rq(mq, req); } else if (req && req->cmd_flags & REQ_FLUSH) { + /* complete ongoing async transfer before issuing flush */ + if (card->host->areq) + mmc_blk_issue_rw_rq(mq, NULL); ret = mmc_blk_issue_flush(mq, req); } else { ret = mmc_blk_issue_rw_rq(mq, req);