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