diff options
| author | James Bottomley <jejb@titanic.(none)> | 2005-08-28 11:43:07 -0400 |
|---|---|---|
| committer | James Bottomley <jejb@titanic.(none)> | 2005-08-28 11:43:07 -0400 |
| commit | 31151ba2cef171344beac254e65bd7e00138bb0d (patch) | |
| tree | a8f9cd3c0395656d974125c0ca7ed635aacddeee | |
| parent | 3d52acb34247816c453f94596e6c7fc4499b76dc (diff) | |
| parent | 73747aed04d3b3fb694961d025f81863b99c6898 (diff) | |
fix mismerge in ll_rw_blk.c
| -rw-r--r-- | drivers/block/ll_rw_blk.c | 192 | ||||
| -rw-r--r-- | drivers/block/scsi_ioctl.c | 60 | ||||
| -rw-r--r-- | drivers/cdrom/cdrom.c | 15 | ||||
| -rw-r--r-- | drivers/ide/ide-disk.c | 2 | ||||
| -rw-r--r-- | fs/bio.c | 227 | ||||
| -rw-r--r-- | include/linux/bio.h | 6 | ||||
| -rw-r--r-- | include/linux/blkdev.h | 10 |
7 files changed, 404 insertions, 108 deletions
diff --git a/drivers/block/ll_rw_blk.c b/drivers/block/ll_rw_blk.c index 3c818544475e..0c7599563b65 100644 --- a/drivers/block/ll_rw_blk.c +++ b/drivers/block/ll_rw_blk.c | |||
| @@ -284,6 +284,7 @@ static inline void rq_init(request_queue_t *q, struct request *rq) | |||
| 284 | rq->special = NULL; | 284 | rq->special = NULL; |
| 285 | rq->data_len = 0; | 285 | rq->data_len = 0; |
| 286 | rq->data = NULL; | 286 | rq->data = NULL; |
| 287 | rq->nr_phys_segments = 0; | ||
| 287 | rq->sense = NULL; | 288 | rq->sense = NULL; |
| 288 | rq->end_io = NULL; | 289 | rq->end_io = NULL; |
| 289 | rq->end_io_data = NULL; | 290 | rq->end_io_data = NULL; |
| @@ -2115,7 +2116,7 @@ EXPORT_SYMBOL(blk_insert_request); | |||
| 2115 | /** | 2116 | /** |
| 2116 | * blk_rq_map_user - map user data to a request, for REQ_BLOCK_PC usage | 2117 | * blk_rq_map_user - map user data to a request, for REQ_BLOCK_PC usage |
| 2117 | * @q: request queue where request should be inserted | 2118 | * @q: request queue where request should be inserted |
| 2118 | * @rw: READ or WRITE data | 2119 | * @rq: request structure to fill |
| 2119 | * @ubuf: the user buffer | 2120 | * @ubuf: the user buffer |
| 2120 | * @len: length of user data | 2121 | * @len: length of user data |
| 2121 | * | 2122 | * |
| @@ -2132,21 +2133,19 @@ EXPORT_SYMBOL(blk_insert_request); | |||
| 2132 | * original bio must be passed back in to blk_rq_unmap_user() for proper | 2133 | * original bio must be passed back in to blk_rq_unmap_user() for proper |
| 2133 | * unmapping. | 2134 | * unmapping. |
| 2134 | */ | 2135 | */ |
| 2135 | struct request *blk_rq_map_user(request_queue_t *q, int rw, void __user *ubuf, | 2136 | int blk_rq_map_user(request_queue_t *q, struct request *rq, void __user *ubuf, |
| 2136 | unsigned int len) | 2137 | unsigned int len) |
| 2137 | { | 2138 | { |
| 2138 | unsigned long uaddr; | 2139 | unsigned long uaddr; |
| 2139 | struct request *rq; | ||
| 2140 | struct bio *bio; | 2140 | struct bio *bio; |
| 2141 | int reading; | ||
| 2141 | 2142 | ||
| 2142 | if (len > (q->max_sectors << 9)) | 2143 | if (len > (q->max_sectors << 9)) |
| 2143 | return ERR_PTR(-EINVAL); | 2144 | return -EINVAL; |
| 2144 | if ((!len && ubuf) || (len && !ubuf)) | 2145 | if (!len || !ubuf) |
| 2145 | return ERR_PTR(-EINVAL); | 2146 | return -EINVAL; |
| 2146 | 2147 | ||
| 2147 | rq = blk_get_request(q, rw, __GFP_WAIT); | 2148 | reading = rq_data_dir(rq) == READ; |
| 2148 | if (!rq) | ||
| 2149 | return ERR_PTR(-ENOMEM); | ||
| 2150 | 2149 | ||
| 2151 | /* | 2150 | /* |
| 2152 | * if alignment requirement is satisfied, map in user pages for | 2151 | * if alignment requirement is satisfied, map in user pages for |
| @@ -2154,9 +2153,9 @@ struct request *blk_rq_map_user(request_queue_t *q, int rw, void __user *ubuf, | |||
| 2154 | */ | 2153 | */ |
| 2155 | uaddr = (unsigned long) ubuf; | 2154 | uaddr = (unsigned long) ubuf; |
| 2156 | if (!(uaddr & queue_dma_alignment(q)) && !(len & queue_dma_alignment(q))) | 2155 | if (!(uaddr & queue_dma_alignment(q)) && !(len & queue_dma_alignment(q))) |
| 2157 | bio = bio_map_user(q, NULL, uaddr, len, rw == READ); | 2156 | bio = bio_map_user(q, NULL, uaddr, len, reading); |
| 2158 | else | 2157 | else |
| 2159 | bio = bio_copy_user(q, uaddr, len, rw == READ); | 2158 | bio = bio_copy_user(q, uaddr, len, reading); |
| 2160 | 2159 | ||
| 2161 | if (!IS_ERR(bio)) { | 2160 | if (!IS_ERR(bio)) { |
| 2162 | rq->bio = rq->biotail = bio; | 2161 | rq->bio = rq->biotail = bio; |
| @@ -2164,28 +2163,70 @@ struct request *blk_rq_map_user(request_queue_t *q, int rw, void __user *ubuf, | |||
| 2164 | 2163 | ||
| 2165 | rq->buffer = rq->data = NULL; | 2164 | rq->buffer = rq->data = NULL; |
| 2166 | rq->data_len = len; | 2165 | rq->data_len = len; |
| 2167 | return rq; | 2166 | return 0; |
| 2168 | } | 2167 | } |
| 2169 | 2168 | ||
| 2170 | /* | 2169 | /* |
| 2171 | * bio is the err-ptr | 2170 | * bio is the err-ptr |
| 2172 | */ | 2171 | */ |
| 2173 | blk_put_request(rq); | 2172 | return PTR_ERR(bio); |
| 2174 | return (struct request *) bio; | ||
| 2175 | } | 2173 | } |
| 2176 | 2174 | ||
| 2177 | EXPORT_SYMBOL(blk_rq_map_user); | 2175 | EXPORT_SYMBOL(blk_rq_map_user); |
| 2178 | 2176 | ||
| 2179 | /** | 2177 | /** |
| 2178 | * blk_rq_map_user_iov - map user data to a request, for REQ_BLOCK_PC usage | ||
| 2179 | * @q: request queue where request should be inserted | ||
| 2180 | * @rq: request to map data to | ||
| 2181 | * @iov: pointer to the iovec | ||
| 2182 | * @iov_count: number of elements in the iovec | ||
| 2183 | * | ||
| 2184 | * Description: | ||
| 2185 | * Data will be mapped directly for zero copy io, if possible. Otherwise | ||
| 2186 | * a kernel bounce buffer is used. | ||
| 2187 | * | ||
| 2188 | * A matching blk_rq_unmap_user() must be issued at the end of io, while | ||
| 2189 | * still in process context. | ||
| 2190 | * | ||
| 2191 | * Note: The mapped bio may need to be bounced through blk_queue_bounce() | ||
| 2192 | * before being submitted to the device, as pages mapped may be out of | ||
| 2193 | * reach. It's the callers responsibility to make sure this happens. The | ||
| 2194 | * original bio must be passed back in to blk_rq_unmap_user() for proper | ||
| 2195 | * unmapping. | ||
| 2196 | */ | ||
| 2197 | int blk_rq_map_user_iov(request_queue_t *q, struct request *rq, | ||
| 2198 | struct sg_iovec *iov, int iov_count) | ||
| 2199 | { | ||
| 2200 | struct bio *bio; | ||
| 2201 | |||
| 2202 | if (!iov || iov_count <= 0) | ||
| 2203 | return -EINVAL; | ||
| 2204 | |||
| 2205 | /* we don't allow misaligned data like bio_map_user() does. If the | ||
| 2206 | * user is using sg, they're expected to know the alignment constraints | ||
| 2207 | * and respect them accordingly */ | ||
| 2208 | bio = bio_map_user_iov(q, NULL, iov, iov_count, rq_data_dir(rq)== READ); | ||
| 2209 | if (IS_ERR(bio)) | ||
| 2210 | return PTR_ERR(bio); | ||
| 2211 | |||
| 2212 | rq->bio = rq->biotail = bio; | ||
| 2213 | blk_rq_bio_prep(q, rq, bio); | ||
| 2214 | rq->buffer = rq->data = NULL; | ||
| 2215 | rq->data_len = bio->bi_size; | ||
| 2216 | return 0; | ||
| 2217 | } | ||
| 2218 | |||
| 2219 | EXPORT_SYMBOL(blk_rq_map_user_iov); | ||
| 2220 | |||
| 2221 | /** | ||
| 2180 | * blk_rq_unmap_user - unmap a request with user data | 2222 | * blk_rq_unmap_user - unmap a request with user data |
| 2181 | * @rq: request to be unmapped | 2223 | * @bio: bio to be unmapped |
| 2182 | * @bio: bio for the request | ||
| 2183 | * @ulen: length of user buffer | 2224 | * @ulen: length of user buffer |
| 2184 | * | 2225 | * |
| 2185 | * Description: | 2226 | * Description: |
| 2186 | * Unmap a request previously mapped by blk_rq_map_user(). | 2227 | * Unmap a bio previously mapped by blk_rq_map_user(). |
| 2187 | */ | 2228 | */ |
| 2188 | int blk_rq_unmap_user(struct request *rq, struct bio *bio, unsigned int ulen) | 2229 | int blk_rq_unmap_user(struct bio *bio, unsigned int ulen) |
| 2189 | { | 2230 | { |
| 2190 | int ret = 0; | 2231 | int ret = 0; |
| 2191 | 2232 | ||
| @@ -2196,31 +2237,89 @@ int blk_rq_unmap_user(struct request *rq, struct bio *bio, unsigned int ulen) | |||
| 2196 | ret = bio_uncopy_user(bio); | 2237 | ret = bio_uncopy_user(bio); |
| 2197 | } | 2238 | } |
| 2198 | 2239 | ||
| 2199 | blk_put_request(rq); | 2240 | return 0; |
| 2200 | return ret; | ||
| 2201 | } | 2241 | } |
| 2202 | 2242 | ||
| 2203 | EXPORT_SYMBOL(blk_rq_unmap_user); | 2243 | EXPORT_SYMBOL(blk_rq_unmap_user); |
| 2204 | 2244 | ||
| 2205 | /** | 2245 | /** |
| 2246 | * blk_rq_map_kern - map kernel data to a request, for REQ_BLOCK_PC usage | ||
| 2247 | * @q: request queue where request should be inserted | ||
| 2248 | * @rq: request to fill | ||
| 2249 | * @kbuf: the kernel buffer | ||
| 2250 | * @len: length of user data | ||
| 2251 | * @gfp_mask: memory allocation flags | ||
| 2252 | */ | ||
| 2253 | int blk_rq_map_kern(request_queue_t *q, struct request *rq, void *kbuf, | ||
| 2254 | unsigned int len, unsigned int gfp_mask) | ||
| 2255 | { | ||
| 2256 | struct bio *bio; | ||
| 2257 | |||
