1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#include <linux/mm.h>
19#include <linux/swap.h>
20#include <linux/bio.h>
21#include <linux/blkdev.h>
22#include <linux/slab.h>
23#include <linux/init.h>
24#include <linux/kernel.h>
25#include <linux/module.h>
26#include <linux/mempool.h>
27#include <linux/workqueue.h>
28#include <linux/blktrace_api.h>
29#include <scsi/sg.h>
30
31static struct kmem_cache *bio_slab __read_mostly;
32
33mempool_t *bio_split_pool __read_mostly;
34
35
36
37
38
39
40
41#define BV(x) { .nr_vecs = x, .name = "biovec-"__stringify(x) }
42static struct biovec_slab bvec_slabs[BIOVEC_NR_POOLS] __read_mostly = {
43 BV(1), BV(4), BV(16), BV(64), BV(128), BV(BIO_MAX_PAGES),
44};
45#undef BV
46
47
48
49
50
51struct bio_set *fs_bio_set;
52
53unsigned int bvec_nr_vecs(unsigned short idx)
54{
55 return bvec_slabs[idx].nr_vecs;
56}
57
58struct bio_vec *bvec_alloc_bs(gfp_t gfp_mask, int nr, unsigned long *idx, struct bio_set *bs)
59{
60 struct bio_vec *bvl;
61
62
63
64
65 switch (nr) {
66 case 1 : *idx = 0; break;
67 case 2 ... 4: *idx = 1; break;
68 case 5 ... 16: *idx = 2; break;
69 case 17 ... 64: *idx = 3; break;
70 case 65 ... 128: *idx = 4; break;
71 case 129 ... BIO_MAX_PAGES: *idx = 5; break;
72 default:
73 return NULL;
74 }
75
76
77
78
79 bvl = mempool_alloc(bs->bvec_pools[*idx], gfp_mask);
80 if (bvl)
81 memset(bvl, 0, bvec_nr_vecs(*idx) * sizeof(struct bio_vec));
82
83 return bvl;
84}
85
86void bio_free(struct bio *bio, struct bio_set *bio_set)
87{
88 if (bio->bi_io_vec) {
89 const int pool_idx = BIO_POOL_IDX(bio);
90
91 BIO_BUG_ON(pool_idx >= BIOVEC_NR_POOLS);
92
93 mempool_free(bio->bi_io_vec, bio_set->bvec_pools[pool_idx]);
94 }
95
96 if (bio_integrity(bio))
97 bio_integrity_free(bio, bio_set);
98
99 mempool_free(bio, bio_set->bio_pool);
100}
101
102
103
104
105static void bio_fs_destructor(struct bio *bio)
106{
107 bio_free(bio, fs_bio_set);
108}
109
110void bio_init(struct bio *bio)
111{
112 memset(bio, 0, sizeof(*bio));
113 bio->bi_flags = 1 << BIO_UPTODATE;
114 atomic_set(&bio->bi_cnt, 1);
115}
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131struct bio *bio_alloc_bioset(gfp_t gfp_mask, int nr_iovecs, struct bio_set *bs)
132{
133 struct bio *bio = mempool_alloc(bs->bio_pool, gfp_mask);
134
135 if (likely(bio)) {
136 struct bio_vec *bvl = NULL;
137
138 bio_init(bio);
139 if (likely(nr_iovecs)) {
140 unsigned long uninitialized_var(idx);
141
142 bvl = bvec_alloc_bs(gfp_mask, nr_iovecs, &idx, bs);
143 if (unlikely(!bvl)) {
144 mempool_free(bio, bs->bio_pool);
145 bio = NULL;
146 goto out;
147 }
148 bio->bi_flags |= idx << BIO_POOL_OFFSET;
149 bio->bi_max_vecs = bvec_nr_vecs(idx);
150 }
151 bio->bi_io_vec = bvl;
152 }
153out:
154 return bio;
155}
156
157struct bio *bio_alloc(gfp_t gfp_mask, int nr_iovecs)
158{
159 struct bio *bio = bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set);
160
161 if (bio)
162 bio->bi_destructor = bio_fs_destructor;
163
164 return bio;
165}
166
167void zero_fill_bio(struct bio *bio)
168{
169 unsigned long flags;
170 struct bio_vec *bv;
171 int i;
172
173 bio_for_each_segment(bv, bio, i) {
174 char *data = bvec_kmap_irq(bv, &flags);
175 memset(data, 0, bv->bv_len);
176 flush_dcache_page(bv->bv_page);
177 bvec_kunmap_irq(data, &flags);
178 }
179}
180EXPORT_SYMBOL(zero_fill_bio);
181
182
183
184
185
186
187
188
189
190void bio_put(struct bio *bio)
191{
192 BIO_BUG_ON(!atomic_read(&bio->bi_cnt));
193
194
195
196
197 if (atomic_dec_and_test(&bio->bi_cnt)) {
198 bio->bi_next = NULL;
199 bio->bi_destructor(bio);
200 }
201}
202
203inline int bio_phys_segments(struct request_queue *q, struct bio *bio)
204{
205 if (unlikely(!bio_flagged(bio, BIO_SEG_VALID)))
206 blk_recount_segments(q, bio);
207
208 return bio->bi_phys_segments;
209}
210
211inline int bio_hw_segments(struct request_queue *q, struct bio *bio)
212{
213 if (unlikely(!bio_flagged(bio, BIO_SEG_VALID)))
214 blk_recount_segments(q, bio);
215
216 return bio->bi_hw_segments;
217}
218
219
220
221
222
223
224
225
226
227
228void __bio_clone(struct bio *bio, struct bio *bio_src)
229{
230 memcpy(bio->bi_io_vec, bio_src->bi_io_vec,
231 bio_src->bi_max_vecs * sizeof(struct bio_vec));
232
233
234
235
236
237 bio->bi_sector = bio_src->bi_sector;
238 bio->bi_bdev = bio_src->bi_bdev;
239 bio->bi_flags |= 1 << BIO_CLONED;
240 bio->bi_rw = bio_src->bi_rw;
241 bio->bi_vcnt = bio_src->bi_vcnt;
242 bio->bi_size = bio_src->bi_size;
243 bio->bi_idx = bio_src->bi_idx;
244}
245
246
247
248
249
250
251
252
253struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask)
254{
255 struct bio *b = bio_alloc_bioset(gfp_mask, bio->bi_max_vecs, fs_bio_set);
256
257 if (!b)
258 return NULL;
259
260 b->bi_destructor = bio_fs_destructor;
261 __bio_clone(b, bio);
262
263 if (bio_integrity(bio)) {
264 int ret;
265
266 ret = bio_integrity_clone(b, bio, fs_bio_set);
267
268 if (ret < 0)
269 return NULL;
270 }
271
272 return b;
273}
274
275
276
277
278
279
280
281
282
283
284int bio_get_nr_vecs(struct block_device *bdev)
285{
286 struct request_queue *q = bdev_get_queue(bdev);
287 int nr_pages;
288
289 nr_pages = ((q->max_sectors << 9) + PAGE_SIZE - 1) >> PAGE_SHIFT;
290 if (nr_pages > q->max_phys_segments)
291 nr_pages = q->max_phys_segments;
292 if (nr_pages > q->max_hw_segments)
293 nr_pages = q->max_hw_segments;
294
295 return nr_pages;
296}
297
298static int __bio_add_page(struct request_queue *q, struct bio *bio, struct page
299 *page, unsigned int len, unsigned int offset,
300 unsigned short max_sectors)
301{
302 int retried_segments = 0;
303 struct bio_vec *bvec;
304
305
306
307
308 if (unlikely(bio_flagged(bio, BIO_CLONED)))
309 return 0;
310
311 if (((bio->bi_size + len) >> 9) > max_sectors)
312 return 0;
313
314
315
316
317
318
319 if (bio->bi_vcnt > 0) {
320 struct bio_vec *prev = &bio->bi_io_vec[bio->bi_vcnt - 1];
321
322 if (page == prev->bv_page &&
323 offset == prev->bv_offset + prev->bv_len) {
324 prev->bv_len += len;
325
326 if (q->merge_bvec_fn) {
327 struct bvec_merge_data bvm = {
328 .bi_bdev = bio->bi_bdev,
329 .bi_sector = bio->bi_sector,
330 .bi_size = bio->bi_size,
331 .bi_rw = bio->bi_rw,
332 };
333
334 if (q->merge_bvec_fn(q, &bvm, prev) < len) {
335 prev->bv_len -= len;
336 return 0;
337 }
338 }
339
340 goto done;
341 }
342 }
343
344 if (bio->bi_vcnt >= bio->bi_max_vecs)
345 return 0;
346
347
348
349
350
351
352 while (bio->bi_phys_segments >= q->max_phys_segments
353 || bio->bi_hw_segments >= q->max_hw_segments
354 || BIOVEC_VIRT_OVERSIZE(bio->bi_size)) {
355
356 if (retried_segments)
357 return 0;
358
359 retried_segments = 1;
360 blk_recount_segments(q, bio);
361 }
362
363
364
365
366
367 bvec = &bio->bi_io_vec[bio->bi_vcnt];
368 bvec->bv_page = page;
369 bvec->bv_len = len;
370 bvec->bv_offset = offset;
371
372
373
374
375
376
377 if (q->merge_bvec_fn) {
378 struct bvec_merge_data bvm = {
379 .bi_bdev = bio->bi_bdev,
380 .bi_sector = bio->bi_sector,
381 .bi_size = bio->bi_size,
382 .bi_rw = bio->bi_rw,
383 };
384
385
386
387
388
389 if (q->merge_bvec_fn(q, &bvm, bvec) < len) {
390 bvec->bv_page = NULL;
391 bvec->bv_len = 0;
392 bvec->bv_offset = 0;
393 return 0;
394 }
395 }
396
397
398 if (bio->bi_vcnt && (BIOVEC_PHYS_MERGEABLE(bvec-1, bvec) ||
399 BIOVEC_VIRT_MERGEABLE(bvec-1, bvec)))
400 bio->bi_flags &= ~(1 << BIO_SEG_VALID);
401
402 bio->bi_vcnt++;
403 bio->bi_phys_segments++;
404 bio->bi_hw_segments++;
405 done:
406 bio->bi_size += len;
407 return len;
408}
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424int bio_add_pc_page(struct request_queue *q, struct bio *bio, struct page *page,
425 unsigned int len, unsigned int offset)
426{
427 return __bio_add_page(q, bio, page, len, offset, q->max_hw_sectors);
428}
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443int bio_add_page(struct bio *bio, struct page *page, unsigned int len,
444 unsigned int offset)
445{
446 struct request_queue *q = bdev_get_queue(bio->bi_bdev);
447 return __bio_add_page(q, bio, page, len, offset, q->max_sectors);
448}
449
450struct bio_map_data {
451 struct bio_vec *iovecs;
452 int nr_sgvecs;
453 struct sg_iovec *sgvecs;
454};
455
456static void bio_set_map_data(struct bio_map_data *bmd, struct bio *bio,
457 struct sg_iovec *iov, int iov_count)
458{
459 memcpy(bmd->iovecs, bio->bi_io_vec, sizeof(struct bio_vec) * bio->bi_vcnt);
460 memcpy(bmd->sgvecs, iov, sizeof(struct sg_iovec) * iov_count);
461 bmd->nr_sgvecs = iov_count;
462 bio->bi_private = bmd;
463}
464
465static void bio_free_map_data(struct bio_map_data *bmd)
466{
467 kfree(bmd->iovecs);
468 kfree(bmd->sgvecs);
469 kfree(bmd);
470}
471
472static struct bio_map_data *bio_alloc_map_data(int nr_segs, int iov_count,
473 gfp_t gfp_mask)
474{
475 struct bio_map_data *bmd = kmalloc(sizeof(*bmd), gfp_mask);
476
477 if (!bmd)
478 return NULL;
479
480 bmd->iovecs = kmalloc(sizeof(struct bio_vec) * nr_segs, gfp_mask);
481 if (!bmd->iovecs) {
482 kfree(bmd);
483 return NULL;
484 }
485
486 bmd->sgvecs = kmalloc(sizeof(struct sg_iovec) * iov_count, gfp_mask);
487 if (bmd->sgvecs)
488 return bmd;
489
490 kfree(bmd->iovecs);
491 kfree(bmd);
492 return NULL;
493}
494
495static int __bio_copy_iov(struct bio *bio, struct bio_vec *iovecs,
496 struct sg_iovec *iov, int iov_count, int uncopy)
497{
498 int ret = 0, i;
499 struct bio_vec *bvec;
500 int iov_idx = 0;
501 unsigned int iov_off = 0;
502 int read = bio_data_dir(bio) == READ;
503
504 __bio_for_each_segment(bvec, bio, i, 0) {
505 char *bv_addr = page_address(bvec->bv_page);
506 unsigned int bv_len = iovecs[i].bv_len;
507
508 while (bv_len && iov_idx < iov_count) {
509 unsigned int bytes;
510 char *iov_addr;
511
512 bytes = min_t(unsigned int,
513 iov[iov_idx].iov_len - iov_off, bv_len);
514 iov_addr = iov[iov_idx].iov_base + iov_off;
515
516 if (!ret) {
517 if (!read && !uncopy)
518 ret = copy_from_user(bv_addr, iov_addr,
519 bytes);
520 if (read && uncopy)
521 ret = copy_to_user(iov_addr, bv_addr,
522 bytes);
523
524 if (ret)
525 ret = -EFAULT;
526 }
527
528 bv_len -= bytes;
529 bv_addr += bytes;
530 iov_addr += bytes;
531 iov_off += bytes;
532
533 if (iov[iov_idx].iov_len == iov_off) {
534 iov_idx++;
535 iov_off = 0;
536 }
537 }
538
539 if (uncopy)
540 __free_page(bvec->bv_page);
541 }
542
543 return ret;
544}
545
546
547
548
549
550
551
552
553int bio_uncopy_user(struct bio *bio)
554{
555 struct bio_map_data *bmd = bio->bi_private;
556 int ret;
557
558 ret = __bio_copy_iov(bio, bmd->iovecs, bmd->sgvecs, bmd->nr_sgvecs, 1);
559
560 bio_free_map_data(bmd);
561 bio_put(bio);
562 return ret;
563}
564
565
566
567
568
569
570
571
572
573
574
575
576struct bio *bio_copy_user_iov(struct request_queue *q, struct sg_iovec *iov,
577 int iov_count, int write_to_vm)
578{
579 struct bio_map_data *bmd;
580 struct bio_vec *bvec;
581 struct page *page;
582 struct bio *bio;
583 int i, ret;
584 int nr_pages = 0;
585 unsigned int len = 0;
586
587 for (i = 0; i < iov_count; i++) {
588 unsigned long uaddr;
589 unsigned long end;
590 unsigned long start;
591
592 uaddr = (unsigned long)iov[i].iov_base;
593 end = (uaddr + iov[i].iov_len + PAGE_SIZE - 1) >> PAGE_SHIFT;
594 start = uaddr >> PAGE_SHIFT;
595
596 nr_pages += end - start;
597 len += iov[i].iov_len;
598 }
599
600 bmd = bio_alloc_map_data(nr_pages, iov_count, GFP_KERNEL);
601 if (!bmd)
602 return ERR_PTR(-ENOMEM);
603
604 ret = -ENOMEM;
605 bio = bio_alloc(GFP_KERNEL, nr_pages);
606 if (!bio)
607 goto out_bmd;
608
609 bio->bi_rw |= (!write_to_vm << BIO_RW);
610
611 ret = 0;
612 while (len) {
613 unsigned int bytes = PAGE_SIZE;
614
615 if (bytes > len)
616 bytes = len;
617
618 page = alloc_page(q->bounce_gfp | GFP_KERNEL);
619 if (!page) {
620 ret = -ENOMEM;
621 break;
622 }
623
624 if (bio_add_pc_page(q, bio, page, bytes, 0) < bytes)
625 break;
626
627 len -= bytes;
628 }
629
630 if (ret)
631 goto cleanup;
632
633
634
635
636 if (!write_to_vm) {
637 ret = __bio_copy_iov(bio, bio->bi_io_vec, iov, iov_count, 0);
638 if (ret)
639 goto cleanup;
640 }
641
642 bio_set_map_data(bmd, bio, iov, iov_count);
643 return bio;
644cleanup:
645 bio_for_each_segment(bvec, bio, i)
646 __free_page(bvec->bv_page);
647
648 bio_put(bio);
649out_bmd:
650 bio_free_map_data(bmd);
651 return ERR_PTR(ret);
652}
653
654
655
656
657
658
659
660
661
662
663
664
665struct bio *bio_copy_user(struct request_queue *q, unsigned long uaddr,
666 unsigned int len, int write_to_vm)
667{
668 struct sg_iovec iov;
669
670 iov.iov_base = (void __user *)uaddr;
671 iov.iov_len = len;
672
673 return bio_copy_user_iov(q, &iov, 1, write_to_vm);
674}
675
676static struct bio *__bio_map_user_iov(struct request_queue *q,
677 struct block_device *bdev,
678 struct sg_iovec *iov, int iov_count,
679 int write_to_vm)
680{
681 int i, j;
682 int nr_pages = 0;
683 struct page **pages;
684 struct bio *bio;
685 int cur_page = 0;
686 int ret, offset;
687
688 for (i = 0; i < iov_count; i++) {
689 unsigned long uaddr = (unsigned long)iov[i].iov_base;
690 unsigned long len = iov[i].iov_len;
691 unsigned long end = (uaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
692 unsigned long start = uaddr >> PAGE_SHIFT;
693
694 nr_pages += end - start;
695
696
697
698 if (uaddr & queue_dma_alignment(q))
699 return ERR_PTR(-EINVAL);
700 }
701
702 if (!nr_pages)
703 return ERR_PTR(-EINVAL);
704
705 bio = bio_alloc(GFP_KERNEL, nr_pages);
706 if (!bio)
707 return ERR_PTR(-ENOMEM);
708
709 ret = -ENOMEM;
710 pages = kcalloc(nr_pages, sizeof(struct page *), GFP_KERNEL);
711 if (!pages)
712 goto out;
713
714 for (i = 0; i < iov_count; i++) {
715 unsigned long uaddr = (unsigned long)iov[i].iov_base;
716 unsigned long len = iov[i].iov_len;
717 unsigned long end = (uaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
718 unsigned long start = uaddr >> PAGE_SHIFT;
719 const int local_nr_pages = end - start;
720 const int page_limit = cur_page + local_nr_pages;
721
722 ret = get_user_pages_fast(uaddr, local_nr_pages,
723 write_to_vm, &pages[cur_page]);
724 if (ret < local_nr_pages) {
725 ret = -EFAULT;
726 goto out_unmap;
727 }
728
729 offset = uaddr & ~PAGE_MASK;
730 for (j = cur_page; j < page_limit; j++) {
731 unsigned int bytes = PAGE_SIZE - offset;
732
733 if (len <= 0)
734 break;
735
736 if (bytes > len)
737 bytes = len;
738
739
740
741
742 if (bio_add_pc_page(q, bio, pages[j], bytes, offset) <
743 bytes)
744 break;
745
746 len -= bytes;
747 offset = 0;
748 }
749
750 cur_page = j;
751
752
753
754 while (j < page_limit)
755 page_cache_release(pages[j++]);
756 }
757
758 kfree(pages);
759
760
761
762
763 if (!write_to_vm)
764 bio->bi_rw |= (1 << BIO_RW);
765
766 bio->bi_bdev = bdev;
767 bio->bi_flags |= (1 << BIO_USER_MAPPED);
768 return bio;
769
770 out_unmap:
771 for (i = 0; i < nr_pages; i++) {
772 if(!pages[i])
773 break;
774 page_cache_release(pages[i]);
775 }
776 out:
777 kfree(pages);
778 bio_put(bio);
779 return ERR_PTR(ret);
780}
781
782
783
784
785
786
787
788
789
790
791
792
793struct bio *bio_map_user(struct request_queue *q, struct block_device *bdev,
794 unsigned long uaddr, unsigned int len, int write_to_vm)
795{
796 struct sg_iovec iov;
797
798 iov.iov_base = (void __user *)uaddr;
799 iov.iov_len = len;
800
801 return bio_map_user_iov(q, bdev, &iov, 1, write_to_vm);
802}
803
804
805
806
807
808
809
810
811
812
813
814
815struct bio *bio_map_user_iov(struct request_queue *q, struct block_device *bdev,
816 struct sg_iovec *iov, int iov_count,
817 int write_to_vm)
818{
819 struct bio *bio;
820
821 bio = __bio_map_user_iov(q, bdev, iov, iov_count, write_to_vm);
822
823 if (IS_ERR(bio))
824 return bio;
825
826
827
828
829
830
831
832 bio_get(bio);
833
834 return bio;
835}
836
837static void __bio_unmap_user(struct bio *bio)
838{
839 struct bio_vec *bvec;
840 int i;
841
842
843
844
845 __bio_for_each_segment(bvec, bio, i, 0) {
846 if (bio_data_dir(bio) == READ)
847 set_page_dirty_lock(bvec->bv_page);
848
849 page_cache_release(bvec->bv_page);
850 }
851
852 bio_put(bio);
853}
854
855
856
857
858
859
860
861
862
863
864void bio_unmap_user(struct bio *bio)
865{
866 __bio_unmap_user(bio);
867 bio_put(bio);
868}
869
870static void bio_map_kern_endio(struct bio *bio, int err)
871{
872 bio_put(bio);
873}
874
875
876static struct bio *__bio_map_kern(struct request_queue *q, void *data,
877 unsigned int len, gfp_t gfp_mask)
878{
879 unsigned long kaddr = (unsigned long)data;
880 unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
881 unsigned long start = kaddr >> PAGE_SHIFT;
882 const int nr_pages = end - start;
883 int offset, i;
884 struct bio *bio;
885
886 bio = bio_alloc(gfp_mask, nr_pages);
887 if (!bio)
888 return ERR_PTR(-ENOMEM);
889
890 offset = offset_in_page(kaddr);
891 for (i = 0; i < nr_pages; i++) {
892 unsigned int bytes = PAGE_SIZE - offset;
893
894 if (len <= 0)
895 break;
896
897 if (bytes > len)
898 bytes = len;
899
900 if (bio_add_pc_page(q, bio, virt_to_page(data), bytes,
901 offset) < bytes)
902 break;
903
904 data += bytes;
905 len -= bytes;
906 offset = 0;
907 }
908
909 bio->bi_end_io = bio_map_kern_endio;
910 return bio;
911}
912
913
914
915
916
917
918
919
920
921
922
923struct bio *bio_map_kern(struct request_queue *q, void *data, unsigned int len,
924 gfp_t gfp_mask)
925{
926 struct bio *bio;
927
928 bio = __bio_map_kern(q, data, len, gfp_mask);
929 if (IS_ERR(bio))
930 return bio;
931
932 if (bio->bi_size == len)
933 return bio;
934
935
936
937
938 bio_put(bio);
939 return ERR_PTR(-EINVAL);
940}
941
942static void bio_copy_kern_endio(struct bio *bio, int err)
943{
944 struct bio_vec *bvec;
945 const int read = bio_data_dir(bio) == READ;
946 struct bio_map_data *bmd = bio->bi_private;
947 int i;
948 char *p = bmd->sgvecs[0].iov_base;
949
950 __bio_for_each_segment(bvec, bio, i, 0) {
951 char *addr = page_address(bvec->bv_page);
952 int len = bmd->iovecs[i].bv_len;
953
954 if (read && !err)
955 memcpy(p, addr, len);
956
957 __free_page(bvec->bv_page);
958 p += len;
959 }
960
961 bio_free_map_data(bmd);
962 bio_put(bio);
963}
964
965
966
967
968
969
970
971
972
973
974
975
976struct bio *bio_copy_kern(struct request_queue *q, void *data, unsigned int len,
977 gfp_t gfp_mask, int reading)
978{
979 unsigned long kaddr = (unsigned long)data;
980 unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
981 unsigned long start = kaddr >> PAGE_SHIFT;
982 const int nr_pages = end - start;
983 struct bio *bio;
984 struct bio_vec *bvec;
985 struct bio_map_data *bmd;
986 int i, ret;
987 struct sg_iovec iov;
988
989 iov.iov_base = data;
990 iov.iov_len = len;
991
992 bmd = bio_alloc_map_data(nr_pages, 1, gfp_mask);
993 if (!bmd)
994 return ERR_PTR(-ENOMEM);
995
996 ret = -ENOMEM;
997 bio = bio_alloc(gfp_mask, nr_pages);
998 if (!bio)
999 goto out_bmd;
1000
1001 while (len) {
1002 struct page *page;
1003 unsigned int bytes = PAGE_SIZE;
1004
1005 if (bytes > len)
1006 bytes = len;
1007
1008 page = alloc_page(q->bounce_gfp | gfp_mask);
1009 if (!page) {
1010 ret = -ENOMEM;
1011 goto cleanup;
1012 }
1013
1014 if (bio_add_pc_page(q, bio, page, bytes, 0) < bytes) {
1015 ret = -EINVAL;
1016 goto cleanup;
1017 }
1018
1019 len -= bytes;
1020 }
1021
1022 if (!reading) {
1023 void *p = data;
1024
1025 bio_for_each_segment(bvec, bio, i) {
1026 char *addr = page_address(bvec->bv_page);
1027
1028 memcpy(addr, p, bvec->bv_len);
1029 p += bvec->bv_len;
1030 }
1031 }
1032
1033 bio->bi_private = bmd;
1034 bio->bi_end_io = bio_copy_kern_endio;
1035
1036 bio_set_map_data(bmd, bio, &iov, 1);
1037 return bio;
1038cleanup:
1039 bio_for_each_segment(bvec, bio, i)
1040 __free_page(bvec->bv_page);
1041
1042 bio_put(bio);
1043out_bmd:
1044 bio_free_map_data(bmd);
1045
1046 return ERR_PTR(ret);
1047}
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078void bio_set_pages_dirty(struct bio *bio)
1079{
1080 struct bio_vec *bvec = bio->bi_io_vec;
1081 int i;
1082
1083 for (i = 0; i < bio->bi_vcnt; i++) {
1084 struct page *page = bvec[i].bv_page;
1085
1086 if (page && !PageCompound(page))
1087 set_page_dirty_lock(page);
1088 }
1089}
1090
1091static void bio_release_pages(struct bio *bio)
1092{
1093 struct bio_vec *bvec = bio->bi_io_vec;
1094 int i;
1095
1096 for (i = 0; i < bio->bi_vcnt; i++) {
1097 struct page *page = bvec[i].bv_page;
1098
1099 if (page)
1100 put_page(page);
1101 }
1102}
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115static void bio_dirty_fn(struct work_struct *work);
1116
1117static DECLARE_WORK(bio_dirty_work, bio_dirty_fn);
1118static DEFINE_SPINLOCK(bio_dirty_lock);
1119static struct bio *bio_dirty_list;
1120
1121
1122
1123
1124static void bio_dirty_fn(struct work_struct *work)
1125{
1126 unsigned long flags;
1127 struct bio *bio;
1128
1129 spin_lock_irqsave(&bio_dirty_lock, flags);
1130 bio = bio_dirty_list;
1131 bio_dirty_list = NULL;
1132 spin_unlock_irqrestore(&bio_dirty_lock, flags);
1133
1134 while (bio) {
1135 struct bio *next = bio->bi_private;
1136
1137 bio_set_pages_dirty(bio);
1138 bio_release_pages(bio);
1139 bio_put(bio);
1140 bio = next;
1141 }
1142}
1143
1144void bio_check_pages_dirty(struct bio *bio)
1145{
1146 struct bio_vec *bvec = bio->bi_io_vec;
1147 int nr_clean_pages = 0;
1148 int i;
1149
1150 for (i = 0; i < bio->bi_vcnt; i++) {
1151 struct page *page = bvec[i].bv_page;
1152
1153 if (PageDirty(page) || PageCompound(page)) {
1154 page_cache_release(page);
1155 bvec[i].bv_page = NULL;
1156 } else {
1157 nr_clean_pages++;
1158 }
1159 }
1160
1161 if (nr_clean_pages) {
1162 unsigned long flags;
1163
1164 spin_lock_irqsave(&bio_dirty_lock, flags);
1165 bio->bi_private = bio_dirty_list;
1166 bio_dirty_list = bio;
1167 spin_unlock_irqrestore(&bio_dirty_lock, flags);
1168 schedule_work(&bio_dirty_work);
1169 } else {
1170 bio_put(bio);
1171 }
1172}
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188void bio_endio(struct bio *bio, int error)
1189{
1190 if (error)
1191 clear_bit(BIO_UPTODATE, &bio->bi_flags);
1192 else if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
1193 error = -EIO;
1194
1195 if (bio->bi_end_io)
1196 bio->bi_end_io(bio, error);
1197}
1198
1199void bio_pair_release(struct bio_pair *bp)
1200{
1201 if (atomic_dec_and_test(&bp->cnt)) {
1202 struct bio *master = bp->bio1.bi_private;
1203
1204 bio_endio(master, bp->error);
1205 mempool_free(bp, bp->bio2.bi_private);
1206 }
1207}
1208
1209static void bio_pair_end_1(struct bio *bi, int err)
1210{
1211 struct bio_pair *bp = container_of(bi, struct bio_pair, bio1);
1212
1213 if (err)
1214 bp->error = err;
1215
1216 bio_pair_release(bp);
1217}
1218
1219static void bio_pair_end_2(struct bio *bi, int err)
1220{
1221 struct bio_pair *bp = container_of(bi, struct bio_pair, bio2);
1222
1223 if (err)
1224 bp->error = err;
1225
1226 bio_pair_release(bp);
1227}
1228
1229
1230
1231
1232
1233struct bio_pair *bio_split(struct bio *bi, mempool_t *pool, int first_sectors)
1234{
1235 struct bio_pair *bp = mempool_alloc(pool, GFP_NOIO);
1236
1237 if (!bp)
1238 return bp;
1239
1240 blk_add_trace_pdu_int(bdev_get_queue(bi->bi_bdev), BLK_TA_SPLIT, bi,
1241 bi->bi_sector + first_sectors);
1242
1243 BUG_ON(bi->bi_vcnt != 1);
1244 BUG_ON(bi->bi_idx != 0);
1245 atomic_set(&bp->cnt, 3);
1246 bp->error = 0;
1247 bp->bio1 = *bi;
1248 bp->bio2 = *bi;
1249 bp->bio2.bi_sector += first_sectors;
1250 bp->bio2.bi_size -= first_sectors << 9;
1251 bp->bio1.bi_size = first_sectors << 9;
1252
1253 bp->bv1 = bi->bi_io_vec[0];
1254 bp->bv2 = bi->bi_io_vec[0];
1255 bp->bv2.bv_offset += first_sectors << 9;
1256 bp->bv2.bv_len -= first_sectors << 9;
1257 bp->bv1.bv_len = first_sectors << 9;
1258
1259 bp->bio1.bi_io_vec = &bp->bv1;
1260 bp->bio2.bi_io_vec = &bp->bv2;
1261
1262 bp->bio1.bi_max_vecs = 1;
1263 bp->bio2.bi_max_vecs = 1;
1264
1265 bp->bio1.bi_end_io = bio_pair_end_1;
1266 bp->bio2.bi_end_io = bio_pair_end_2;
1267
1268 bp->bio1.bi_private = bi;
1269 bp->bio2.bi_private = pool;
1270
1271 if (bio_integrity(bi))
1272 bio_integrity_split(bi, bp, first_sectors);
1273
1274 return bp;
1275}
1276
1277
1278
1279
1280
1281
1282static int biovec_create_pools(struct bio_set *bs, int pool_entries)
1283{
1284 int i;
1285
1286 for (i = 0; i < BIOVEC_NR_POOLS; i++) {
1287 struct biovec_slab *bp = bvec_slabs + i;
1288 mempool_t **bvp = bs->bvec_pools + i;
1289
1290 *bvp = mempool_create_slab_pool(pool_entries, bp->slab);
1291 if (!*bvp)
1292 return -ENOMEM;
1293 }
1294 return 0;
1295}
1296
1297static void biovec_free_pools(struct bio_set *bs)
1298{
1299 int i;
1300
1301 for (i = 0; i < BIOVEC_NR_POOLS; i++) {
1302 mempool_t *bvp = bs->bvec_pools[i];
1303
1304 if (bvp)
1305 mempool_destroy(bvp);
1306 }
1307
1308}
1309
1310void bioset_free(struct bio_set *bs)
1311{
1312 if (bs->bio_pool)
1313 mempool_destroy(bs->bio_pool);
1314
1315 bioset_integrity_free(bs);
1316 biovec_free_pools(bs);
1317
1318 kfree(bs);
1319}
1320
1321struct bio_set *bioset_create(int bio_pool_size, int bvec_pool_size)
1322{
1323 struct bio_set *bs = kzalloc(sizeof(*bs), GFP_KERNEL);
1324
1325 if (!bs)
1326 return NULL;
1327
1328 bs->bio_pool = mempool_create_slab_pool(bio_pool_size, bio_slab);
1329 if (!bs->bio_pool)
1330 goto bad;
1331
1332 if (bioset_integrity_create(bs, bio_pool_size))
1333 goto bad;
1334
1335 if (!biovec_create_pools(bs, bvec_pool_size))
1336 return bs;
1337
1338bad:
1339 bioset_free(bs);
1340 return NULL;
1341}
1342
1343static void __init biovec_init_slabs(void)
1344{
1345 int i;
1346
1347 for (i = 0; i < BIOVEC_NR_POOLS; i++) {
1348 int size;
1349 struct biovec_slab *bvs = bvec_slabs + i;
1350
1351 size = bvs->nr_vecs * sizeof(struct bio_vec);
1352 bvs->slab = kmem_cache_create(bvs->name, size, 0,
1353 SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
1354 }
1355}
1356
1357static int __init init_bio(void)
1358{
1359 bio_slab = KMEM_CACHE(bio, SLAB_HWCACHE_ALIGN|SLAB_PANIC);
1360
1361 bio_integrity_init_slab();
1362 biovec_init_slabs();
1363
1364 fs_bio_set = bioset_create(BIO_POOL_SIZE, 2);
1365 if (!fs_bio_set)
1366 panic("bio: can't allocate bios\n");
1367
1368 bio_split_pool = mempool_create_kmalloc_pool(BIO_SPLIT_ENTRIES,
1369 sizeof(struct bio_pair));
1370 if (!bio_split_pool)
1371 panic("bio: can't create split pool\n");
1372
1373 return 0;
1374}
1375
1376subsys_initcall(init_bio);
1377
1378EXPORT_SYMBOL(bio_alloc);
1379EXPORT_SYMBOL(bio_put);
1380EXPORT_SYMBOL(bio_free);
1381EXPORT_SYMBOL(bio_endio);
1382EXPORT_SYMBOL(bio_init);
1383EXPORT_SYMBOL(__bio_clone);
1384EXPORT_SYMBOL(bio_clone);
1385EXPORT_SYMBOL(bio_phys_segments);
1386EXPORT_SYMBOL(bio_hw_segments);
1387EXPORT_SYMBOL(bio_add_page);
1388EXPORT_SYMBOL(bio_add_pc_page);
1389EXPORT_SYMBOL(bio_get_nr_vecs);
1390EXPORT_SYMBOL(bio_map_user);
1391EXPORT_SYMBOL(bio_unmap_user);
1392EXPORT_SYMBOL(bio_map_kern);
1393EXPORT_SYMBOL(bio_copy_kern);
1394EXPORT_SYMBOL(bio_pair_release);
1395EXPORT_SYMBOL(bio_split);
1396EXPORT_SYMBOL(bio_split_pool);
1397EXPORT_SYMBOL(bio_copy_user);
1398EXPORT_SYMBOL(bio_uncopy_user);
1399EXPORT_SYMBOL(bioset_create);
1400EXPORT_SYMBOL(bioset_free);
1401EXPORT_SYMBOL(bio_alloc_bioset);
1402