.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. |
---|
3 | 4 | * Copyright (C) 2004-2008 Red Hat, Inc. All rights reserved. |
---|
4 | | - * |
---|
5 | | - * This copyrighted material is made available to anyone wishing to use, |
---|
6 | | - * modify, copy, or redistribute it subject to the terms and conditions |
---|
7 | | - * of the GNU General Public License version 2. |
---|
8 | 5 | */ |
---|
9 | 6 | |
---|
10 | 7 | #include <linux/sched.h> |
---|
.. | .. |
---|
80 | 77 | if (error) |
---|
81 | 78 | return error; |
---|
82 | 79 | if (!buffer_mapped(bh_result)) |
---|
83 | | - return -EIO; |
---|
| 80 | + return -ENODATA; |
---|
84 | 81 | return 0; |
---|
85 | 82 | } |
---|
86 | 83 | |
---|
87 | 84 | /** |
---|
88 | | - * gfs2_writepage_common - Common bits of writepage |
---|
89 | | - * @page: The page to be written |
---|
| 85 | + * gfs2_writepage - Write page for writeback mappings |
---|
| 86 | + * @page: The page |
---|
90 | 87 | * @wbc: The writeback control |
---|
91 | | - * |
---|
92 | | - * Returns: 1 if writepage is ok, otherwise an error code or zero if no error. |
---|
93 | 88 | */ |
---|
94 | | - |
---|
95 | | -static int gfs2_writepage_common(struct page *page, |
---|
96 | | - struct writeback_control *wbc) |
---|
| 89 | +static int gfs2_writepage(struct page *page, struct writeback_control *wbc) |
---|
97 | 90 | { |
---|
98 | 91 | struct inode *inode = page->mapping->host; |
---|
99 | 92 | struct gfs2_inode *ip = GFS2_I(inode); |
---|
100 | 93 | struct gfs2_sbd *sdp = GFS2_SB(inode); |
---|
101 | | - loff_t i_size = i_size_read(inode); |
---|
102 | | - pgoff_t end_index = i_size >> PAGE_SHIFT; |
---|
103 | | - unsigned offset; |
---|
| 94 | + struct iomap_writepage_ctx wpc = { }; |
---|
104 | 95 | |
---|
105 | 96 | if (gfs2_assert_withdraw(sdp, gfs2_glock_is_held_excl(ip->i_gl))) |
---|
106 | 97 | goto out; |
---|
107 | 98 | if (current->journal_info) |
---|
108 | 99 | goto redirty; |
---|
109 | | - /* Is the page fully outside i_size? (truncate in progress) */ |
---|
110 | | - offset = i_size & (PAGE_SIZE-1); |
---|
111 | | - if (page->index > end_index || (page->index == end_index && !offset)) { |
---|
112 | | - page->mapping->a_ops->invalidatepage(page, 0, PAGE_SIZE); |
---|
113 | | - goto out; |
---|
114 | | - } |
---|
115 | | - return 1; |
---|
| 100 | + return iomap_writepage(page, wbc, &wpc, &gfs2_writeback_ops); |
---|
| 101 | + |
---|
116 | 102 | redirty: |
---|
117 | 103 | redirty_page_for_writepage(wbc, page); |
---|
118 | 104 | out: |
---|
.. | .. |
---|
121 | 107 | } |
---|
122 | 108 | |
---|
123 | 109 | /** |
---|
124 | | - * gfs2_writepage - Write page for writeback mappings |
---|
125 | | - * @page: The page |
---|
| 110 | + * gfs2_write_jdata_page - gfs2 jdata-specific version of block_write_full_page |
---|
| 111 | + * @page: The page to write |
---|
126 | 112 | * @wbc: The writeback control |
---|
127 | 113 | * |
---|
128 | | - */ |
---|
129 | | - |
---|
130 | | -static int gfs2_writepage(struct page *page, struct writeback_control *wbc) |
---|
131 | | -{ |
---|
132 | | - int ret; |
---|
133 | | - |
---|
134 | | - ret = gfs2_writepage_common(page, wbc); |
---|
135 | | - if (ret <= 0) |
---|
136 | | - return ret; |
---|
137 | | - |
---|
138 | | - return nobh_writepage(page, gfs2_get_block_noalloc, wbc); |
---|
139 | | -} |
---|
140 | | - |
---|
141 | | -/* This is the same as calling block_write_full_page, but it also |
---|
| 114 | + * This is the same as calling block_write_full_page, but it also |
---|
142 | 115 | * writes pages outside of i_size |
---|
143 | 116 | */ |
---|
144 | | -static int gfs2_write_full_page(struct page *page, get_block_t *get_block, |
---|
145 | | - struct writeback_control *wbc) |
---|
| 117 | +static int gfs2_write_jdata_page(struct page *page, |
---|
| 118 | + struct writeback_control *wbc) |
---|
146 | 119 | { |
---|
147 | 120 | struct inode * const inode = page->mapping->host; |
---|
148 | 121 | loff_t i_size = i_size_read(inode); |
---|
.. | .. |
---|
156 | 129 | * the page size, the remaining memory is zeroed when mapped, and |
---|
157 | 130 | * writes to that region are not written out to the file." |
---|
158 | 131 | */ |
---|
159 | | - offset = i_size & (PAGE_SIZE-1); |
---|
| 132 | + offset = i_size & (PAGE_SIZE - 1); |
---|
160 | 133 | if (page->index == end_index && offset) |
---|
161 | 134 | zero_user_segment(page, offset, PAGE_SIZE); |
---|
162 | 135 | |
---|
163 | | - return __block_write_full_page(inode, page, get_block, wbc, |
---|
| 136 | + return __block_write_full_page(inode, page, gfs2_get_block_noalloc, wbc, |
---|
164 | 137 | end_buffer_async_write); |
---|
165 | 138 | } |
---|
166 | 139 | |
---|
.. | .. |
---|
179 | 152 | { |
---|
180 | 153 | struct inode *inode = page->mapping->host; |
---|
181 | 154 | struct gfs2_inode *ip = GFS2_I(inode); |
---|
182 | | - struct gfs2_sbd *sdp = GFS2_SB(inode); |
---|
183 | 155 | |
---|
184 | 156 | if (PageChecked(page)) { |
---|
185 | 157 | ClearPageChecked(page); |
---|
.. | .. |
---|
187 | 159 | create_empty_buffers(page, inode->i_sb->s_blocksize, |
---|
188 | 160 | BIT(BH_Dirty)|BIT(BH_Uptodate)); |
---|
189 | 161 | } |
---|
190 | | - gfs2_page_add_databufs(ip, page, 0, sdp->sd_vfs->s_blocksize); |
---|
| 162 | + gfs2_page_add_databufs(ip, page, 0, PAGE_SIZE); |
---|
191 | 163 | } |
---|
192 | | - return gfs2_write_full_page(page, gfs2_get_block_noalloc, wbc); |
---|
| 164 | + return gfs2_write_jdata_page(page, wbc); |
---|
193 | 165 | } |
---|
194 | 166 | |
---|
195 | 167 | /** |
---|
.. | .. |
---|
206 | 178 | struct inode *inode = page->mapping->host; |
---|
207 | 179 | struct gfs2_inode *ip = GFS2_I(inode); |
---|
208 | 180 | struct gfs2_sbd *sdp = GFS2_SB(inode); |
---|
209 | | - int ret; |
---|
210 | 181 | |
---|
211 | 182 | if (gfs2_assert_withdraw(sdp, gfs2_glock_is_held_excl(ip->i_gl))) |
---|
212 | 183 | goto out; |
---|
213 | 184 | if (PageChecked(page) || current->journal_info) |
---|
214 | 185 | goto out_ignore; |
---|
215 | | - ret = __gfs2_jdata_writepage(page, wbc); |
---|
216 | | - return ret; |
---|
| 186 | + return __gfs2_jdata_writepage(page, wbc); |
---|
217 | 187 | |
---|
218 | 188 | out_ignore: |
---|
219 | 189 | redirty_page_for_writepage(wbc, page); |
---|
.. | .. |
---|
233 | 203 | struct writeback_control *wbc) |
---|
234 | 204 | { |
---|
235 | 205 | struct gfs2_sbd *sdp = gfs2_mapping2sbd(mapping); |
---|
236 | | - int ret = mpage_writepages(mapping, wbc, gfs2_get_block_noalloc); |
---|
| 206 | + struct iomap_writepage_ctx wpc = { }; |
---|
| 207 | + int ret; |
---|
237 | 208 | |
---|
238 | 209 | /* |
---|
239 | 210 | * Even if we didn't write any pages here, we might still be holding |
---|
.. | .. |
---|
241 | 212 | * want balance_dirty_pages() to loop indefinitely trying to write out |
---|
242 | 213 | * pages held in the ail that it can't find. |
---|
243 | 214 | */ |
---|
| 215 | + ret = iomap_writepages(mapping, wbc, &wpc, &gfs2_writeback_ops); |
---|
244 | 216 | if (ret == 0) |
---|
245 | 217 | set_bit(SDF_FORCE_AIL_FLUSH, &sdp->sd_flags); |
---|
246 | | - |
---|
247 | 218 | return ret; |
---|
248 | 219 | } |
---|
249 | 220 | |
---|
.. | .. |
---|
266 | 237 | { |
---|
267 | 238 | struct inode *inode = mapping->host; |
---|
268 | 239 | struct gfs2_sbd *sdp = GFS2_SB(inode); |
---|
269 | | - unsigned nrblocks = nr_pages * (PAGE_SIZE/inode->i_sb->s_blocksize); |
---|
| 240 | + unsigned nrblocks = nr_pages * (PAGE_SIZE >> inode->i_blkbits); |
---|
270 | 241 | int i; |
---|
271 | 242 | int ret; |
---|
272 | 243 | |
---|
.. | .. |
---|
360 | 331 | int done = 0; |
---|
361 | 332 | struct pagevec pvec; |
---|
362 | 333 | int nr_pages; |
---|
363 | | - pgoff_t uninitialized_var(writeback_index); |
---|
| 334 | + pgoff_t writeback_index; |
---|
364 | 335 | pgoff_t index; |
---|
365 | 336 | pgoff_t end; |
---|
366 | 337 | pgoff_t done_index; |
---|
367 | 338 | int cycled; |
---|
368 | 339 | int range_whole = 0; |
---|
369 | | - int tag; |
---|
| 340 | + xa_mark_t tag; |
---|
370 | 341 | |
---|
371 | 342 | pagevec_init(&pvec); |
---|
372 | 343 | if (wbc->range_cyclic) { |
---|
.. | .. |
---|
457 | 428 | * |
---|
458 | 429 | * Returns: errno |
---|
459 | 430 | */ |
---|
460 | | - |
---|
461 | | -int stuffed_readpage(struct gfs2_inode *ip, struct page *page) |
---|
| 431 | +static int stuffed_readpage(struct gfs2_inode *ip, struct page *page) |
---|
462 | 432 | { |
---|
463 | 433 | struct buffer_head *dibh; |
---|
464 | 434 | u64 dsize = i_size_read(&ip->i_inode); |
---|
.. | .. |
---|
481 | 451 | return error; |
---|
482 | 452 | |
---|
483 | 453 | kaddr = kmap_atomic(page); |
---|
484 | | - if (dsize > gfs2_max_stuffed_size(ip)) |
---|
485 | | - dsize = gfs2_max_stuffed_size(ip); |
---|
486 | 454 | memcpy(kaddr, dibh->b_data + sizeof(struct gfs2_dinode), dsize); |
---|
487 | 455 | memset(kaddr + dsize, 0, PAGE_SIZE - dsize); |
---|
488 | 456 | kunmap_atomic(kaddr); |
---|
.. | .. |
---|
494 | 462 | } |
---|
495 | 463 | |
---|
496 | 464 | |
---|
497 | | -/** |
---|
498 | | - * __gfs2_readpage - readpage |
---|
499 | | - * @file: The file to read a page for |
---|
500 | | - * @page: The page to read |
---|
501 | | - * |
---|
502 | | - * This is the core of gfs2's readpage. It's used by the internal file |
---|
503 | | - * reading code as in that case we already hold the glock. Also it's |
---|
504 | | - * called by gfs2_readpage() once the required lock has been granted. |
---|
505 | | - */ |
---|
506 | | - |
---|
507 | 465 | static int __gfs2_readpage(void *file, struct page *page) |
---|
508 | 466 | { |
---|
509 | | - struct gfs2_inode *ip = GFS2_I(page->mapping->host); |
---|
510 | | - struct gfs2_sbd *sdp = GFS2_SB(page->mapping->host); |
---|
511 | | - |
---|
| 467 | + struct inode *inode = page->mapping->host; |
---|
| 468 | + struct gfs2_inode *ip = GFS2_I(inode); |
---|
| 469 | + struct gfs2_sbd *sdp = GFS2_SB(inode); |
---|
512 | 470 | int error; |
---|
513 | 471 | |
---|
514 | | - if (i_blocksize(page->mapping->host) == PAGE_SIZE && |
---|
515 | | - !page_has_buffers(page)) { |
---|
| 472 | + if (!gfs2_is_jdata(ip) || |
---|
| 473 | + (i_blocksize(inode) == PAGE_SIZE && !page_has_buffers(page))) { |
---|
516 | 474 | error = iomap_readpage(page, &gfs2_iomap_ops); |
---|
517 | 475 | } else if (gfs2_is_stuffed(ip)) { |
---|
518 | 476 | error = stuffed_readpage(ip, page); |
---|
.. | .. |
---|
521 | 479 | error = mpage_readpage(page, gfs2_block_map); |
---|
522 | 480 | } |
---|
523 | 481 | |
---|
524 | | - if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) |
---|
| 482 | + if (unlikely(gfs2_withdrawn(sdp))) |
---|
525 | 483 | return -EIO; |
---|
526 | 484 | |
---|
527 | 485 | return error; |
---|
.. | .. |
---|
531 | 489 | * gfs2_readpage - read a page of a file |
---|
532 | 490 | * @file: The file to read |
---|
533 | 491 | * @page: The page of the file |
---|
534 | | - * |
---|
535 | | - * This deals with the locking required. We have to unlock and |
---|
536 | | - * relock the page in order to get the locking in the right |
---|
537 | | - * order. |
---|
538 | 492 | */ |
---|
539 | 493 | |
---|
540 | 494 | static int gfs2_readpage(struct file *file, struct page *page) |
---|
541 | 495 | { |
---|
542 | | - struct address_space *mapping = page->mapping; |
---|
543 | | - struct gfs2_inode *ip = GFS2_I(mapping->host); |
---|
544 | | - struct gfs2_holder gh; |
---|
545 | | - int error; |
---|
546 | | - |
---|
547 | | - unlock_page(page); |
---|
548 | | - gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, &gh); |
---|
549 | | - error = gfs2_glock_nq(&gh); |
---|
550 | | - if (unlikely(error)) |
---|
551 | | - goto out; |
---|
552 | | - error = AOP_TRUNCATED_PAGE; |
---|
553 | | - lock_page(page); |
---|
554 | | - if (page->mapping == mapping && !PageUptodate(page)) |
---|
555 | | - error = __gfs2_readpage(file, page); |
---|
556 | | - else |
---|
557 | | - unlock_page(page); |
---|
558 | | - gfs2_glock_dq(&gh); |
---|
559 | | -out: |
---|
560 | | - gfs2_holder_uninit(&gh); |
---|
561 | | - if (error && error != AOP_TRUNCATED_PAGE) |
---|
562 | | - lock_page(page); |
---|
563 | | - return error; |
---|
| 496 | + return __gfs2_readpage(file, page); |
---|
564 | 497 | } |
---|
565 | 498 | |
---|
566 | 499 | /** |
---|
.. | .. |
---|
576 | 509 | unsigned size) |
---|
577 | 510 | { |
---|
578 | 511 | struct address_space *mapping = ip->i_inode.i_mapping; |
---|
579 | | - unsigned long index = *pos / PAGE_SIZE; |
---|
| 512 | + unsigned long index = *pos >> PAGE_SHIFT; |
---|
580 | 513 | unsigned offset = *pos & (PAGE_SIZE - 1); |
---|
581 | 514 | unsigned copied = 0; |
---|
582 | 515 | unsigned amt; |
---|
.. | .. |
---|
603 | 536 | } |
---|
604 | 537 | |
---|
605 | 538 | /** |
---|
606 | | - * gfs2_readpages - Read a bunch of pages at once |
---|
| 539 | + * gfs2_readahead - Read a bunch of pages at once |
---|
607 | 540 | * @file: The file to read from |
---|
608 | 541 | * @mapping: Address space info |
---|
609 | 542 | * @pages: List of pages to read |
---|
.. | .. |
---|
616 | 549 | * obviously not something we'd want to do on too regular a basis. |
---|
617 | 550 | * Any I/O we ignore at this time will be done via readpage later. |
---|
618 | 551 | * 2. We don't handle stuffed files here we let readpage do the honours. |
---|
619 | | - * 3. mpage_readpages() does most of the heavy lifting in the common case. |
---|
| 552 | + * 3. mpage_readahead() does most of the heavy lifting in the common case. |
---|
620 | 553 | * 4. gfs2_block_map() is relied upon to set BH_Boundary in the right places. |
---|
621 | 554 | */ |
---|
622 | 555 | |
---|
623 | | -static int gfs2_readpages(struct file *file, struct address_space *mapping, |
---|
624 | | - struct list_head *pages, unsigned nr_pages) |
---|
| 556 | +static void gfs2_readahead(struct readahead_control *rac) |
---|
625 | 557 | { |
---|
626 | | - struct inode *inode = mapping->host; |
---|
| 558 | + struct inode *inode = rac->mapping->host; |
---|
627 | 559 | struct gfs2_inode *ip = GFS2_I(inode); |
---|
628 | | - struct gfs2_sbd *sdp = GFS2_SB(inode); |
---|
629 | | - struct gfs2_holder gh; |
---|
630 | | - int ret; |
---|
631 | 560 | |
---|
632 | | - gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, &gh); |
---|
633 | | - ret = gfs2_glock_nq(&gh); |
---|
634 | | - if (unlikely(ret)) |
---|
635 | | - goto out_uninit; |
---|
636 | | - if (!gfs2_is_stuffed(ip)) |
---|
637 | | - ret = mpage_readpages(mapping, pages, nr_pages, gfs2_block_map); |
---|
638 | | - gfs2_glock_dq(&gh); |
---|
639 | | -out_uninit: |
---|
640 | | - gfs2_holder_uninit(&gh); |
---|
641 | | - if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) |
---|
642 | | - ret = -EIO; |
---|
643 | | - return ret; |
---|
| 561 | + if (gfs2_is_stuffed(ip)) |
---|
| 562 | + ; |
---|
| 563 | + else if (gfs2_is_jdata(ip)) |
---|
| 564 | + mpage_readahead(rac, gfs2_block_map); |
---|
| 565 | + else |
---|
| 566 | + iomap_readahead(rac, &gfs2_iomap_ops); |
---|
644 | 567 | } |
---|
645 | 568 | |
---|
646 | 569 | /** |
---|
.. | .. |
---|
649 | 572 | */ |
---|
650 | 573 | void adjust_fs_space(struct inode *inode) |
---|
651 | 574 | { |
---|
652 | | - struct gfs2_sbd *sdp = inode->i_sb->s_fs_info; |
---|
| 575 | + struct gfs2_sbd *sdp = GFS2_SB(inode); |
---|
653 | 576 | struct gfs2_inode *m_ip = GFS2_I(sdp->sd_statfs_inode); |
---|
654 | 577 | struct gfs2_inode *l_ip = GFS2_I(sdp->sd_sc_inode); |
---|
655 | 578 | struct gfs2_statfs_change_host *m_sc = &sdp->sd_statfs_master; |
---|
.. | .. |
---|
657 | 580 | struct buffer_head *m_bh, *l_bh; |
---|
658 | 581 | u64 fs_total, new_free; |
---|
659 | 582 | |
---|
| 583 | + if (gfs2_trans_begin(sdp, 2 * RES_STATFS, 0) != 0) |
---|
| 584 | + return; |
---|
| 585 | + |
---|
660 | 586 | /* Total up the file system space, according to the latest rindex. */ |
---|
661 | 587 | fs_total = gfs2_ri_total(sdp); |
---|
662 | 588 | if (gfs2_meta_inode_buffer(m_ip, &m_bh) != 0) |
---|
663 | | - return; |
---|
| 589 | + goto out; |
---|
664 | 590 | |
---|
665 | 591 | spin_lock(&sdp->sd_statfs_spin); |
---|
666 | 592 | gfs2_statfs_change_in(m_sc, m_bh->b_data + |
---|
.. | .. |
---|
675 | 601 | gfs2_statfs_change(sdp, new_free, new_free, 0); |
---|
676 | 602 | |
---|
677 | 603 | if (gfs2_meta_inode_buffer(l_ip, &l_bh) != 0) |
---|
678 | | - goto out; |
---|
| 604 | + goto out2; |
---|
679 | 605 | update_statfs(sdp, m_bh, l_bh); |
---|
680 | 606 | brelse(l_bh); |
---|
681 | | -out: |
---|
| 607 | +out2: |
---|
682 | 608 | brelse(m_bh); |
---|
683 | | -} |
---|
684 | | - |
---|
685 | | -/** |
---|
686 | | - * gfs2_stuffed_write_end - Write end for stuffed files |
---|
687 | | - * @inode: The inode |
---|
688 | | - * @dibh: The buffer_head containing the on-disk inode |
---|
689 | | - * @pos: The file position |
---|
690 | | - * @copied: How much was actually copied by the VFS |
---|
691 | | - * @page: The page |
---|
692 | | - * |
---|
693 | | - * This copies the data from the page into the inode block after |
---|
694 | | - * the inode data structure itself. |
---|
695 | | - * |
---|
696 | | - * Returns: copied bytes or errno |
---|
697 | | - */ |
---|
698 | | -int gfs2_stuffed_write_end(struct inode *inode, struct buffer_head *dibh, |
---|
699 | | - loff_t pos, unsigned copied, |
---|
700 | | - struct page *page) |
---|
701 | | -{ |
---|
702 | | - struct gfs2_inode *ip = GFS2_I(inode); |
---|
703 | | - u64 to = pos + copied; |
---|
704 | | - void *kaddr; |
---|
705 | | - unsigned char *buf = dibh->b_data + sizeof(struct gfs2_dinode); |
---|
706 | | - |
---|
707 | | - BUG_ON(pos + copied > gfs2_max_stuffed_size(ip)); |
---|
708 | | - |
---|
709 | | - kaddr = kmap_atomic(page); |
---|
710 | | - memcpy(buf + pos, kaddr + pos, copied); |
---|
711 | | - flush_dcache_page(page); |
---|
712 | | - kunmap_atomic(kaddr); |
---|
713 | | - |
---|
714 | | - WARN_ON(!PageUptodate(page)); |
---|
715 | | - unlock_page(page); |
---|
716 | | - put_page(page); |
---|
717 | | - |
---|
718 | | - if (copied) { |
---|
719 | | - if (inode->i_size < to) |
---|
720 | | - i_size_write(inode, to); |
---|
721 | | - mark_inode_dirty(inode); |
---|
722 | | - } |
---|
723 | | - return copied; |
---|
| 609 | +out: |
---|
| 610 | + sdp->sd_rindex_uptodate = 0; |
---|
| 611 | + gfs2_trans_end(sdp); |
---|
724 | 612 | } |
---|
725 | 613 | |
---|
726 | 614 | /** |
---|
.. | .. |
---|
732 | 620 | |
---|
733 | 621 | static int jdata_set_page_dirty(struct page *page) |
---|
734 | 622 | { |
---|
735 | | - SetPageChecked(page); |
---|
| 623 | + if (current->journal_info) |
---|
| 624 | + SetPageChecked(page); |
---|
736 | 625 | return __set_page_dirty_buffers(page); |
---|
737 | 626 | } |
---|
738 | 627 | |
---|
.. | .. |
---|
756 | 645 | return 0; |
---|
757 | 646 | |
---|
758 | 647 | if (!gfs2_is_stuffed(ip)) |
---|
759 | | - dblock = generic_block_bmap(mapping, lblock, gfs2_block_map); |
---|
| 648 | + dblock = iomap_bmap(mapping, lblock, &gfs2_iomap_ops); |
---|
760 | 649 | |
---|
761 | 650 | gfs2_glock_dq_uninit(&i_gh); |
---|
762 | 651 | |
---|
.. | .. |
---|
774 | 663 | if (bd) { |
---|
775 | 664 | if (!list_empty(&bd->bd_list) && !buffer_pinned(bh)) |
---|
776 | 665 | list_del_init(&bd->bd_list); |
---|
777 | | - else |
---|
| 666 | + else { |
---|
| 667 | + spin_lock(&sdp->sd_ail_lock); |
---|
778 | 668 | gfs2_remove_from_journal(bh, REMOVE_JDATA); |
---|
| 669 | + spin_unlock(&sdp->sd_ail_lock); |
---|
| 670 | + } |
---|
779 | 671 | } |
---|
780 | 672 | bh->b_bdev = NULL; |
---|
781 | 673 | clear_buffer_mapped(bh); |
---|
.. | .. |
---|
820 | 712 | * @page: the page that's being released |
---|
821 | 713 | * @gfp_mask: passed from Linux VFS, ignored by us |
---|
822 | 714 | * |
---|
823 | | - * Call try_to_free_buffers() if the buffers in this page can be |
---|
824 | | - * released. |
---|
| 715 | + * Calls try_to_free_buffers() to free the buffers and put the page if the |
---|
| 716 | + * buffers can be released. |
---|
825 | 717 | * |
---|
826 | | - * Returns: 0 |
---|
| 718 | + * Returns: 1 if the page was put or else 0 |
---|
827 | 719 | */ |
---|
828 | 720 | |
---|
829 | 721 | int gfs2_releasepage(struct page *page, gfp_t gfp_mask) |
---|
.. | .. |
---|
847 | 739 | */ |
---|
848 | 740 | |
---|
849 | 741 | gfs2_log_lock(sdp); |
---|
850 | | - spin_lock(&sdp->sd_ail_lock); |
---|
851 | 742 | head = bh = page_buffers(page); |
---|
852 | 743 | do { |
---|
853 | 744 | if (atomic_read(&bh->b_count)) |
---|
.. | .. |
---|
859 | 750 | goto cannot_release; |
---|
860 | 751 | bh = bh->b_this_page; |
---|
861 | 752 | } while(bh != head); |
---|
862 | | - spin_unlock(&sdp->sd_ail_lock); |
---|
863 | 753 | |
---|
864 | 754 | head = bh = page_buffers(page); |
---|
865 | 755 | do { |
---|
866 | 756 | bd = bh->b_private; |
---|
867 | 757 | if (bd) { |
---|
868 | 758 | gfs2_assert_warn(sdp, bd->bd_bh == bh); |
---|
869 | | - if (!list_empty(&bd->bd_list)) |
---|
870 | | - list_del_init(&bd->bd_list); |
---|
871 | 759 | bd->bd_bh = NULL; |
---|
872 | 760 | bh->b_private = NULL; |
---|
873 | | - kmem_cache_free(gfs2_bufdata_cachep, bd); |
---|
| 761 | + /* |
---|
| 762 | + * The bd may still be queued as a revoke, in which |
---|
| 763 | + * case we must not dequeue nor free it. |
---|
| 764 | + */ |
---|
| 765 | + if (!bd->bd_blkno && !list_empty(&bd->bd_list)) |
---|
| 766 | + list_del_init(&bd->bd_list); |
---|
| 767 | + if (list_empty(&bd->bd_list)) |
---|
| 768 | + kmem_cache_free(gfs2_bufdata_cachep, bd); |
---|
874 | 769 | } |
---|
875 | 770 | |
---|
876 | 771 | bh = bh->b_this_page; |
---|
.. | .. |
---|
880 | 775 | return try_to_free_buffers(page); |
---|
881 | 776 | |
---|
882 | 777 | cannot_release: |
---|
883 | | - spin_unlock(&sdp->sd_ail_lock); |
---|
884 | 778 | gfs2_log_unlock(sdp); |
---|
885 | 779 | return 0; |
---|
886 | 780 | } |
---|
887 | 781 | |
---|
888 | | -static const struct address_space_operations gfs2_writeback_aops = { |
---|
| 782 | +static const struct address_space_operations gfs2_aops = { |
---|
889 | 783 | .writepage = gfs2_writepage, |
---|
890 | 784 | .writepages = gfs2_writepages, |
---|
891 | 785 | .readpage = gfs2_readpage, |
---|
892 | | - .readpages = gfs2_readpages, |
---|
| 786 | + .readahead = gfs2_readahead, |
---|
| 787 | + .set_page_dirty = iomap_set_page_dirty, |
---|
| 788 | + .releasepage = iomap_releasepage, |
---|
| 789 | + .invalidatepage = iomap_invalidatepage, |
---|
893 | 790 | .bmap = gfs2_bmap, |
---|
894 | | - .invalidatepage = gfs2_invalidatepage, |
---|
895 | | - .releasepage = gfs2_releasepage, |
---|
896 | 791 | .direct_IO = noop_direct_IO, |
---|
897 | | - .migratepage = buffer_migrate_page, |
---|
898 | | - .is_partially_uptodate = block_is_partially_uptodate, |
---|
899 | | - .error_remove_page = generic_error_remove_page, |
---|
900 | | -}; |
---|
901 | | - |
---|
902 | | -static const struct address_space_operations gfs2_ordered_aops = { |
---|
903 | | - .writepage = gfs2_writepage, |
---|
904 | | - .writepages = gfs2_writepages, |
---|
905 | | - .readpage = gfs2_readpage, |
---|
906 | | - .readpages = gfs2_readpages, |
---|
907 | | - .set_page_dirty = __set_page_dirty_buffers, |
---|
908 | | - .bmap = gfs2_bmap, |
---|
909 | | - .invalidatepage = gfs2_invalidatepage, |
---|
910 | | - .releasepage = gfs2_releasepage, |
---|
911 | | - .direct_IO = noop_direct_IO, |
---|
912 | | - .migratepage = buffer_migrate_page, |
---|
913 | | - .is_partially_uptodate = block_is_partially_uptodate, |
---|
| 792 | + .migratepage = iomap_migrate_page, |
---|
| 793 | + .is_partially_uptodate = iomap_is_partially_uptodate, |
---|
914 | 794 | .error_remove_page = generic_error_remove_page, |
---|
915 | 795 | }; |
---|
916 | 796 | |
---|
.. | .. |
---|
918 | 798 | .writepage = gfs2_jdata_writepage, |
---|
919 | 799 | .writepages = gfs2_jdata_writepages, |
---|
920 | 800 | .readpage = gfs2_readpage, |
---|
921 | | - .readpages = gfs2_readpages, |
---|
| 801 | + .readahead = gfs2_readahead, |
---|
922 | 802 | .set_page_dirty = jdata_set_page_dirty, |
---|
923 | 803 | .bmap = gfs2_bmap, |
---|
924 | 804 | .invalidatepage = gfs2_invalidatepage, |
---|
.. | .. |
---|
929 | 809 | |
---|
930 | 810 | void gfs2_set_aops(struct inode *inode) |
---|
931 | 811 | { |
---|
932 | | - struct gfs2_inode *ip = GFS2_I(inode); |
---|
933 | | - |
---|
934 | | - if (gfs2_is_writeback(ip)) |
---|
935 | | - inode->i_mapping->a_ops = &gfs2_writeback_aops; |
---|
936 | | - else if (gfs2_is_ordered(ip)) |
---|
937 | | - inode->i_mapping->a_ops = &gfs2_ordered_aops; |
---|
938 | | - else if (gfs2_is_jdata(ip)) |
---|
| 812 | + if (gfs2_is_jdata(GFS2_I(inode))) |
---|
939 | 813 | inode->i_mapping->a_ops = &gfs2_jdata_aops; |
---|
940 | 814 | else |
---|
941 | | - BUG(); |
---|
| 815 | + inode->i_mapping->a_ops = &gfs2_aops; |
---|
942 | 816 | } |
---|
943 | | - |
---|