mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 10:00:51 +07:00
NTFS: Fix page_has_buffers()/page_buffers() handling in fs/ntfs/aops.c.
Signed-off-by: Anton Altaparmakov <aia21@cantab.net>
This commit is contained in:
parent
311120eca0
commit
a01ac532b5
@ -85,6 +85,7 @@ ToDo/Notes:
|
|||||||
removal of the get_bh()/put_bh() pairs for each buffer.
|
removal of the get_bh()/put_bh() pairs for each buffer.
|
||||||
- Fix fs/ntfs/aops.c::ntfs_{read,write}_block() to handle the case
|
- Fix fs/ntfs/aops.c::ntfs_{read,write}_block() to handle the case
|
||||||
where a concurrent truncate has truncated the runlist under our feet.
|
where a concurrent truncate has truncated the runlist under our feet.
|
||||||
|
- Fix page_has_buffers()/page_buffers() handling in fs/ntfs/aops.c.
|
||||||
|
|
||||||
2.1.23 - Implement extension of resident files and make writing safe as well as
|
2.1.23 - Implement extension of resident files and make writing safe as well as
|
||||||
many bug fixes, cleanups, and enhancements...
|
many bug fixes, cleanups, and enhancements...
|
||||||
|
@ -185,13 +185,15 @@ static int ntfs_read_block(struct page *page)
|
|||||||
blocksize_bits = VFS_I(ni)->i_blkbits;
|
blocksize_bits = VFS_I(ni)->i_blkbits;
|
||||||
blocksize = 1 << blocksize_bits;
|
blocksize = 1 << blocksize_bits;
|
||||||
|
|
||||||
if (!page_has_buffers(page))
|
if (!page_has_buffers(page)) {
|
||||||
create_empty_buffers(page, blocksize, 0);
|
create_empty_buffers(page, blocksize, 0);
|
||||||
bh = head = page_buffers(page);
|
if (unlikely(!page_has_buffers(page))) {
|
||||||
if (unlikely(!bh)) {
|
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
bh = head = page_buffers(page);
|
||||||
|
BUG_ON(!bh);
|
||||||
|
|
||||||
iblock = (s64)page->index << (PAGE_CACHE_SHIFT - blocksize_bits);
|
iblock = (s64)page->index << (PAGE_CACHE_SHIFT - blocksize_bits);
|
||||||
read_lock_irqsave(&ni->size_lock, flags);
|
read_lock_irqsave(&ni->size_lock, flags);
|
||||||
@ -530,19 +532,21 @@ static int ntfs_write_block(struct page *page, struct writeback_control *wbc)
|
|||||||
BUG_ON(!PageUptodate(page));
|
BUG_ON(!PageUptodate(page));
|
||||||
create_empty_buffers(page, blocksize,
|
create_empty_buffers(page, blocksize,
|
||||||
(1 << BH_Uptodate) | (1 << BH_Dirty));
|
(1 << BH_Uptodate) | (1 << BH_Dirty));
|
||||||
}
|
if (unlikely(!page_has_buffers(page))) {
|
||||||
bh = head = page_buffers(page);
|
ntfs_warning(vol->sb, "Error allocating page "
|
||||||
if (unlikely(!bh)) {
|
"buffers. Redirtying page so we try "
|
||||||
ntfs_warning(vol->sb, "Error allocating page buffers. "
|
"again later.");
|
||||||
"Redirtying page so we try again later.");
|
|
||||||
/*
|
/*
|
||||||
* Put the page back on mapping->dirty_pages, but leave its
|
* Put the page back on mapping->dirty_pages, but leave
|
||||||
* buffer's dirty state as-is.
|
* its buffers' dirty state as-is.
|
||||||
*/
|
*/
|
||||||
redirty_page_for_writepage(wbc, page);
|
redirty_page_for_writepage(wbc, page);
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
bh = head = page_buffers(page);
|
||||||
|
BUG_ON(!bh);
|
||||||
|
|
||||||
/* NOTE: Different naming scheme to ntfs_read_block()! */
|
/* NOTE: Different naming scheme to ntfs_read_block()! */
|
||||||
|
|
||||||
@ -910,7 +914,6 @@ static int ntfs_write_mst_block(struct page *page,
|
|||||||
sync = (wbc->sync_mode == WB_SYNC_ALL);
|
sync = (wbc->sync_mode == WB_SYNC_ALL);
|
||||||
|
|
||||||
/* Make sure we have mapped buffers. */
|
/* Make sure we have mapped buffers. */
|
||||||
BUG_ON(!page_has_buffers(page));
|
|
||||||
bh = head = page_buffers(page);
|
bh = head = page_buffers(page);
|
||||||
BUG_ON(!bh);
|
BUG_ON(!bh);
|
||||||
|
|
||||||
@ -2397,6 +2400,7 @@ void mark_ntfs_record_dirty(struct page *page, const unsigned int ofs) {
|
|||||||
buffers_to_free = bh;
|
buffers_to_free = bh;
|
||||||
}
|
}
|
||||||
bh = head = page_buffers(page);
|
bh = head = page_buffers(page);
|
||||||
|
BUG_ON(!bh);
|
||||||
do {
|
do {
|
||||||
bh_ofs = bh_offset(bh);
|
bh_ofs = bh_offset(bh);
|
||||||
if (bh_ofs + bh_size <= ofs)
|
if (bh_ofs + bh_size <= ofs)
|
||||||
|
Loading…
Reference in New Issue
Block a user