aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Altaparmakov <aia21@cantab.net>2005-09-08 16:43:47 -0400
committerAnton Altaparmakov <aia21@cantab.net>2005-09-08 16:43:47 -0400
commit54b02eb01c0172294e43e2b54d6815f65637c111 (patch)
tree0dec3c7f9553f96e3edeab769077723d1ab922e1
parentbd45fdd209ca49c5010ac9af469c41ae6dd3f145 (diff)
NTFS: 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. Signed-off-by: Anton Altaparmakov <aia21@cantab.net>
-rw-r--r--fs/ntfs/ChangeLog3
-rw-r--r--fs/ntfs/aops.c13
2 files changed, 6 insertions, 10 deletions
diff --git a/fs/ntfs/ChangeLog b/fs/ntfs/ChangeLog
index 4b8666d7e7fe..10fc2385efa7 100644
--- a/fs/ntfs/ChangeLog
+++ b/fs/ntfs/ChangeLog
@@ -81,6 +81,9 @@ ToDo/Notes:
81 only zeroes. 81 only zeroes.
82 - Fixup handling of sparse, compressed, and encrypted attributes in 82 - Fixup handling of sparse, compressed, and encrypted attributes in
83 fs/ntfs/aops.c::ntfs_writepage(). 83 fs/ntfs/aops.c::ntfs_writepage().
84 - Optimize fs/ntfs/aops.c::ntfs_write_block() by extending the page
85 lock protection over the buffer submission for i/o which allows the
86 removal of the get_bh()/put_bh() pairs for each buffer.
84 87
852.1.23 - Implement extension of resident files and make writing safe as well as 882.1.23 - Implement extension of resident files and make writing safe as well as
86 many bug fixes, cleanups, and enhancements... 89 many bug fixes, cleanups, and enhancements...
diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c
index 6f2954aac5a2..821dad7d14c8 100644
--- a/fs/ntfs/aops.c
+++ b/fs/ntfs/aops.c
@@ -735,7 +735,7 @@ lock_retry_remap:
735 /* For the error case, need to reset bh to the beginning. */ 735 /* For the error case, need to reset bh to the beginning. */
736 bh = head; 736 bh = head;
737 737
738 /* Just an optimization, so ->readpage() isn't called later. */ 738 /* Just an optimization, so ->readpage() is not called later. */
739 if (unlikely(!PageUptodate(page))) { 739 if (unlikely(!PageUptodate(page))) {
740 int uptodate = 1; 740 int uptodate = 1;
741 do { 741 do {
@@ -751,7 +751,6 @@ lock_retry_remap:
751 751
752 /* Setup all mapped, dirty buffers for async write i/o. */ 752 /* Setup all mapped, dirty buffers for async write i/o. */
753 do { 753 do {
754 get_bh(bh);
755 if (buffer_mapped(bh) && buffer_dirty(bh)) { 754 if (buffer_mapped(bh) && buffer_dirty(bh)) {
756 lock_buffer(bh); 755 lock_buffer(bh);
757 if (test_clear_buffer_dirty(bh)) { 756 if (test_clear_buffer_dirty(bh)) {
@@ -789,14 +788,8 @@ lock_retry_remap:
789 788
790 BUG_ON(PageWriteback(page)); 789 BUG_ON(PageWriteback(page));
791 set_page_writeback(page); /* Keeps try_to_free_buffers() away. */ 790 set_page_writeback(page); /* Keeps try_to_free_buffers() away. */
792 unlock_page(page);
793 791
794 /* 792 /* Submit the prepared buffers for i/o. */
795 * Submit the prepared buffers for i/o. Note the page is unlocked,
796 * and the async write i/o completion handler can end_page_writeback()
797 * at any time after the *first* submit_bh(). So the buffers can then
798 * disappear...
799 */
800 need_end_writeback = TRUE; 793 need_end_writeback = TRUE;
801 do { 794 do {
802 struct buffer_head *next = bh->b_this_page; 795 struct buffer_head *next = bh->b_this_page;
@@ -804,9 +797,9 @@ lock_retry_remap:
804 submit_bh(WRITE, bh); 797 submit_bh(WRITE, bh);
805 need_end_writeback = FALSE; 798 need_end_writeback = FALSE;
806 } 799 }
807 put_bh(bh);
808 bh = next; 800 bh = next;
809 } while (bh != head); 801 } while (bh != head);
802 unlock_page(page);
810 803
811 /* If no i/o was started, need to end_page_writeback(). */ 804 /* If no i/o was started, need to end_page_writeback(). */
812 if (unlikely(need_end_writeback)) 805 if (unlikely(need_end_writeback))