aboutsummaryrefslogtreecommitdiffstats
path: root/block/blk-core.c
diff options
context:
space:
mode:
Diffstat (limited to 'block/blk-core.c')
-rw-r--r--block/blk-core.c105
1 files changed, 77 insertions, 28 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index 6226a380fb6d..93691d2ac5a0 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -902,6 +902,8 @@ EXPORT_SYMBOL(blk_get_request);
902 */ 902 */
903void blk_requeue_request(struct request_queue *q, struct request *rq) 903void blk_requeue_request(struct request_queue *q, struct request *rq)
904{ 904{
905 BUG_ON(blk_queued_rq(rq));
906
905 blk_delete_timer(rq); 907 blk_delete_timer(rq);
906 blk_clear_rq_complete(rq); 908 blk_clear_rq_complete(rq);
907 trace_block_rq_requeue(q, rq); 909 trace_block_rq_requeue(q, rq);
@@ -1610,28 +1612,6 @@ int blk_insert_cloned_request(struct request_queue *q, struct request *rq)
1610} 1612}
1611EXPORT_SYMBOL_GPL(blk_insert_cloned_request); 1613EXPORT_SYMBOL_GPL(blk_insert_cloned_request);
1612 1614
1613/**
1614 * blkdev_dequeue_request - dequeue request and start timeout timer
1615 * @req: request to dequeue
1616 *
1617 * Dequeue @req and start timeout timer on it. This hands off the
1618 * request to the driver.
1619 *
1620 * Block internal functions which don't want to start timer should
1621 * call elv_dequeue_request().
1622 */
1623void blkdev_dequeue_request(struct request *req)
1624{
1625 elv_dequeue_request(req->q, req);
1626
1627 /*
1628 * We are now handing the request to the hardware, add the
1629 * timeout handler.
1630 */
1631 blk_add_timer(req);
1632}
1633EXPORT_SYMBOL(blkdev_dequeue_request);
1634
1635static void blk_account_io_completion(struct request *req, unsigned int bytes) 1615static void blk_account_io_completion(struct request *req, unsigned int bytes)
1636{ 1616{
1637 if (blk_do_io_stat(req)) { 1617 if (blk_do_io_stat(req)) {
@@ -1671,7 +1651,23 @@ static void blk_account_io_done(struct request *req)
1671 } 1651 }
1672} 1652}
1673 1653
1674struct request *elv_next_request(struct request_queue *q) 1654/**
1655 * blk_peek_request - peek at the top of a request queue
1656 * @q: request queue to peek at
1657 *
1658 * Description:
1659 * Return the request at the top of @q. The returned request
1660 * should be started using blk_start_request() before LLD starts
1661 * processing it.
1662 *
1663 * Return:
1664 * Pointer to the request at the top of @q if available. Null
1665 * otherwise.
1666 *
1667 * Context:
1668 * queue_lock must be held.
1669 */
1670struct request *blk_peek_request(struct request_queue *q)
1675{ 1671{
1676 struct request *rq; 1672 struct request *rq;
1677 int ret; 1673 int ret;
@@ -1748,10 +1744,12 @@ struct request *elv_next_request(struct request_queue *q)
1748 1744
1749 return rq; 1745 return rq;
1750} 1746}
1751EXPORT_SYMBOL(elv_next_request); 1747EXPORT_SYMBOL(blk_peek_request);
1752 1748
1753void elv_dequeue_request(struct request_queue *q, struct request *rq) 1749void blk_dequeue_request(struct request *rq)
1754{ 1750{
1751 struct request_queue *q = rq->q;
1752
1755 BUG_ON(list_empty(&rq->queuelist)); 1753 BUG_ON(list_empty(&rq->queuelist));
1756 BUG_ON(ELV_ON_HASH(rq)); 1754 BUG_ON(ELV_ON_HASH(rq));
1757 1755
@@ -1767,6 +1765,58 @@ void elv_dequeue_request(struct request_queue *q, struct request *rq)
1767} 1765}
1768 1766
1769/** 1767/**
1768 * blk_start_request - start request processing on the driver
1769 * @req: request to dequeue
1770 *
1771 * Description:
1772 * Dequeue @req and start timeout timer on it. This hands off the
1773 * request to the driver.
1774 *
1775 * Block internal functions which don't want to start timer should
1776 * call blk_dequeue_request().
1777 *
1778 * Context:
1779 * queue_lock must be held.
1780 */
1781void blk_start_request(struct request *req)
1782{
1783 blk_dequeue_request(req);
1784
1785 /*
1786 * We are now handing the request to the hardware, add the
1787 * timeout handler.
1788 */
1789 blk_add_timer(req);
1790}
1791EXPORT_SYMBOL(blk_start_request);
1792
1793/**
1794 * blk_fetch_request - fetch a request from a request queue
1795 * @q: request queue to fetch a request from
1796 *
1797 * Description:
1798 * Return the request at the top of @q. The request is started on
1799 * return and LLD can start processing it immediately.
1800 *
1801 * Return:
1802 * Pointer to the request at the top of @q if available. Null
1803 * otherwise.
1804 *
1805 * Context:
1806 * queue_lock must be held.
1807 */
1808struct request *blk_fetch_request(struct request_queue *q)
1809{
1810 struct request *rq;
1811
1812 rq = blk_peek_request(q);
1813 if (rq)
1814 blk_start_request(rq);
1815 return rq;
1816}
1817EXPORT_SYMBOL(blk_fetch_request);
1818
1819/**
1770 * blk_update_request - Special helper function for request stacking drivers 1820 * blk_update_request - Special helper function for request stacking drivers
1771 * @rq: the request being processed 1821 * @rq: the request being processed
1772 * @error: %0 for success, < %0 for error 1822 * @error: %0 for success, < %0 for error
@@ -1937,12 +1987,11 @@ static bool blk_update_bidi_request(struct request *rq, int error,
1937 */ 1987 */
1938static void blk_finish_request(struct request *req, int error) 1988static void blk_finish_request(struct request *req, int error)
1939{ 1989{
1990 BUG_ON(blk_queued_rq(req));
1991
1940 if (blk_rq_tagged(req)) 1992 if (blk_rq_tagged(req))
1941 blk_queue_end_tag(req->q, req); 1993 blk_queue_end_tag(req->q, req);
1942 1994
1943 if (blk_queued_rq(req))
1944 elv_dequeue_request(req->q, req);
1945
1946 if (unlikely(laptop_mode) && blk_fs_request(req)) 1995 if (unlikely(laptop_mode) && blk_fs_request(req))
1947 laptop_io_completion(); 1996 laptop_io_completion();
1948 1997