Commit 122d749c authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] small fixes in buffer.c

- Fix the fix to the fix to the sector_t printing in buffer_io_error()

- A few microoptimisations in buffer.c.  Replace:

	set_buffer_foo(bh);

  with

	if (!buffer_foo(bh))
		set_buffer_foo(bh);

  when buffer_fooness is likely.  To avoid the buslocked rmw, and to
  avoid dirtying a cacheline.


- export write_mapping_buffers() - filesystems which put buffers on
  mapping->private_list need this function for I/O scheduling reasons.
parent 49e59dea
...@@ -167,8 +167,9 @@ __clear_page_buffers(struct page *page) ...@@ -167,8 +167,9 @@ __clear_page_buffers(struct page *page)
static void buffer_io_error(struct buffer_head *bh) static void buffer_io_error(struct buffer_head *bh)
{ {
printk(KERN_ERR "Buffer I/O error on device %s, logical block %Ld\n", printk(KERN_ERR "Buffer I/O error on device %s, logical block %Lu\n",
bdevname(bh->b_bdev), (u64)bh->b_blocknr); bdevname(bh->b_bdev),
(unsigned long long)bh->b_blocknr);
} }
/* /*
...@@ -835,6 +836,7 @@ int write_mapping_buffers(struct address_space *mapping) ...@@ -835,6 +836,7 @@ int write_mapping_buffers(struct address_space *mapping)
out: out:
return ret; return ret;
} }
EXPORT_SYMBOL(write_mapping_buffers);
void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode) void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode)
{ {
...@@ -1400,7 +1402,6 @@ void create_empty_buffers(struct page *page, ...@@ -1400,7 +1402,6 @@ void create_empty_buffers(struct page *page,
head = create_buffers(page, blocksize, 1); head = create_buffers(page, blocksize, 1);
bh = head; bh = head;
do { do {
bh->b_end_io = NULL;
bh->b_state |= b_state; bh->b_state |= b_state;
tail = bh; tail = bh;
bh = bh->b_this_page; bh = bh->b_this_page;
...@@ -1666,10 +1667,13 @@ static int __block_prepare_write(struct inode *inode, struct page *page, ...@@ -1666,10 +1667,13 @@ static int __block_prepare_write(struct inode *inode, struct page *page,
block++, block_start=block_end, bh = bh->b_this_page) { block++, block_start=block_end, bh = bh->b_this_page) {
block_end = block_start + blocksize; block_end = block_start + blocksize;
if (block_end <= from || block_start >= to) { if (block_end <= from || block_start >= to) {
if (PageUptodate(page)) if (PageUptodate(page)) {
if (!buffer_uptodate(bh))
set_buffer_uptodate(bh); set_buffer_uptodate(bh);
}
continue; continue;
} }
if (buffer_new(bh))
clear_buffer_new(bh); clear_buffer_new(bh);
if (!buffer_mapped(bh)) { if (!buffer_mapped(bh)) {
err = get_block(inode, block, bh, 1); err = get_block(inode, block, bh, 1);
...@@ -1695,6 +1699,7 @@ static int __block_prepare_write(struct inode *inode, struct page *page, ...@@ -1695,6 +1699,7 @@ static int __block_prepare_write(struct inode *inode, struct page *page,
} }
} }
if (PageUptodate(page)) { if (PageUptodate(page)) {
if (!buffer_uptodate(bh))
set_buffer_uptodate(bh); set_buffer_uptodate(bh);
continue; continue;
} }
......
...@@ -50,7 +50,7 @@ static int dirty_async_ratio = 50; ...@@ -50,7 +50,7 @@ static int dirty_async_ratio = 50;
*/ */
static int dirty_sync_ratio = 60; static int dirty_sync_ratio = 60;
static void background_writeout(unsigned long unused); static void background_writeout(unsigned long _min_pages);
/* /*
* balance_dirty_pages() must be called by processes which are * balance_dirty_pages() must be called by processes which are
...@@ -492,6 +492,9 @@ int __set_page_dirty_buffers(struct page *page) ...@@ -492,6 +492,9 @@ int __set_page_dirty_buffers(struct page *page)
goto out; goto out;
} }
if (!PageUptodate(page))
buffer_error();
spin_lock(&mapping->private_lock); spin_lock(&mapping->private_lock);
if (page_has_buffers(page) && !PageSwapCache(page)) { if (page_has_buffers(page) && !PageSwapCache(page)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment