*     Library for filesystems writers.
  */
 
+#include <linux/blkdev.h>
 #include <linux/export.h>
 #include <linux/pagemap.h>
 #include <linux/slab.h>
 EXPORT_SYMBOL_GPL(generic_fh_to_parent);
 
 /**
- * generic_file_fsync - generic fsync implementation for simple filesystems
+ * __generic_file_fsync - generic fsync implementation for simple filesystems
+ *
  * @file:      file to synchronize
+ * @start:     start offset in bytes
+ * @end:       end offset in bytes (inclusive)
  * @datasync:  only synchronize essential metadata if true
  *
  * This is a generic implementation of the fsync method for simple
  * filesystems which track all non-inode metadata in the buffers list
  * hanging off the address_space structure.
  */
-int generic_file_fsync(struct file *file, loff_t start, loff_t end,
-                      int datasync)
+int __generic_file_fsync(struct file *file, loff_t start, loff_t end,
+                                int datasync)
 {
        struct inode *inode = file->f_mapping->host;
        int err;
        err = sync_inode_metadata(inode, 1);
        if (ret == 0)
                ret = err;
+
 out:
        mutex_unlock(&inode->i_mutex);
        return ret;
 }
+EXPORT_SYMBOL(__generic_file_fsync);
+
+/**
+ * generic_file_fsync - generic fsync implementation for simple filesystems
+ *                     with flush
+ * @file:      file to synchronize
+ * @start:     start offset in bytes
+ * @end:       end offset in bytes (inclusive)
+ * @datasync:  only synchronize essential metadata if true
+ *
+ */
+
+int generic_file_fsync(struct file *file, loff_t start, loff_t end,
+                      int datasync)
+{
+       struct inode *inode = file->f_mapping->host;
+       int err;
+
+       err = __generic_file_fsync(file, start, end, datasync);
+       if (err)
+               return err;
+       return blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL, NULL);
+}
 EXPORT_SYMBOL(generic_file_fsync);
 
 /**
 
 extern int __blkdev_driver_ioctl(struct block_device *, fmode_t, unsigned int,
                                 unsigned long);
 #else /* CONFIG_BLOCK */
+
+struct block_device;
+
 /*
  * stubs for when the block layer is configured out
  */
        return false;
 }
 
+static inline int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask,
+                                    sector_t *error_sector)
+{
+       return 0;
+}
+
 #endif /* CONFIG_BLOCK */
 
 #endif
 
 extern ssize_t simple_write_to_buffer(void *to, size_t available, loff_t *ppos,
                const void __user *from, size_t count);
 
+extern int __generic_file_fsync(struct file *, loff_t, loff_t, int);
 extern int generic_file_fsync(struct file *, loff_t, loff_t, int);
 
 extern int generic_check_addressable(unsigned, u64);