Hi, FS People,

I have a patch which tries to restore O_SYNC capabilities to the
filesystems. It passes an extra parameter to the __block_commit_write
function in fs/buffer.c which is the file flags. I then check for the
O_SYNC flag and act accordingly.

I've submitted a few test patches before, but this one looks better :-).

I'm not on the fsdevel list, but am on the kernel list, so please include
my email in replies.

Comments? Flames?

-- 
|| Bill Wendling                        [EMAIL PROTECTED]
--- linux-2.3.99-pre7-5/fs/buffer.c     Thu May  4 20:35:53 2000
+++ linux-2.3.99-pre7-5-new/fs/buffer.c Thu May  4 23:09:23 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;

Reply via email to