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