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/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
375 map_bh.b_state = 0;
376 map_bh.b_size = 0;
377 for (page_idx = 0; page_idx < nr_pages; page_idx++) {
378 struct page *page = list_entry(pages->prev, struct page, lru);
379
380 prefetchw(&page->flags);
381 list_del(&page->lru);
382 if (!add_to_page_cache_lru(page, mapping,
383 page->index, GFP_KERNEL)) {
384 bio = do_mpage_readpage(bio, page,
385 nr_pages - page_idx,
386 &last_block_in_bio, &map_bh,
387 &first_logical_block,
388 get_block);
389 }
390 page_cache_release(page);
391 }
392 BUG_ON(!list_empty(pages));
393 if (bio)
394 mpage_bio_submit(READ, bio);
395 return 0;
396}
397EXPORT_SYMBOL(mpage_readpages);
398
399
400
401
402int mpage_readpage(struct page *page, get_block_t get_block)
403{
404 struct bio *bio = NULL;
405 sector_t last_block_in_bio = 0;
406 struct buffer_head map_bh;
407 unsigned long first_logical_block = 0;
408
409 map_bh.b_state = 0;
410 map_bh.b_size = 0;
411 bio = do_mpage_readpage(bio, page, 1, &last_block_in_bio,
412 &map_bh, &first_logical_block, get_block);
413 if (bio)
414 mpage_bio_submit(READ, bio);
415 return 0;
416}
417EXPORT_SYMBOL(mpage_readpage);
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436struct mpage_data {
437 struct bio *bio;
438 sector_t last_block_in_bio;
439 get_block_t *get_block;
440 unsigned use_writepage;
441};
442
443static int __mpage_writepage(struct page *page, struct writeback_control *wbc,
444 void *data)
445{
446 struct mpage_data *mpd = data;
447 struct bio *bio = mpd->bio;
448 struct address_space *mapping = page->mapping;
449 struct inode *inode = page->mapping->host;
450 const unsigned blkbits = inode->i_blkbits;
451 unsigned long end_index;
452 const unsigned blocks_per_page = PAGE_CACHE_SIZE >> blkbits;
453 sector_t last_block;
454 sector_t block_in_file;
455 sector_t blocks[MAX_BUF_PER_PAGE];
456 unsigned page_block;
457 unsigned first_unmapped = blocks_per_page;
458 struct block_device *bdev = NULL;
459 int boundary = 0;
460 sector_t boundary_block = 0;
461 struct block_device *boundary_bdev = NULL;
462 int length;
463 struct buffer_head map_bh;
464 loff_t i_size = i_size_read(inode);
465 int ret = 0;
466
467 if (page_has_buffers(page)) {
468 struct buffer_head *head = page_buffers(page);
469 struct buffer_head *bh = head;
470
471
472 page_block = 0;
473 do {
474 BUG_ON(buffer_locked(bh));
475 if (!buffer_mapped(bh)) {
476
477
478
479
480 if (buffer_dirty(bh))
481 goto confused;
482 if (first_unmapped == blocks_per_page)
483 first_unmapped = page_block;
484 continue;
485 }
486
487 if (first_unmapped != blocks_per_page)
488 goto confused;
489
490 if (!buffer_dirty(bh) || !buffer_uptodate(bh))
491 goto confused;
492 if (page_block) {
493 if (bh->b_blocknr != blocks[page_block-1] + 1)
494 goto confused;
495 }
496 blocks[page_block++] = bh->b_blocknr;
497 boundary = buffer_boundary(bh);
498 if (boundary) {
499 boundary_block = bh->b_blocknr;
500 boundary_bdev = bh->b_bdev;
501 }
502 bdev = bh->b_bdev;
503 } while ((bh = bh->b_this_page) != head);
504
505 if (first_unmapped)
506 goto page_is_mapped;
507
508
509
510
511
512
513
514 goto confused;
515 }
516
517
518
519
520 BUG_ON(!PageUptodate(page));
521 block_in_file = (sector_t)page->index << (PAGE_CACHE_SHIFT - blkbits);
522 last_block = (i_size - 1) >> blkbits;
523 map_bh.b_page = page;
524 for (page_block = 0; page_block < blocks_per_page; ) {
525
526 map_bh.b_state = 0;
527 map_bh.b_size = 1 << blkbits;
528 if (mpd->get_block(inode, block_in_file, &map_bh, 1))
529 goto confused;
530 if (buffer_new(&map_bh))
531 unmap_underlying_metadata(map_bh.b_bdev,
532 map_bh.b_blocknr);
533 if (buffer_boundary(&map_bh)) {
534 boundary_block = map_bh.b_blocknr;
535 boundary_bdev = map_bh.b_bdev;
536 }
537 if (page_block) {
538 if (map_bh.b_blocknr != blocks[page_block-1] + 1)
539 goto confused;
540 }
541 blocks[page_block++] = map_bh.b_blocknr;
542 boundary = buffer_boundary(&map_bh);
543 bdev = map_bh.b_bdev;
544 if (block_in_file == last_block)
545 break;
546 block_in_file++;
547 }
548 BUG_ON(page_block == 0);
549
550 first_unmapped = page_block;
551
552page_is_mapped:
553 end_index = i_size >> PAGE_CACHE_SHIFT;
554 if (page->index >= end_index) {
555
556
557
558
559
560
561
562
563 unsigned offset = i_size & (PAGE_CACHE_SIZE - 1);
564
565 if (page->index > end_index || !offset)
566 goto confused;
567 zero_user_segment(page, offset, PAGE_CACHE_SIZE);
568 }
569
570
571
572
573 if (bio && mpd->last_block_in_bio != blocks[0] - 1)
574 bio = mpage_bio_submit(WRITE, bio);
575
576alloc_new:
577 if (bio == NULL) {
578 bio = mpage_alloc(bdev, blocks[0] << (blkbits - 9),
579 bio_get_nr_vecs(bdev), GFP_NOFS|__GFP_HIGH);
580 if (bio == NULL)
581 goto confused;
582 }
583
584
585
586
587
588
589 length = first_unmapped << blkbits;
590 if (bio_add_page(bio, page, length, 0) < length) {
591 bio = mpage_bio_submit(WRITE, bio);
592 goto alloc_new;
593 }
594
595
596
597
598
599 if (page_has_buffers(page)) {
600 struct buffer_head *head = page_buffers(page);
601 struct buffer_head *bh = head;
602 unsigned buffer_counter = 0;
603
604 do {
605 if (buffer_counter++ == first_unmapped)
606 break;
607 clear_buffer_dirty(bh);
608 bh = bh->b_this_page;
609 } while (bh != head);
610
611
612
613
614
615
616 if (buffer_heads_over_limit && PageUptodate(page))
617 try_to_free_buffers(page);
618 }
619
620 BUG_ON(PageWriteback(page));
621 set_page_writeback(page);
622 unlock_page(page);
623 if (boundary || (first_unmapped != blocks_per_page)) {
624 bio = mpage_bio_submit(WRITE, bio);
625 if (boundary_block) {
626 write_boundary_block(boundary_bdev,
627 boundary_block, 1 << blkbits);
628 }
629 } else {
630 mpd->last_block_in_bio = blocks[blocks_per_page - 1];
631 }
632 goto out;
633
634confused:
635 if (bio)
636 bio = mpage_bio_submit(WRITE, bio);
637
638 if (mpd->use_writepage) {
639 ret = mapping->a_ops->writepage(page, wbc);
640 } else {
641 ret = -EAGAIN;
642 goto out;
643 }
644
645
646
647 mapping_set_error(mapping, ret);
648out:
649 mpd->bio = bio;
650 return ret;
651}
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672int
673mpage_writepages(struct address_space *mapping,
674 struct writeback_control *wbc, get_block_t get_block)
675{
676 struct blk_plug plug;
677 int ret;
678
679 blk_start_plug(&plug);
680
681 if (!get_block)
682 ret = generic_writepages(mapping, wbc);
683 else {
684 struct mpage_data mpd = {
685 .bio = NULL,
686 .last_block_in_bio = 0,
687 .get_block = get_block,
688 .use_writepage = 1,
689 };
690
691 ret = write_cache_pages(mapping, wbc, __mpage_writepage, &mpd);
692 if (mpd.bio)
693 mpage_bio_submit(WRITE, mpd.bio);
694 }
695 blk_finish_plug(&plug);
696 return ret;
697}
698EXPORT_SYMBOL(mpage_writepages);
699
700int mpage_writepage(struct page *page, get_block_t get_block,
701 struct writeback_control *wbc)
702{
703 struct mpage_data mpd = {
704 .bio = NULL,
705 .last_block_in_bio = 0,
706 .get_block = get_block,
707 .use_writepage = 0,
708 };
709 int ret = __mpage_writepage(page, wbc, &mpd);
710 if (mpd.bio)
711 mpage_bio_submit(WRITE, mpd.bio);
712 return ret;
713}
714EXPORT_SYMBOL(mpage_writepage);
715