const struct file_operations bfs_dir_operations = {
        .read           = generic_read_dir,
        .readdir        = bfs_readdir,
-       .fsync          = file_fsync,
+       .fsync          = simple_fsync,
        .llseek         = generic_file_llseek,
 };
 
                inode->i_nlink = 1;
        }
        de->ino = 0;
-       mark_buffer_dirty(bh);
+       mark_buffer_dirty_inode(bh, dir);
        dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
        mark_inode_dirty(dir);
        inode->i_ctime = dir->i_ctime;
                new_inode->i_ctime = CURRENT_TIME_SEC;
                inode_dec_link_count(new_inode);
        }
-       mark_buffer_dirty(old_bh);
+       mark_buffer_dirty_inode(old_bh, old_dir);
        error = 0;
 
 end_rename:
                                for (i = 0; i < BFS_NAMELEN; i++)
                                        de->name[i] =
                                                (i < namelen) ? name[i] : 0;
-                               mark_buffer_dirty(bh);
+                               mark_buffer_dirty_inode(bh, dir);
                                brelse(bh);
                                return 0;
                        }
 
        return ERR_PTR(-EIO);
 }
 
-static int bfs_write_inode(struct inode *inode, int unused)
+static int bfs_write_inode(struct inode *inode, int wait)
 {
+       struct bfs_sb_info *info = BFS_SB(inode->i_sb);
        unsigned int ino = (u16)inode->i_ino;
         unsigned long i_sblock;
        struct bfs_inode *di;
        struct buffer_head *bh;
        int block, off;
-       struct bfs_sb_info *info = BFS_SB(inode->i_sb);
+       int err = 0;
 
         dprintf("ino=%08x\n", ino);
 
        di->i_eoffset = cpu_to_le32(i_sblock * BFS_BSIZE + inode->i_size - 1);
 
        mark_buffer_dirty(bh);
+       if (wait) {
+               sync_dirty_buffer(bh);
+               if (buffer_req(bh) && !buffer_uptodate(bh))
+                       err = -EIO;
+       }
        brelse(bh);
        mutex_unlock(&info->bfs_lock);
-       return 0;
+       return err;
 }
 
 static void bfs_delete_inode(struct inode *inode)