diff options
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-core.c | 128 |
1 files changed, 122 insertions, 6 deletions
diff --git a/block/blk-core.c b/block/blk-core.c index 93691d2ac5a0..a2d97de1a12c 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
@@ -2026,8 +2026,8 @@ static void blk_finish_request(struct request *req, int error) | |||
2026 | * %false - we are done with this request | 2026 | * %false - we are done with this request |
2027 | * %true - still buffers pending for this request | 2027 | * %true - still buffers pending for this request |
2028 | **/ | 2028 | **/ |
2029 | bool blk_end_bidi_request(struct request *rq, int error, | 2029 | static bool blk_end_bidi_request(struct request *rq, int error, |
2030 | unsigned int nr_bytes, unsigned int bidi_bytes) | 2030 | unsigned int nr_bytes, unsigned int bidi_bytes) |
2031 | { | 2031 | { |
2032 | struct request_queue *q = rq->q; | 2032 | struct request_queue *q = rq->q; |
2033 | unsigned long flags; | 2033 | unsigned long flags; |
@@ -2041,7 +2041,6 @@ bool blk_end_bidi_request(struct request *rq, int error, | |||
2041 | 2041 | ||
2042 | return false; | 2042 | return false; |
2043 | } | 2043 | } |
2044 | EXPORT_SYMBOL_GPL(blk_end_bidi_request); | ||
2045 | 2044 | ||
2046 | /** | 2045 | /** |
2047 | * __blk_end_bidi_request - Complete a bidi request with queue lock held | 2046 | * __blk_end_bidi_request - Complete a bidi request with queue lock held |
@@ -2058,8 +2057,8 @@ EXPORT_SYMBOL_GPL(blk_end_bidi_request); | |||
2058 | * %false - we are done with this request | 2057 | * %false - we are done with this request |
2059 | * %true - still buffers pending for this request | 2058 | * %true - still buffers pending for this request |
2060 | **/ | 2059 | **/ |
2061 | bool __blk_end_bidi_request(struct request *rq, int error, | 2060 | static bool __blk_end_bidi_request(struct request *rq, int error, |
2062 | unsigned int nr_bytes, unsigned int bidi_bytes) | 2061 | unsigned int nr_bytes, unsigned int bidi_bytes) |
2063 | { | 2062 | { |
2064 | if (blk_update_bidi_request(rq, error, nr_bytes, bidi_bytes)) | 2063 | if (blk_update_bidi_request(rq, error, nr_bytes, bidi_bytes)) |
2065 | return true; | 2064 | return true; |
@@ -2068,7 +2067,124 @@ bool __blk_end_bidi_request(struct request *rq, int error, | |||
2068 | 2067 | ||
2069 | return false; | 2068 | return false; |
2070 | } | 2069 | } |
2071 | EXPORT_SYMBOL_GPL(__blk_end_bidi_request); | 2070 | |
2071 | /** | ||
2072 | * blk_end_request - Helper function for drivers to complete the request. | ||
2073 | * @rq: the request being processed | ||
2074 | * @error: %0 for success, < %0 for error | ||
2075 | * @nr_bytes: number of bytes to complete | ||
2076 | * | ||
2077 | * Description: | ||
2078 | * Ends I/O on a number of bytes attached to @rq. | ||
2079 | * If @rq has leftover, sets it up for the next range of segments. | ||
2080 | * | ||
2081 | * Return: | ||
2082 | * %false - we are done with this request | ||
2083 | * %true - still buffers pending for this request | ||
2084 | **/ | ||
2085 | bool blk_end_request(struct request *rq, int error, unsigned int nr_bytes) | ||
2086 | { | ||
2087 | return blk_end_bidi_request(rq, error, nr_bytes, 0); | ||
2088 | } | ||
2089 | EXPORT_SYMBOL_GPL(blk_end_request); | ||
2090 | |||
2091 | /** | ||
2092 | * blk_end_request_all - Helper function for drives to finish the request. | ||
2093 | * @rq: the request to finish | ||
2094 | * @err: %0 for success, < %0 for error | ||
2095 | * | ||
2096 | * Description: | ||
2097 | * Completely finish @rq. | ||
2098 | */ | ||
2099 | void blk_end_request_all(struct request *rq, int error) | ||
2100 | { | ||
2101 | bool pending; | ||
2102 | unsigned int bidi_bytes = 0; | ||
2103 | |||
2104 | if (unlikely(blk_bidi_rq(rq))) | ||
2105 | bidi_bytes = blk_rq_bytes(rq->next_rq); | ||
2106 | |||
2107 | pending = blk_end_bidi_request(rq, error, blk_rq_bytes(rq), bidi_bytes); | ||
2108 | BUG_ON(pending); | ||
2109 | } | ||
2110 | EXPORT_SYMBOL_GPL(blk_end_request_all); | ||
2111 | |||
2112 | /** | ||
2113 | * blk_end_request_cur - Helper function to finish the current request chunk. | ||
2114 | * @rq: the request to finish the current chunk for | ||
2115 | * @err: %0 for success, < %0 for error | ||
2116 | * | ||
2117 | * Description: | ||
2118 | * Complete the current consecutively mapped chunk from @rq. | ||
2119 | * | ||
2120 | * Return: | ||
2121 | * %false - we are done with this request | ||
2122 | * %true - still buffers pending for this request | ||
2123 | */ | ||
2124 | bool blk_end_request_cur(struct request *rq, int error) | ||
2125 | { | ||
2126 | return blk_end_request(rq, error, blk_rq_cur_bytes(rq)); | ||
2127 | } | ||
2128 | EXPORT_SYMBOL_GPL(blk_end_request_cur); | ||
2129 | |||
2130 | /** | ||
2131 | * __blk_end_request - Helper function for drivers to complete the request. | ||
2132 | * @rq: the request being processed | ||
2133 | * @error: %0 for success, < %0 for error | ||
2134 | * @nr_bytes: number of bytes to complete | ||
2135 | * | ||
2136 | * Description: | ||
2137 | * Must be called with queue lock held unlike blk_end_request(). | ||
2138 | * | ||
2139 | * Return: | ||
2140 | * %false - we are done with this request | ||
2141 | * %true - still buffers pending for this request | ||
2142 | **/ | ||
2143 | bool __blk_end_request(struct request *rq, int error, unsigned int nr_bytes) | ||
2144 | { | ||
2145 | return __blk_end_bidi_request(rq, error, nr_bytes, 0); | ||
2146 | } | ||
2147 | EXPORT_SYMBOL_GPL(__blk_end_request); | ||
2148 | |||
2149 | /** | ||
2150 | * __blk_end_request_all - Helper function for drives to finish the request. | ||
2151 | * @rq: the request to finish | ||
2152 | * @err: %0 for success, < %0 for error | ||
2153 | * | ||
2154 | * Description: | ||
2155 | * Completely finish @rq. Must be called with queue lock held. | ||
2156 | */ | ||
2157 | void __blk_end_request_all(struct request *rq, int error) | ||
2158 | { | ||
2159 | bool pending; | ||
2160 | unsigned int bidi_bytes = 0; | ||
2161 | |||
2162 | if (unlikely(blk_bidi_rq(rq))) | ||
2163 | bidi_bytes = blk_rq_bytes(rq->next_rq); | ||
2164 | |||
2165 | pending = __blk_end_bidi_request(rq, error, blk_rq_bytes(rq), bidi_bytes); | ||
2166 | BUG_ON(pending); | ||
2167 | } | ||
2168 | EXPORT_SYMBOL_GPL(__blk_end_request_all); | ||
2169 | |||
2170 | /** | ||
2171 | * __blk_end_request_cur - Helper function to finish the current request chunk. | ||
2172 | * @rq: the request to finish the current chunk for | ||
2173 | * @err: %0 for success, < %0 for error | ||
2174 | * | ||
2175 | * Description: | ||
2176 | * Complete the current consecutively mapped chunk from @rq. Must | ||
2177 | * be called with queue lock held. | ||
2178 | * | ||
2179 | * Return: | ||
2180 | * %false - we are done with this request | ||
2181 | * %true - still buffers pending for this request | ||
2182 | */ | ||
2183 | bool __blk_end_request_cur(struct request *rq, int error) | ||
2184 | { | ||
2185 | return __blk_end_request(rq, error, blk_rq_cur_bytes(rq)); | ||
2186 | } | ||
2187 | EXPORT_SYMBOL_GPL(__blk_end_request_cur); | ||
2072 | 2188 | ||
2073 | void blk_rq_bio_prep(struct request_queue *q, struct request *rq, | 2189 | void blk_rq_bio_prep(struct request_queue *q, struct request *rq, |
2074 | struct bio *bio) | 2190 | struct bio *bio) |