Skip to content

Commit

Permalink
NTFS: Optimize fs/ntfs/aops.c::ntfs_write_block() by extending the page
Browse files Browse the repository at this point in the history
      lock protection over the buffer submission for i/o which allows the
      removal of the get_bh()/put_bh() pairs for each buffer.

Signed-off-by: Anton Altaparmakov <[email protected]>
  • Loading branch information
AntonAltaparmakov committed Sep 8, 2005
1 parent bd45fdd commit 54b02eb
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 10 deletions.
3 changes: 3 additions & 0 deletions fs/ntfs/ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,9 @@ ToDo/Notes:
only zeroes.
- Fixup handling of sparse, compressed, and encrypted attributes in
fs/ntfs/aops.c::ntfs_writepage().
- Optimize fs/ntfs/aops.c::ntfs_write_block() by extending the page
lock protection over the buffer submission for i/o which allows the
removal of the get_bh()/put_bh() pairs for each buffer.

2.1.23 - Implement extension of resident files and make writing safe as well as
many bug fixes, cleanups, and enhancements...
Expand Down
13 changes: 3 additions & 10 deletions fs/ntfs/aops.c
Original file line number Diff line number Diff line change
Expand Up @@ -735,7 +735,7 @@ static int ntfs_write_block(struct page *page, struct writeback_control *wbc)
/* For the error case, need to reset bh to the beginning. */
bh = head;

/* Just an optimization, so ->readpage() isn't called later. */
/* Just an optimization, so ->readpage() is not called later. */
if (unlikely(!PageUptodate(page))) {
int uptodate = 1;
do {
Expand All @@ -751,7 +751,6 @@ static int ntfs_write_block(struct page *page, struct writeback_control *wbc)

/* Setup all mapped, dirty buffers for async write i/o. */
do {
get_bh(bh);
if (buffer_mapped(bh) && buffer_dirty(bh)) {
lock_buffer(bh);
if (test_clear_buffer_dirty(bh)) {
Expand Down Expand Up @@ -789,24 +788,18 @@ static int ntfs_write_block(struct page *page, struct writeback_control *wbc)

BUG_ON(PageWriteback(page));
set_page_writeback(page); /* Keeps try_to_free_buffers() away. */
unlock_page(page);

/*
* Submit the prepared buffers for i/o. Note the page is unlocked,
* and the async write i/o completion handler can end_page_writeback()
* at any time after the *first* submit_bh(). So the buffers can then
* disappear...
*/
/* Submit the prepared buffers for i/o. */
need_end_writeback = TRUE;
do {
struct buffer_head *next = bh->b_this_page;
if (buffer_async_write(bh)) {
submit_bh(WRITE, bh);
need_end_writeback = FALSE;
}
put_bh(bh);
bh = next;
} while (bh != head);
unlock_page(page);

/* If no i/o was started, need to end_page_writeback(). */
if (unlikely(need_end_writeback))
Expand Down

0 comments on commit 54b02eb

Please sign in to comment.