--- linux-2.3.99-pre7-6/fs/buffer.c Fri May 5 22:57:04 2000 +++ linux-2.3.99-pre7-6-new/fs/buffer.c Fri May 5 23:10:02 2000 @@ -1488,12 +1488,12 @@ } static int __block_commit_write(struct inode *inode, struct page *page, - unsigned from, unsigned to) + unsigned fflags, unsigned from, unsigned to) { unsigned block_start, block_end; - int partial = 0, need_balance_dirty = 0; + int partial = 0, need_balance_dirty = 0, buffercount = 0; unsigned blocksize; - struct buffer_head *bh, *head; + struct buffer_head *bh, *head, *bufferlist[NBUF]; blocksize = inode->i_sb->s_blocksize; @@ -1511,6 +1511,33 @@ need_balance_dirty = 1; } } + + if (fflags & O_SYNC) + bufferlist[buffercount++] = bh; + + if (buffercount == NBUF) { + int i; + + ll_rw_block(WRITE, buffercount, bufferlist); + + for (i = 0; i < buffercount; i++) { + wait_on_buffer(bufferlist[i]); + brelse(bufferlist[i]); + } + + buffercount = 0; + } + } + + if (buffercount) { + int i; + + ll_rw_block(WRITE, buffercount, bufferlist); + + for (i = 0; i < buffercount; i++) { + wait_on_buffer(bufferlist[i]); + brelse(bufferlist[i]); + } } if (need_balance_dirty) @@ -1633,7 +1660,7 @@ goto out_unmap; kaddr = (char*)page_address(page); memset(kaddr+zerofrom, 0, PAGE_CACHE_SIZE-zerofrom); - __block_commit_write(inode, new_page, zerofrom, to); + __block_commit_write(inode, new_page, 0, zerofrom, to); kunmap(new_page); UnlockPage(new_page); page_cache_release(new_page); @@ -1662,7 +1689,7 @@ kaddr = (char*)page_address(page); if (zerofrom < offset) { memset(kaddr+zerofrom, 0, offset-zerofrom); - __block_commit_write(inode, page, zerofrom, offset); + __block_commit_write(inode, page, 0, zerofrom, offset); } return 0; out1: @@ -1696,7 +1723,7 @@ { struct inode *inode = (struct inode*)page->mapping->host; loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to; - __block_commit_write(inode,page,from,to); + __block_commit_write(inode, page, file->f_flags, from, to); kunmap(page); if (pos > inode->i_size) inode->i_size = pos; @@ -1723,7 +1750,7 @@ err = __block_prepare_write(inode, page, 0, offset, get_block); if (!err) { memset((char *)page_address(page)+offset, 0, PAGE_CACHE_SIZE-offset); - __block_commit_write(inode,page,0,offset); + __block_commit_write(inode,page,0,0,offset); done: kunmap(page); return err;