diff options
Diffstat (limited to 'fs/exfat/file.c')
| -rw-r--r-- | fs/exfat/file.c | 21 | 
1 files changed, 19 insertions, 2 deletions
| diff --git a/fs/exfat/file.c b/fs/exfat/file.c index fce03f318787..a6a063830edc 100644 --- a/fs/exfat/file.c +++ b/fs/exfat/file.c @@ -6,6 +6,7 @@  #include <linux/slab.h>  #include <linux/cred.h>  #include <linux/buffer_head.h> +#include <linux/blkdev.h>  #include "exfat_raw.h"  #include "exfat_fs.h" @@ -175,7 +176,7 @@ int __exfat_truncate(struct inode *inode, loff_t new_size)  			ep2->dentry.stream.size = 0;  		} else {  			ep2->dentry.stream.valid_size = cpu_to_le64(new_size); -			ep2->dentry.stream.size = ep->dentry.stream.valid_size; +			ep2->dentry.stream.size = ep2->dentry.stream.valid_size;  		}  		if (new_size == 0) { @@ -346,12 +347,28 @@ out:  	return error;  } +int exfat_file_fsync(struct file *filp, loff_t start, loff_t end, int datasync) +{ +	struct inode *inode = filp->f_mapping->host; +	int err; + +	err = __generic_file_fsync(filp, start, end, datasync); +	if (err) +		return err; + +	err = sync_blockdev(inode->i_sb->s_bdev); +	if (err) +		return err; + +	return blkdev_issue_flush(inode->i_sb->s_bdev, GFP_KERNEL); +} +  const struct file_operations exfat_file_operations = {  	.llseek		= generic_file_llseek,  	.read_iter	= generic_file_read_iter,  	.write_iter	= generic_file_write_iter,  	.mmap		= generic_file_mmap, -	.fsync		= generic_file_fsync, +	.fsync		= exfat_file_fsync,  	.splice_read	= generic_file_splice_read,  	.splice_write	= iter_file_splice_write,  }; | 
