diff options
Diffstat (limited to 'fs/libfs.c')
-rw-r--r-- | fs/libfs.c | 16 |
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 | */ |
908 | int generic_file_fsync(struct file *file, int datasync) | 908 | int 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; |
929 | out: | ||
930 | mutex_unlock(&inode->i_mutex); | ||
923 | return ret; | 931 | return ret; |
924 | } | 932 | } |
925 | EXPORT_SYMBOL(generic_file_fsync); | 933 | EXPORT_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 | */ |
959 | int noop_fsync(struct file *file, int datasync) | 967 | int noop_fsync(struct file *file, loff_t start, loff_t end, int datasync) |
960 | { | 968 | { |
961 | return 0; | 969 | return 0; |
962 | } | 970 | } |