1*86db1e29SJens Axboe /* 2*86db1e29SJens Axboe * Functions related to mapping data to requests 3*86db1e29SJens Axboe */ 4*86db1e29SJens Axboe #include <linux/kernel.h> 5*86db1e29SJens Axboe #include <linux/module.h> 6*86db1e29SJens Axboe #include <linux/bio.h> 7*86db1e29SJens Axboe #include <linux/blkdev.h> 8*86db1e29SJens Axboe 9*86db1e29SJens Axboe #include "blk.h" 10*86db1e29SJens Axboe 11*86db1e29SJens Axboe int blk_rq_append_bio(struct request_queue *q, struct request *rq, 12*86db1e29SJens Axboe struct bio *bio) 13*86db1e29SJens Axboe { 14*86db1e29SJens Axboe if (!rq->bio) 15*86db1e29SJens Axboe blk_rq_bio_prep(q, rq, bio); 16*86db1e29SJens Axboe else if (!ll_back_merge_fn(q, rq, bio)) 17*86db1e29SJens Axboe return -EINVAL; 18*86db1e29SJens Axboe else { 19*86db1e29SJens Axboe rq->biotail->bi_next = bio; 20*86db1e29SJens Axboe rq->biotail = bio; 21*86db1e29SJens Axboe 22*86db1e29SJens Axboe rq->data_len += bio->bi_size; 23*86db1e29SJens Axboe } 24*86db1e29SJens Axboe return 0; 25*86db1e29SJens Axboe } 26*86db1e29SJens Axboe EXPORT_SYMBOL(blk_rq_append_bio); 27*86db1e29SJens Axboe 28*86db1e29SJens Axboe static int __blk_rq_unmap_user(struct bio *bio) 29*86db1e29SJens Axboe { 30*86db1e29SJens Axboe int ret = 0; 31*86db1e29SJens Axboe 32*86db1e29SJens Axboe if (bio) { 33*86db1e29SJens Axboe if (bio_flagged(bio, BIO_USER_MAPPED)) 34*86db1e29SJens Axboe bio_unmap_user(bio); 35*86db1e29SJens Axboe else 36*86db1e29SJens Axboe ret = bio_uncopy_user(bio); 37*86db1e29SJens Axboe } 38*86db1e29SJens Axboe 39*86db1e29SJens Axboe return ret; 40*86db1e29SJens Axboe } 41*86db1e29SJens Axboe 42*86db1e29SJens Axboe static int __blk_rq_map_user(struct request_queue *q, struct request *rq, 43*86db1e29SJens Axboe void __user *ubuf, unsigned int len) 44*86db1e29SJens Axboe { 45*86db1e29SJens Axboe unsigned long uaddr; 46*86db1e29SJens Axboe struct bio *bio, *orig_bio; 47*86db1e29SJens Axboe int reading, ret; 48*86db1e29SJens Axboe 49*86db1e29SJens Axboe reading = rq_data_dir(rq) == READ; 50*86db1e29SJens Axboe 51*86db1e29SJens Axboe /* 52*86db1e29SJens Axboe * if alignment requirement is satisfied, map in user pages for 53*86db1e29SJens Axboe * direct dma. else, set up kernel bounce buffers 54*86db1e29SJens Axboe */ 55*86db1e29SJens Axboe uaddr = (unsigned long) ubuf; 56*86db1e29SJens Axboe if (!(uaddr & queue_dma_alignment(q)) && !(len & queue_dma_alignment(q))) 57*86db1e29SJens Axboe bio = bio_map_user(q, NULL, uaddr, len, reading); 58*86db1e29SJens Axboe else 59*86db1e29SJens Axboe bio = bio_copy_user(q, uaddr, len, reading); 60*86db1e29SJens Axboe 61*86db1e29SJens Axboe if (IS_ERR(bio)) 62*86db1e29SJens Axboe return PTR_ERR(bio); 63*86db1e29SJens Axboe 64*86db1e29SJens Axboe orig_bio = bio; 65*86db1e29SJens Axboe blk_queue_bounce(q, &bio); 66*86db1e29SJens Axboe 67*86db1e29SJens Axboe /* 68*86db1e29SJens Axboe * We link the bounce buffer in and could have to traverse it 69*86db1e29SJens Axboe * later so we have to get a ref to prevent it from being freed 70*86db1e29SJens Axboe */ 71*86db1e29SJens Axboe bio_get(bio); 72*86db1e29SJens Axboe 73*86db1e29SJens Axboe ret = blk_rq_append_bio(q, rq, bio); 74*86db1e29SJens Axboe if (!ret) 75*86db1e29SJens Axboe return bio->bi_size; 76*86db1e29SJens Axboe 77*86db1e29SJens Axboe /* if it was boucned we must call the end io function */ 78*86db1e29SJens Axboe bio_endio(bio, 0); 79*86db1e29SJens Axboe __blk_rq_unmap_user(orig_bio); 80*86db1e29SJens Axboe bio_put(bio); 81*86db1e29SJens Axboe return ret; 82*86db1e29SJens Axboe } 83*86db1e29SJens Axboe 84*86db1e29SJens Axboe /** 85*86db1e29SJens Axboe * blk_rq_map_user - map user data to a request, for REQ_BLOCK_PC usage 86*86db1e29SJens Axboe * @q: request queue where request should be inserted 87*86db1e29SJens Axboe * @rq: request structure to fill 88*86db1e29SJens Axboe * @ubuf: the user buffer 89*86db1e29SJens Axboe * @len: length of user data 90*86db1e29SJens Axboe * 91*86db1e29SJens Axboe * Description: 92*86db1e29SJens Axboe * Data will be mapped directly for zero copy io, if possible. Otherwise 93*86db1e29SJens Axboe * a kernel bounce buffer is used. 94*86db1e29SJens Axboe * 95*86db1e29SJens Axboe * A matching blk_rq_unmap_user() must be issued at the end of io, while 96*86db1e29SJens Axboe * still in process context. 97*86db1e29SJens Axboe * 98*86db1e29SJens Axboe * Note: The mapped bio may need to be bounced through blk_queue_bounce() 99*86db1e29SJens Axboe * before being submitted to the device, as pages mapped may be out of 100*86db1e29SJens Axboe * reach. It's the callers responsibility to make sure this happens. The 101*86db1e29SJens Axboe * original bio must be passed back in to blk_rq_unmap_user() for proper 102*86db1e29SJens Axboe * unmapping. 103*86db1e29SJens Axboe */ 104*86db1e29SJens Axboe int blk_rq_map_user(struct request_queue *q, struct request *rq, 105*86db1e29SJens Axboe void __user *ubuf, unsigned long len) 106*86db1e29SJens Axboe { 107*86db1e29SJens Axboe unsigned long bytes_read = 0; 108*86db1e29SJens Axboe struct bio *bio = NULL; 109*86db1e29SJens Axboe int ret; 110*86db1e29SJens Axboe 111*86db1e29SJens Axboe if (len > (q->max_hw_sectors << 9)) 112*86db1e29SJens Axboe return -EINVAL; 113*86db1e29SJens Axboe if (!len || !ubuf) 114*86db1e29SJens Axboe return -EINVAL; 115*86db1e29SJens Axboe 116*86db1e29SJens Axboe while (bytes_read != len) { 117*86db1e29SJens Axboe unsigned long map_len, end, start; 118*86db1e29SJens Axboe 119*86db1e29SJens Axboe map_len = min_t(unsigned long, len - bytes_read, BIO_MAX_SIZE); 120*86db1e29SJens Axboe end = ((unsigned long)ubuf + map_len + PAGE_SIZE - 1) 121*86db1e29SJens Axboe >> PAGE_SHIFT; 122*86db1e29SJens Axboe start = (unsigned long)ubuf >> PAGE_SHIFT; 123*86db1e29SJens Axboe 124*86db1e29SJens Axboe /* 125*86db1e29SJens Axboe * A bad offset could cause us to require BIO_MAX_PAGES + 1 126*86db1e29SJens Axboe * pages. If this happens we just lower the requested 127*86db1e29SJens Axboe * mapping len by a page so that we can fit 128*86db1e29SJens Axboe */ 129*86db1e29SJens Axboe if (end - start > BIO_MAX_PAGES) 130*86db1e29SJens Axboe map_len -= PAGE_SIZE; 131*86db1e29SJens Axboe 132*86db1e29SJens Axboe ret = __blk_rq_map_user(q, rq, ubuf, map_len); 133*86db1e29SJens Axboe if (ret < 0) 134*86db1e29SJens Axboe goto unmap_rq; 135*86db1e29SJens Axboe if (!bio) 136*86db1e29SJens Axboe bio = rq->bio; 137*86db1e29SJens Axboe bytes_read += ret; 138*86db1e29SJens Axboe ubuf += ret; 139*86db1e29SJens Axboe } 140*86db1e29SJens Axboe 141*86db1e29SJens Axboe rq->buffer = rq->data = NULL; 142*86db1e29SJens Axboe return 0; 143*86db1e29SJens Axboe unmap_rq: 144*86db1e29SJens Axboe blk_rq_unmap_user(bio); 145*86db1e29SJens Axboe return ret; 146*86db1e29SJens Axboe } 147*86db1e29SJens Axboe 148*86db1e29SJens Axboe EXPORT_SYMBOL(blk_rq_map_user); 149*86db1e29SJens Axboe 150*86db1e29SJens Axboe /** 151*86db1e29SJens Axboe * blk_rq_map_user_iov - map user data to a request, for REQ_BLOCK_PC usage 152*86db1e29SJens Axboe * @q: request queue where request should be inserted 153*86db1e29SJens Axboe * @rq: request to map data to 154*86db1e29SJens Axboe * @iov: pointer to the iovec 155*86db1e29SJens Axboe * @iov_count: number of elements in the iovec 156*86db1e29SJens Axboe * @len: I/O byte count 157*86db1e29SJens Axboe * 158*86db1e29SJens Axboe * Description: 159*86db1e29SJens Axboe * Data will be mapped directly for zero copy io, if possible. Otherwise 160*86db1e29SJens Axboe * a kernel bounce buffer is used. 161*86db1e29SJens Axboe * 162*86db1e29SJens Axboe * A matching blk_rq_unmap_user() must be issued at the end of io, while 163*86db1e29SJens Axboe * still in process context. 164*86db1e29SJens Axboe * 165*86db1e29SJens Axboe * Note: The mapped bio may need to be bounced through blk_queue_bounce() 166*86db1e29SJens Axboe * before being submitted to the device, as pages mapped may be out of 167*86db1e29SJens Axboe * reach. It's the callers responsibility to make sure this happens. The 168*86db1e29SJens Axboe * original bio must be passed back in to blk_rq_unmap_user() for proper 169*86db1e29SJens Axboe * unmapping. 170*86db1e29SJens Axboe */ 171*86db1e29SJens Axboe int blk_rq_map_user_iov(struct request_queue *q, struct request *rq, 172*86db1e29SJens Axboe struct sg_iovec *iov, int iov_count, unsigned int len) 173*86db1e29SJens Axboe { 174*86db1e29SJens Axboe struct bio *bio; 175*86db1e29SJens Axboe 176*86db1e29SJens Axboe if (!iov || iov_count <= 0) 177*86db1e29SJens Axboe return -EINVAL; 178*86db1e29SJens Axboe 179*86db1e29SJens Axboe /* we don't allow misaligned data like bio_map_user() does. If the 180*86db1e29SJens Axboe * user is using sg, they're expected to know the alignment constraints 181*86db1e29SJens Axboe * and respect them accordingly */ 182*86db1e29SJens Axboe bio = bio_map_user_iov(q, NULL, iov, iov_count, rq_data_dir(rq)== READ); 183*86db1e29SJens Axboe if (IS_ERR(bio)) 184*86db1e29SJens Axboe return PTR_ERR(bio); 185*86db1e29SJens Axboe 186*86db1e29SJens Axboe if (bio->bi_size != len) { 187*86db1e29SJens Axboe bio_endio(bio, 0); 188*86db1e29SJens Axboe bio_unmap_user(bio); 189*86db1e29SJens Axboe return -EINVAL; 190*86db1e29SJens Axboe } 191*86db1e29SJens Axboe 192*86db1e29SJens Axboe bio_get(bio); 193*86db1e29SJens Axboe blk_rq_bio_prep(q, rq, bio); 194*86db1e29SJens Axboe rq->buffer = rq->data = NULL; 195*86db1e29SJens Axboe return 0; 196*86db1e29SJens Axboe } 197*86db1e29SJens Axboe 198*86db1e29SJens Axboe EXPORT_SYMBOL(blk_rq_map_user_iov); 199*86db1e29SJens Axboe 200*86db1e29SJens Axboe /** 201*86db1e29SJens Axboe * blk_rq_unmap_user - unmap a request with user data 202*86db1e29SJens Axboe * @bio: start of bio list 203*86db1e29SJens Axboe * 204*86db1e29SJens Axboe * Description: 205*86db1e29SJens Axboe * Unmap a rq previously mapped by blk_rq_map_user(). The caller must 206*86db1e29SJens Axboe * supply the original rq->bio from the blk_rq_map_user() return, since 207*86db1e29SJens Axboe * the io completion may have changed rq->bio. 208*86db1e29SJens Axboe */ 209*86db1e29SJens Axboe int blk_rq_unmap_user(struct bio *bio) 210*86db1e29SJens Axboe { 211*86db1e29SJens Axboe struct bio *mapped_bio; 212*86db1e29SJens Axboe int ret = 0, ret2; 213*86db1e29SJens Axboe 214*86db1e29SJens Axboe while (bio) { 215*86db1e29SJens Axboe mapped_bio = bio; 216*86db1e29SJens Axboe if (unlikely(bio_flagged(bio, BIO_BOUNCED))) 217*86db1e29SJens Axboe mapped_bio = bio->bi_private; 218*86db1e29SJens Axboe 219*86db1e29SJens Axboe ret2 = __blk_rq_unmap_user(mapped_bio); 220*86db1e29SJens Axboe if (ret2 && !ret) 221*86db1e29SJens Axboe ret = ret2; 222*86db1e29SJens Axboe 223*86db1e29SJens Axboe mapped_bio = bio; 224*86db1e29SJens Axboe bio = bio->bi_next; 225*86db1e29SJens Axboe bio_put(mapped_bio); 226*86db1e29SJens Axboe } 227*86db1e29SJens Axboe 228*86db1e29SJens Axboe return ret; 229*86db1e29SJens Axboe } 230*86db1e29SJens Axboe 231*86db1e29SJens Axboe EXPORT_SYMBOL(blk_rq_unmap_user); 232*86db1e29SJens Axboe 233*86db1e29SJens Axboe /** 234*86db1e29SJens Axboe * blk_rq_map_kern - map kernel data to a request, for REQ_BLOCK_PC usage 235*86db1e29SJens Axboe * @q: request queue where request should be inserted 236*86db1e29SJens Axboe * @rq: request to fill 237*86db1e29SJens Axboe * @kbuf: the kernel buffer 238*86db1e29SJens Axboe * @len: length of user data 239*86db1e29SJens Axboe * @gfp_mask: memory allocation flags 240*86db1e29SJens Axboe */ 241*86db1e29SJens Axboe int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf, 242*86db1e29SJens Axboe unsigned int len, gfp_t gfp_mask) 243*86db1e29SJens Axboe { 244*86db1e29SJens Axboe struct bio *bio; 245*86db1e29SJens Axboe 246*86db1e29SJens Axboe if (len > (q->max_hw_sectors << 9)) 247*86db1e29SJens Axboe return -EINVAL; 248*86db1e29SJens Axboe if (!len || !kbuf) 249*86db1e29SJens Axboe return -EINVAL; 250*86db1e29SJens Axboe 251*86db1e29SJens Axboe bio = bio_map_kern(q, kbuf, len, gfp_mask); 252*86db1e29SJens Axboe if (IS_ERR(bio)) 253*86db1e29SJens Axboe return PTR_ERR(bio); 254*86db1e29SJens Axboe 255*86db1e29SJens Axboe if (rq_data_dir(rq) == WRITE) 256*86db1e29SJens Axboe bio->bi_rw |= (1 << BIO_RW); 257*86db1e29SJens Axboe 258*86db1e29SJens Axboe blk_rq_bio_prep(q, rq, bio); 259*86db1e29SJens Axboe blk_queue_bounce(q, &rq->bio); 260*86db1e29SJens Axboe rq->buffer = rq->data = NULL; 261*86db1e29SJens Axboe return 0; 262*86db1e29SJens Axboe } 263*86db1e29SJens Axboe 264*86db1e29SJens Axboe EXPORT_SYMBOL(blk_rq_map_kern); 265