Commit a01ac532 authored by Anton Altaparmakov's avatar Anton Altaparmakov
Browse files

NTFS: Fix page_has_buffers()/page_buffers() handling in fs/ntfs/aops.c.

parent 311120ec
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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...
+21 −17
Original line number Original line Diff line number Diff line
@@ -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)