aboutsummaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
Diffstat (limited to 'block')
-rw-r--r--block/blk-core.c144
1 files changed, 72 insertions, 72 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index cf10dfcda99d..406a93e526b6 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1684,6 +1684,35 @@ static void blk_account_io_done(struct request *req)
1684} 1684}
1685 1685
1686/** 1686/**
1687 * blk_rq_bytes - Returns bytes left to complete in the entire request
1688 * @rq: the request being processed
1689 **/
1690unsigned int blk_rq_bytes(struct request *rq)
1691{
1692 if (blk_fs_request(rq))
1693 return rq->hard_nr_sectors << 9;
1694
1695 return rq->data_len;
1696}
1697EXPORT_SYMBOL_GPL(blk_rq_bytes);
1698
1699/**
1700 * blk_rq_cur_bytes - Returns bytes left to complete in the current segment
1701 * @rq: the request being processed
1702 **/
1703unsigned int blk_rq_cur_bytes(struct request *rq)
1704{
1705 if (blk_fs_request(rq))
1706 return rq->current_nr_sectors << 9;
1707
1708 if (rq->bio)
1709 return rq->bio->bi_size;
1710
1711 return rq->data_len;
1712}
1713EXPORT_SYMBOL_GPL(blk_rq_cur_bytes);
1714
1715/**
1687 * __end_that_request_first - end I/O on a request 1716 * __end_that_request_first - end I/O on a request
1688 * @req: the request being processed 1717 * @req: the request being processed
1689 * @error: %0 for success, < %0 for error 1718 * @error: %0 for success, < %0 for error
@@ -1797,6 +1826,22 @@ static int __end_that_request_first(struct request *req, int error,
1797 return 1; 1826 return 1;
1798} 1827}
1799 1828
1829static int end_that_request_data(struct request *rq, int error,
1830 unsigned int nr_bytes, unsigned int bidi_bytes)
1831{
1832 if (rq->bio) {
1833 if (__end_that_request_first(rq, error, nr_bytes))
1834 return 1;
1835
1836 /* Bidi request must be completed as a whole */
1837 if (blk_bidi_rq(rq) &&
1838 __end_that_request_first(rq->next_rq, error, bidi_bytes))
1839 return 1;
1840 }
1841
1842 return 0;
1843}
1844
1800/* 1845/*
1801 * queue lock must be held 1846 * queue lock must be held
1802 */ 1847 */
@@ -1826,78 +1871,6 @@ static void end_that_request_last(struct request *req, int error)
1826} 1871}
1827 1872
1828/** 1873/**
1829 * blk_rq_bytes - Returns bytes left to complete in the entire request
1830 * @rq: the request being processed
1831 **/
1832unsigned int blk_rq_bytes(struct request *rq)
1833{
1834 if (blk_fs_request(rq))
1835 return rq->hard_nr_sectors << 9;
1836
1837 return rq->data_len;
1838}
1839EXPORT_SYMBOL_GPL(blk_rq_bytes);
1840
1841/**
1842 * blk_rq_cur_bytes - Returns bytes left to complete in the current segment
1843 * @rq: the request being processed
1844 **/
1845unsigned int blk_rq_cur_bytes(struct request *rq)
1846{
1847 if (blk_fs_request(rq))
1848 return rq->current_nr_sectors << 9;
1849
1850 if (rq->bio)
1851 return rq->bio->bi_size;
1852
1853 return rq->data_len;
1854}
1855EXPORT_SYMBOL_GPL(blk_rq_cur_bytes);
1856
1857/**
1858 * end_request - end I/O on the current segment of the request
1859 * @req: the request being processed
1860 * @uptodate: error value or %0/%1 uptodate flag
1861 *
1862 * Description:
1863 * Ends I/O on the current segment of a request. If that is the only
1864 * remaining segment, the request is also completed and freed.
1865 *
1866 * This is a remnant of how older block drivers handled I/O completions.
1867 * Modern drivers typically end I/O on the full request in one go, unless
1868 * they have a residual value to account for. For that case this function
1869 * isn't really useful, unless the residual just happens to be the
1870 * full current segment. In other words, don't use this function in new
1871 * code. Use blk_end_request() or __blk_end_request() to end a request.
1872 **/
1873void end_request(struct request *req, int uptodate)
1874{
1875 int error = 0;
1876
1877 if (uptodate <= 0)
1878 error = uptodate ? uptodate : -EIO;
1879
1880 __blk_end_request(req, error, req->hard_cur_sectors << 9);
1881}
1882EXPORT_SYMBOL(end_request);
1883
1884static int end_that_request_data(struct request *rq, int error,
1885 unsigned int nr_bytes, unsigned int bidi_bytes)
1886{
1887 if (rq->bio) {
1888 if (__end_that_request_first(rq, error, nr_bytes))
1889 return 1;
1890
1891 /* Bidi request must be completed as a whole */
1892 if (blk_bidi_rq(rq) &&
1893 __end_that_request_first(rq->next_rq, error, bidi_bytes))
1894 return 1;
1895 }
1896
1897 return 0;
1898}
1899
1900/**
1901 * blk_end_io - Generic end_io function to complete a request. 1874 * blk_end_io - Generic end_io function to complete a request.
1902 * @rq: the request being processed 1875 * @rq: the request being processed
1903 * @error: %0 for success, < %0 for error 1876 * @error: %0 for success, < %0 for error
@@ -2007,6 +1980,33 @@ int blk_end_bidi_request(struct request *rq, int error, unsigned int nr_bytes,
2007EXPORT_SYMBOL_GPL(blk_end_bidi_request); 1980EXPORT_SYMBOL_GPL(blk_end_bidi_request);
2008 1981
2009/** 1982/**
1983 * end_request - end I/O on the current segment of the request
1984 * @req: the request being processed
1985 * @uptodate: error value or %0/%1 uptodate flag
1986 *
1987 * Description:
1988 * Ends I/O on the current segment of a request. If that is the only
1989 * remaining segment, the request is also completed and freed.
1990 *
1991 * This is a remnant of how older block drivers handled I/O completions.
1992 * Modern drivers typically end I/O on the full request in one go, unless
1993 * they have a residual value to account for. For that case this function
1994 * isn't really useful, unless the residual just happens to be the
1995 * full current segment. In other words, don't use this function in new
1996 * code. Use blk_end_request() or __blk_end_request() to end a request.
1997 **/
1998void end_request(struct request *req, int uptodate)
1999{
2000 int error = 0;
2001
2002 if (uptodate <= 0)
2003 error = uptodate ? uptodate : -EIO;
2004
2005 __blk_end_request(req, error, req->hard_cur_sectors << 9);
2006}
2007EXPORT_SYMBOL(end_request);
2008
2009/**
2010 * blk_update_request - Special helper function for request stacking drivers 2010 * blk_update_request - Special helper function for request stacking drivers
2011 * @rq: the request being processed 2011 * @rq: the request being processed
2012 * @error: %0 for success, < %0 for error 2012 * @error: %0 for success, < %0 for error