diff options
| author | Andrew Morton <akpm@zip.com.au> | 2002-06-17 20:18:44 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-06-17 20:18:44 -0700 |
| commit | 43967af3411e677c136fbb6901d47ab4a192e319 (patch) | |
| tree | 3eb70cbb65e5784d3812fa883fe143c55c51020d /fs/buffer.c | |
| parent | 374cac7a137dfd3212fb729337de479d1a410012 (diff) | |
[PATCH] mark_buffer_dirty_inode() speedup
buffer_insert_list() is showing up on Anton's graphs. It'll be via
ext2's mark_buffer_dirty_inode() against indirect blocks. If the
buffer is already on an inode queue, we know that it is on the correct
inode's queue so we don't need to re-add it.
Diffstat (limited to 'fs/buffer.c')
| -rw-r--r-- | fs/buffer.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/fs/buffer.c b/fs/buffer.c index c16959deb6ea..abe95fd38d22 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -856,8 +856,9 @@ void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode) if (mapping->assoc_mapping != buffer_mapping) BUG(); } - buffer_insert_list(&buffer_mapping->private_lock, - bh, &mapping->private_list); + if (list_empty(&bh->b_assoc_buffers)) + buffer_insert_list(&buffer_mapping->private_lock, + bh, &mapping->private_list); } EXPORT_SYMBOL(mark_buffer_dirty_inode); @@ -1243,10 +1244,17 @@ void __brelse(struct buffer_head * buf) * bforget() is like brelse(), except it discards any * potentially dirty data. */ -void __bforget(struct buffer_head * buf) +void __bforget(struct buffer_head *bh) { - clear_buffer_dirty(buf); - __brelse(buf); + clear_buffer_dirty(bh); + if (!list_empty(&bh->b_assoc_buffers)) { + struct address_space *buffer_mapping = bh->b_page->mapping; + + spin_lock(&buffer_mapping->private_lock); + list_del_init(&bh->b_assoc_buffers); + spin_unlock(&buffer_mapping->private_lock); + } + __brelse(bh); } /** |
