@ -158,7 +158,6 @@ EXPORT_SYMBOL(file_fsync);
/**
* vfs_fsync_range - helper to sync a range of data & metadata to disk
* @ file : file to sync
* @ dentry : dentry of @ file
* @ start : offset in bytes of the beginning of data range to sync
* @ end : offset in bytes of the end of data range ( inclusive )
* @ datasync : perform only datasync
@ -166,32 +165,13 @@ EXPORT_SYMBOL(file_fsync);
* Write back data in range @ start . . @ end and metadata for @ file to disk . If
* @ datasync is set only metadata needed to access modified file data is
* written .
*
* In case this function is called from nfsd @ file may be % NULL and
* only @ dentry is set . This can only happen when the filesystem
* implements the export_operations API .
*/
int vfs_fsync_range ( struct file * file , struct dentry * dentry , loff_t start ,
loff_t end , int datasync )
int vfs_fsync_range ( struct file * file , loff_t start , loff_t end , int datasync )
{
const struct file_operations * fop ;
struct address_space * mapping ;
struct address_space * mapping = file - > f_mapping ;
int err , ret ;
/*
* Get mapping and operations from the file in case we have
* as file , or get the default values for them in case we
* don ' t have a struct file available . Damn nfsd . .
*/
if ( file ) {
mapping = file - > f_mapping ;
fop = file - > f_op ;
} else {
mapping = dentry - > d_inode - > i_mapping ;
fop = dentry - > d_inode - > i_fop ;
}
if ( ! fop | | ! fop - > fsync ) {
if ( ! file - > f_op | | ! file - > f_op - > fsync ) {
ret = - EINVAL ;
goto out ;
}
@ -203,7 +183,7 @@ int vfs_fsync_range(struct file *file, struct dentry *dentry, loff_t start,
* livelocks in fsync_buffers_list ( ) .
*/
mutex_lock ( & mapping - > host - > i_mutex ) ;
err = fop - > fsync ( file , dentry , datasync ) ;
err = file - > f_ op - > fsync ( file , file - > f_path . dentry , datasync ) ;
if ( ! ret )
ret = err ;
mutex_unlock ( & mapping - > host - > i_mutex ) ;
@ -216,19 +196,14 @@ EXPORT_SYMBOL(vfs_fsync_range);
/**
* vfs_fsync - perform a fsync or fdatasync on a file
* @ file : file to sync
* @ dentry : dentry of @ file
* @ datasync : only perform a fdatasync operation
*
* Write back data and metadata for @ file to disk . If @ datasync is
* set only metadata needed to access modified file data is written .
*
* In case this function is called from nfsd @ file may be % NULL and
* only @ dentry is set . This can only happen when the filesystem
* implements the export_operations API .
*/
int vfs_fsync ( struct file * file , struct dentry * dentry , int datasync )
int vfs_fsync ( struct file * file , int datasync )
{
return vfs_fsync_range ( file , dentry , 0 , LLONG_MAX , datasync ) ;
return vfs_fsync_range ( file , 0 , LLONG_MAX , datasync ) ;
}
EXPORT_SYMBOL ( vfs_fsync ) ;
@ -239,7 +214,7 @@ static int do_fsync(unsigned int fd, int datasync)
file = fget ( fd ) ;
if ( file ) {
ret = vfs_fsync ( file , file - > f_path . dentry , datasync ) ;
ret = vfs_fsync ( file , datasync ) ;
fput ( file ) ;
}
return ret ;
@ -267,8 +242,7 @@ int generic_write_sync(struct file *file, loff_t pos, loff_t count)
{
if ( ! ( file - > f_flags & O_DSYNC ) & & ! IS_SYNC ( file - > f_mapping - > host ) )
return 0 ;
return vfs_fsync_range ( file , file - > f_path . dentry , pos ,
pos + count - 1 ,
return vfs_fsync_range ( file , pos , pos + count - 1 ,
( file - > f_flags & __O_SYNC ) ? 0 : 1 ) ;
}
EXPORT_SYMBOL ( generic_write_sync ) ;