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