aboutsummaryrefslogtreecommitdiffstats
path: root/fs/libfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/libfs.c')
-rw-r--r--fs/libfs.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/fs/libfs.c b/fs/libfs.c
index bd50b11f92da..8f2271a5df53 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -905,21 +905,29 @@ EXPORT_SYMBOL_GPL(generic_fh_to_parent);
905 * filesystems which track all non-inode metadata in the buffers list 905 * filesystems which track all non-inode metadata in the buffers list
906 * hanging off the address_space structure. 906 * hanging off the address_space structure.
907 */ 907 */
908int generic_file_fsync(struct file *file, int datasync) 908int generic_file_fsync(struct file *file, loff_t start, loff_t end,
909 int datasync)
909{ 910{
910 struct inode *inode = file->f_mapping->host; 911 struct inode *inode = file->f_mapping->host;
911 int err; 912 int err;
912 int ret; 913 int ret;
913 914
915 err = filemap_write_and_wait_range(inode->i_mapping, start, end);
916 if (err)
917 return err;
918
919 mutex_lock(&inode->i_mutex);
914 ret = sync_mapping_buffers(inode->i_mapping); 920 ret = sync_mapping_buffers(inode->i_mapping);
915 if (!(inode->i_state & I_DIRTY)) 921 if (!(inode->i_state & I_DIRTY))
916 return ret; 922 goto out;
917 if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) 923 if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
918 return ret; 924 goto out;
919 925
920 err = sync_inode_metadata(inode, 1); 926 err = sync_inode_metadata(inode, 1);
921 if (ret == 0) 927 if (ret == 0)
922 ret = err; 928 ret = err;
929out:
930 mutex_unlock(&inode->i_mutex);
923 return ret; 931 return ret;
924} 932}
925EXPORT_SYMBOL(generic_file_fsync); 933EXPORT_SYMBOL(generic_file_fsync);
@@ -956,7 +964,7 @@ EXPORT_SYMBOL(generic_check_addressable);
956/* 964/*
957 * No-op implementation of ->fsync for in-memory filesystems. 965 * No-op implementation of ->fsync for in-memory filesystems.
958 */ 966 */
959int noop_fsync(struct file *file, int datasync) 967int noop_fsync(struct file *file, loff_t start, loff_t end, int datasync)
960{ 968{
961 return 0; 969 return 0;
962} 970}