1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include <linux/kernel.h>
16#include <linux/module.h>
17#include <linux/mm.h>
18#include <linux/kdev_t.h>
19#include <linux/bio.h>
20#include <linux/fs.h>
21#include <linux/buffer_head.h>
22#include <linux/blkdev.h>
23#include <linux/highmem.h>
24#include <linux/prefetch.h>
25#include <linux/mpage.h>
26#include <linux/writeback.h>
27#include <linux/backing-dev.h>
28#include <linux/pagevec.h>
29
30
31
32
33
34
35
36
37
38
39
40
41
42static void mpage_end_io_read(struct bio *bio, int err)
43{
44 const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
45 struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
46
47 do {
48 struct page *page = bvec->bv_page;
49
50 if (--bvec >= bio->bi_io_vec)
51 prefetchw(&bvec->bv_page->flags);
52
53 if (uptodate) {
54 SetPageUptodate(page);
55 } else {
56 ClearPageUptodate(page);
57 SetPageError(page);
58 }
59 unlock_page(page);
60 } while (bvec >= bio->bi_io_vec);
61 bio_put(bio);
62}
63
64static void mpage_end_io_write(struct bio *bio, int err)
65{
66 const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
67 struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
68
69 do {
70 struct page *page = bvec->bv_page;
71
72 if (--bvec >= bio->bi_io_vec)
73 prefetchw(&bvec->bv_page->flags);
74
75 if (!uptodate){
76 SetPageError(page);
77 if (page->mapping)
78 set_bit(AS_EIO, &page->mapping->flags);
79 }
80 end_page_writeback(page);
81 } while (bvec >= bio->bi_io_vec);
82 bio_put(bio);
83}
84
85static struct bio *mpage_bio_submit(int rw, struct bio *bio)
86{
87 bio->bi_end_io = mpage_end_io_read;
88 if (rw == WRITE)
89 bio->bi_end_io = mpage_end_io_write;
90 submit_bio(rw, bio);
91 return NULL;
92}
93
94static struct bio *
95mpage_alloc(struct block_device *bdev,
96 sector_t first_sector, int nr_vecs,
97 gfp_t gfp_flags)
98{
99 struct bio *bio;
100
101 bio = bio_alloc(gfp_flags, nr_vecs);
102
103 if (bio == NULL && (current->flags & PF_MEMALLOC)) {
104 while (!bio && (nr_vecs /= 2))
105 bio = bio_alloc(gfp_flags, nr_vecs);
106 }
107
108 if (bio) {
109 bio->bi_bdev = bdev;
110 bio->bi_sector = first_sector;
111 }
112 return bio;
113}
114
115
116
117
118
119
120
121
122
123
124
125static void
126map_buffer_to_page(struct page *page, struct buffer_head *bh, int page_block)
127{
128 struct inode *inode = page->mapping->host;
129 struct buffer_head *page_bh, *head;
130 int block = 0;
131
132 if (!page_has_buffers(page)) {
133
134
135
136
137 if (inode->i_blkbits == PAGE_CACHE_SHIFT &&
138 buffer_uptodate(bh)) {
139 SetPageUptodate(page);
140 return;
141 }
142 create_empty_buffers(page, 1 << inode->i_blkbits, 0);
143 }
144 head = page_buffers(page);
145 page_bh = head;
146 do {
147 if (block == page_block) {
148 page_bh->b_state = bh->b_state;
149 page_bh->b_bdev = bh->b_bdev;
150 page_bh->b_blocknr = bh->b_blocknr;
151 break;
152 }
153 page_bh = page_bh->b_this_page;
154 block++;
155 } while (page_bh != head);
156}
157
158
159
160
161
162
163
164
165
166
167static struct bio *
168do_mpage_readpage(struct bio *bio, struct page *page, unsigned nr_pages,
169 sector_t *last_block_in_bio, struct buffer_head *map_bh,
170 unsigned long *first_logical_block, get_block_t get_block)
171{
172 struct inode *inode = page->mapping->host;
173 const unsigned blkbits = inode->i_blkbits;
174 const unsigned blocks_per_page = PAGE_CACHE_SIZE >> blkbits;
175 const unsigned blocksize = 1 << blkbits;
176 sector_t block_in_file;
177 sector_t last_block;
178 sector_t last_block_in_file;
179 sector_t blocks[MAX_BUF_PER_PAGE];
180 unsigned page_block;
181 unsigned first_hole = blocks_per_page;
182 struct block_device *bdev = NULL;
183 int length;
184 int fully_mapped = 1;
185 unsigned nblocks;
186 unsigned relative_block;
187
188 if (page_has_buffers(page))
189 goto confused;
190
191 block_in_file = (sector_t)page->index << (PAGE_CACHE_SHIFT - blkbits);
192 last_block = block_in_file + nr_pages * blocks_per_page;
193 last_block_in_file = (i_size_read(inode) + blocksize - 1) >> blkbits;
194 if (last_block > last_block_in_file)
195 last_block = last_block_in_file;
196 page_block = 0;
197
198
199
200
201 nblocks = map_bh->b_size >> blkbits;
202 if (buffer_mapped(map_bh) && block_in_file > *first_logical_block &&
203 block_in_file < (*first_logical_block + nblocks)) {
204 unsigned map_offset = block_in_file - *first_logical_block;
205 unsigned last = nblocks - map_offset;
206
207 for (relative_block = 0; ; relative_block++) {
208 if (relative_block == last) {
209 clear_buffer_mapped(map_bh);
210 break;
211 }
212 if (page_block == blocks_per_page)
213 break;
214 blocks[page_block] = map_bh->b_blocknr + map_offset +
215 relative_block;
216 page_block++;
217 block_in_file++;
218 }
219 bdev = map_bh->b_bdev;
220 }
221
222
223
224
225 map_bh->b_page = page;
226 while (page_block < blocks_per_page) {
227 map_bh->b_state = 0;
228 map_bh->b_size = 0;
229
230 if (block_in_file < last_block) {
231 map_bh->b_size = (last_block-block_in_file) << blkbits;
232 if (get_block(inode, block_in_file, map_bh, 0))
233 goto confused;
234 *first_logical_block = block_in_file;
235 }
236
237 if (!buffer_mapped(map_bh)) {
238 fully_mapped = 0;
239 if (first_hole == blocks_per_page)
240 first_hole = page_block;
241 page_block++;
242 block_in_file++;
243 clear_buffer_mapped(map_bh);
244 continue;
245 }
246
247
248
249
250
251
252
253 if (buffer_uptodate(map_bh)) {
254 map_buffer_to_page(page, map_bh, page_block);
255 goto confused;
256 }
257
258 if (first_hole != blocks_per_page)
259 goto confused;
260
261
262 if (page_block && blocks[page_block-1] != map_bh->b_blocknr-1)
263 goto confused;
264 nblocks = map_bh->b_size >> blkbits;
265 for (relative_block = 0; ; relative_block++) {
266 if (relative_block == nblocks) {
267 clear_buffer_mapped(map_bh);
268 break;
269 } else if (page_block == blocks_per_page)
270 break;
271 blocks[page_block] = map_bh->b_blocknr+relative_block;
272 page_block++;
273 block_in_file++;
274 }
275 bdev = map_bh->b_bdev;
276 }
277
278 if (first_hole != blocks_per_page) {
279 zero_user_segment(page, first_hole << blkbits, PAGE_CACHE_SIZE);
280 if (first_hole == 0) {
281 SetPageUptodate(page);
282 unlock_page(page);
283 goto out;
284 }
285 } else if (fully_mapped) {
286 SetPageMappedToDisk(page);
287 }
288
289
290
291
292 if (bio && (*last_block_in_bio != blocks[0] - 1))
293 bio = mpage_bio_submit(READ, bio);
294
295alloc_new:
296 if (bio == NULL) {
297 bio = mpage_alloc(bdev, blocks[0] << (blkbits - 9),
298 min_t(int, nr_pages, bio_get_nr_vecs(bdev)),
299 GFP_KERNEL);
300 if (bio == NULL)
301 goto confused;
302 }
303
304 length = first_hole << blkbits;
305 if (bio_add_page(bio, page, length, 0) < length) {
306 bio = mpage_bio_submit(READ, bio);
307 goto alloc_new;
308 }
309
310 if (buffer_boundary(map_bh) || (first_hole != blocks_per_page))
311 bio = mpage_bio_submit(READ, bio);
312 else
313 *last_block_in_bio = blocks[blocks_per_page - 1];
314out:
315 return bio;
316
317confused:
318 if (bio)
319 bio = mpage_bio_submit(READ, bio);
320 if (!PageUptodate(page))
321 block_read_full_page(page, get_block);
322 else
323 unlock_page(page);
324 goto out;
325}
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370int
371mpage_readpages(struct address_space *mapping, struct list_head *pages,
372 unsigned nr_pages, get_block_t get_block)
373{
374 struct bio *bio = NULL;
375 unsigned page_idx;
376 sector_t last_block_in_bio = 0;
377 struct buffer_head map_bh;
378 unsigned long first_logical_block = 0;
379
380 clear_buffer_mapped(&map_bh);
381 for (page_idx = 0; page_idx < nr_pages; page_idx++) {
382 struct page *page = list_entry(pages->prev, struct page, lru);
383
384 prefetchw(&page->flags);
385 list_del(&page->lru);
386 if (!add_to_page_cache_lru(page, mapping,
387 page->index, GFP_KERNEL)) {
388 bio = do_mpage_readpage(bio, page,
389 nr_pages - page_idx,
390 &last_block_in_bio, &map_bh,
391 &first_logical_block,
392 get_block);
393 }
394 page_cache_release(page);
395 }
396 BUG_ON(!list_empty(pages));
397 if (bio)
398 mpage_bio_submit(READ, bio);
399 return 0;
400}
401EXPORT_SYMBOL(mpage_readpages);
402
403
404
405
406int mpage_readpage(struct page *page, get_block_t get_block)
407{
408 struct bio *bio = NULL;
409 sector_t last_block_in_bio = 0;
410 struct buffer_head map_bh;
411 unsigned long first_logical_block = 0;
412
413 clear_buffer_mapped(&map_bh);
414 bio = do_mpage_readpage(bio, page, 1, &last_block_in_bio,
415 &map_bh, &first_logical_block, get_block);
416 if (bio)
417 mpage_bio_submit(READ, bio);
418 return 0;
419}
420EXPORT_SYMBOL(mpage_readpage);
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438struct mpage_data {
439 struct bio *bio;
440 sector_t last_block_in_bio;
441 get_block_t *get_block;
442 unsigned use_writepage;
443};
444
445static int __mpage_writepage(struct page *page, struct writeback_control *wbc,
446 void *data)
447{
448 struct mpage_data *mpd = data;
449 struct bio *bio = mpd->bio;
450 struct address_space *mapping = page->mapping;
451 struct inode *inode = page->mapping->host;
452 const unsigned blkbits = inode->i_blkbits;
453 unsigned long end_index;
454 const unsigned blocks_per_page = PAGE_CACHE_SIZE >> blkbits;
455 sector_t last_block;
456 sector_t block_in_file;
457 sector_t blocks[MAX_BUF_PER_PAGE];
458 unsigned page_block;
459 unsigned first_unmapped = blocks_per_page;
460 struct block_device *bdev = NULL;
461 int boundary = 0;
462 sector_t boundary_block = 0;
463 struct block_device *boundary_bdev = NULL;
464 int length;
465 struct buffer_head map_bh;
466 loff_t i_size = i_size_read(inode);
467 int ret = 0;
468
469 if (page_has_buffers(page)) {
470 struct buffer_head *head = page_buffers(page);
471 struct buffer_head *bh = head;
472
473
474 page_block = 0;
475 do {
476 BUG_ON(buffer_locked(bh));
477 if (!buffer_mapped(bh)) {
478
479
480
481
482 if (buffer_dirty(bh))
483 goto confused;
484 if (first_unmapped == blocks_per_page)
485 first_unmapped = page_block;
486 continue;
487 }
488
489 if (first_unmapped != blocks_per_page)
490 goto confused;
491
492 if (!buffer_dirty(bh) || !buffer_uptodate(bh))
493 goto confused;
494 if (page_block) {
495 if (bh->b_blocknr != blocks[page_block-1] + 1)
496 goto confused;
497 }
498 blocks[page_block++] = bh->b_blocknr;
499 boundary = buffer_boundary(bh);
500 if (boundary) {
501 boundary_block = bh->b_blocknr;
502 boundary_bdev = bh->b_bdev;
503 }
504 bdev = bh->b_bdev;
505 } while ((bh = bh->b_this_page) != head);
506
507 if (first_unmapped)
508 goto page_is_mapped;
509
510
511
512
513
514
515
516 goto confused;
517 }
518
519
520
521
522 BUG_ON(!PageUptodate(page));
523 block_in_file = (sector_t)page->index << (PAGE_CACHE_SHIFT - blkbits);
524 last_block = (i_size - 1) >> blkbits;
525 map_bh.b_page = page;
526 for (page_block = 0; page_block < blocks_per_page; ) {
527
528 map_bh.b_state = 0;
529 map_bh.b_size = 1 << blkbits;
530 if (mpd->get_block(inode, block_in_file, &map_bh, 1))
531 goto confused;
532 if (buffer_new(&map_bh))
533 unmap_underlying_metadata(map_bh.b_bdev,
534 map_bh.b_blocknr);
535 if (buffer_boundary(&map_bh)) {
536 boundary_block = map_bh.b_blocknr;
537 boundary_bdev = map_bh.b_bdev;
538 }
539 if (page_block) {
540 if (map_bh.b_blocknr != blocks[page_block-1] + 1)
541 goto confused;
542 }
543 blocks[page_block++] = map_bh.b_blocknr;
544 boundary = buffer_boundary(&map_bh);
545 bdev = map_bh.b_bdev;
546 if (block_in_file == last_block)
547 break;
548 block_in_file++;
549 }
550 BUG_ON(page_block == 0);
551
552 first_unmapped = page_block;
553
554page_is_mapped:
555 end_index = i_size >> PAGE_CACHE_SHIFT;
556 if (page->index >= end_index) {
557
558
559
560
561
562
563
564
565 unsigned offset = i_size & (PAGE_CACHE_SIZE - 1);
566
567 if (page->index > end_index || !offset)
568 goto confused;
569 zero_user_segment(page, offset, PAGE_CACHE_SIZE);
570 }
571
572
573
574
575 if (bio && mpd->last_block_in_bio != blocks[0] - 1)
576 bio = mpage_bio_submit(WRITE, bio);
577
578alloc_new:
579 if (bio == NULL) {
580 bio = mpage_alloc(bdev, blocks[0] << (blkbits - 9),
581 bio_get_nr_vecs(bdev), GFP_NOFS|__GFP_HIGH);
582 if (bio == NULL)
583 goto confused;
584 }
585
586
587
588
589
590
591 length = first_unmapped << blkbits;
592 if (bio_add_page(bio, page, length, 0) < length) {
593 bio = mpage_bio_submit(WRITE, bio);
594 goto alloc_new;
595 }
596
597
598
599
600
601 if (page_has_buffers(page)) {
602 struct buffer_head *head = page_buffers(page);
603 struct buffer_head *bh = head;
604 unsigned buffer_counter = 0;
605
606 do {
607 if (buffer_counter++ == first_unmapped)
608 break;
609 clear_buffer_dirty(bh);
610 bh = bh->b_this_page;
611 } while (bh != head);
612
613
614
615
616
617
618 if (buffer_heads_over_limit && PageUptodate(page))
619 try_to_free_buffers(page);
620 }
621
622 BUG_ON(PageWriteback(page));
623 set_page_writeback(page);
624 unlock_page(page);
625 if (boundary || (first_unmapped != blocks_per_page)) {
626 bio = mpage_bio_submit(WRITE, bio);
627 if (boundary_block) {
628 write_boundary_block(boundary_bdev,
629 boundary_block, 1 << blkbits);
630 }
631 } else {
632 mpd->last_block_in_bio = blocks[blocks_per_page - 1];
633 }
634 goto out;
635
636confused:
637 if (bio)
638 bio = mpage_bio_submit(WRITE, bio);
639
640 if (mpd->use_writepage) {
641 ret = mapping->a_ops->writepage(page, wbc);
642 } else {
643 ret = -EAGAIN;
644 goto out;
645 }
646
647
648
649 mapping_set_error(mapping, ret);
650out:
651 mpd->bio = bio;
652 return ret;
653}
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674int
675mpage_writepages(struct address_space *mapping,
676 struct writeback_control *wbc, get_block_t get_block)
677{
678 int ret;
679
680 if (!get_block)
681 ret = generic_writepages(mapping, wbc);
682 else {
683 struct mpage_data mpd = {
684 .bio = NULL,
685 .last_block_in_bio = 0,
686 .get_block = get_block,
687 .use_writepage = 1,
688 };
689
690 ret = write_cache_pages(mapping, wbc, __mpage_writepage, &mpd);
691 if (mpd.bio)
692 mpage_bio_submit(WRITE, mpd.bio);
693 }
694 return ret;
695}
696EXPORT_SYMBOL(mpage_writepages);
697
698int mpage_writepage(struct page *page, get_block_t get_block,
699 struct writeback_control *wbc)
700{
701 struct mpage_data mpd = {
702 .bio = NULL,
703 .last_block_in_bio = 0,
704 .get_block = get_block,
705 .use_writepage = 0,
706 };
707 int ret = __mpage_writepage(page, wbc, &mpd);
708 if (mpd.bio)
709 mpage_bio_submit(WRITE, mpd.bio);
710 return ret;
711}
712EXPORT_SYMBOL(mpage_writepage);
713