diff options
-rw-r--r-- | block/blk-core.c | 144 | ||||
-rw-r--r-- | include/linux/blkdev.h | 16 |
2 files changed, 80 insertions, 80 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 | **/ | ||
1690 | unsigned 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 | } | ||
1697 | EXPORT_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 | **/ | ||
1703 | unsigned 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 | } | ||
1713 | EXPORT_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 | ||
1829 | static 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 | **/ | ||
1832 | unsigned 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 | } | ||
1839 | EXPORT_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 | **/ | ||
1845 | unsigned 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 | } | ||
1855 | EXPORT_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 | **/ | ||
1873 | void 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 | } | ||
1882 | EXPORT_SYMBOL(end_request); | ||
1883 | |||
1884 | static 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, | |||
2007 | EXPORT_SYMBOL_GPL(blk_end_bidi_request); | 1980 | EXPORT_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 | **/ | ||
1998 | void 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 | } | ||
2007 | EXPORT_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 |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 12e20de44b60..156ffd9de967 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
@@ -832,6 +832,14 @@ static inline void blk_run_address_space(struct address_space *mapping) | |||
832 | extern void blkdev_dequeue_request(struct request *req); | 832 | extern void blkdev_dequeue_request(struct request *req); |
833 | 833 | ||
834 | /* | 834 | /* |
835 | * blk_end_request() takes bytes instead of sectors as a complete size. | ||
836 | * blk_rq_bytes() returns bytes left to complete in the entire request. | ||
837 | * blk_rq_cur_bytes() returns bytes left to complete in the current segment. | ||
838 | */ | ||
839 | extern unsigned int blk_rq_bytes(struct request *rq); | ||
840 | extern unsigned int blk_rq_cur_bytes(struct request *rq); | ||
841 | |||
842 | /* | ||
835 | * blk_end_request() and friends. | 843 | * blk_end_request() and friends. |
836 | * __blk_end_request() and end_request() must be called with | 844 | * __blk_end_request() and end_request() must be called with |
837 | * the request queue spinlock acquired. | 845 | * the request queue spinlock acquired. |
@@ -858,14 +866,6 @@ extern void blk_update_request(struct request *rq, int error, | |||
858 | unsigned int nr_bytes); | 866 | unsigned int nr_bytes); |
859 | 867 | ||
860 | /* | 868 | /* |
861 | * blk_end_request() takes bytes instead of sectors as a complete size. | ||
862 | * blk_rq_bytes() returns bytes left to complete in the entire request. | ||
863 | * blk_rq_cur_bytes() returns bytes left to complete in the current segment. | ||
864 | */ | ||
865 | extern unsigned int blk_rq_bytes(struct request *rq); | ||
866 | extern unsigned int blk_rq_cur_bytes(struct request *rq); | ||
867 | |||
868 | /* | ||
869 | * Access functions for manipulating queue properties | 869 | * Access functions for manipulating queue properties |
870 | */ | 870 | */ |
871 | extern struct request_queue *blk_init_queue_node(request_fn_proc *rfn, | 871 | extern struct request_queue *blk_init_queue_node(request_fn_proc *rfn, |