2005-04-16 15:20:36 -07:00
/*
* linux / fs / ext2 / file . c
*
* Copyright ( C ) 1992 , 1993 , 1994 , 1995
* Remy Card ( card @ masi . ibp . fr )
* Laboratoire MASI - Institut Blaise Pascal
* Universite Pierre et Marie Curie ( Paris VI )
*
* from
*
* linux / fs / minix / file . c
*
* Copyright ( C ) 1991 , 1992 Linus Torvalds
*
* ext2 fs regular file handling primitives
*
* 64 - bit file support on 64 - bit platforms by Jakub Jelinek
* ( jj @ sunsite . ms . mff . cuni . cz )
*/
# include <linux/time.h>
2009-12-15 16:46:49 -08:00
# include <linux/pagemap.h>
2010-03-03 09:05:07 -05:00
# include <linux/quotaops.h>
2005-04-16 15:20:36 -07:00
# include "ext2.h"
# include "xattr.h"
# include "acl.h"
/*
2007-07-15 23:40:22 -07:00
* Called when filp is released . This happens when all file descriptors
* for a single struct file are closed . Note that different open ( ) calls
* for the same file yield different struct file structures .
2005-04-16 15:20:36 -07:00
*/
static int ext2_release_file ( struct inode * inode , struct file * filp )
{
2007-10-16 23:30:46 -07:00
if ( filp - > f_mode & FMODE_WRITE ) {
mutex_lock ( & EXT2_I ( inode ) - > truncate_mutex ) ;
ext2_discard_reservation ( inode ) ;
mutex_unlock ( & EXT2_I ( inode ) - > truncate_mutex ) ;
}
2005-04-16 15:20:36 -07:00
return 0 ;
}
2010-05-26 17:53:25 +02:00
int ext2_fsync ( struct file * file , int datasync )
2009-12-15 16:46:49 -08:00
{
int ret ;
2010-05-26 17:53:25 +02:00
struct super_block * sb = file - > f_mapping - > host - > i_sb ;
2009-12-15 16:46:49 -08:00
struct address_space * mapping = sb - > s_bdev - > bd_inode - > i_mapping ;
2010-05-26 17:53:41 +02:00
ret = generic_file_fsync ( file , datasync ) ;
2009-12-15 16:46:49 -08:00
if ( ret = = - EIO | | test_and_clear_bit ( AS_EIO , & mapping - > flags ) ) {
/* We don't really know where the IO error happened... */
ext2_error ( sb , __func__ ,
" detected IO error when writing metadata buffers " ) ;
ret = - EIO ;
}
return ret ;
}
2005-04-16 15:20:36 -07:00
/*
* We have mostly NULL ' s here : the current defaults are ok for
* the ext2 filesystem .
*/
2006-03-28 01:56:42 -08:00
const struct file_operations ext2_file_operations = {
2005-04-16 15:20:36 -07:00
. llseek = generic_file_llseek ,
2006-09-30 23:28:48 -07:00
. read = do_sync_read ,
. write = do_sync_write ,
2005-04-16 15:20:36 -07:00
. aio_read = generic_file_aio_read ,
. aio_write = generic_file_aio_write ,
2008-02-06 01:40:10 -08:00
. unlocked_ioctl = ext2_ioctl ,
2006-08-29 19:06:20 +01:00
# ifdef CONFIG_COMPAT
. compat_ioctl = ext2_compat_ioctl ,
# endif
2005-04-16 15:20:36 -07:00
. mmap = generic_file_mmap ,
2010-03-03 09:05:06 -05:00
. open = dquot_file_open ,
2005-04-16 15:20:36 -07:00
. release = ext2_release_file ,
2009-12-15 16:46:49 -08:00
. fsync = ext2_fsync ,
2006-03-30 15:15:30 +02:00
. splice_read = generic_file_splice_read ,
. splice_write = generic_file_splice_write ,
2005-04-16 15:20:36 -07:00
} ;
2005-06-23 22:05:26 -07:00
# ifdef CONFIG_EXT2_FS_XIP
2006-03-28 01:56:42 -08:00
const struct file_operations ext2_xip_file_operations = {
2005-06-23 22:05:26 -07:00
. llseek = generic_file_llseek ,
2005-06-23 22:05:28 -07:00
. read = xip_file_read ,
. write = xip_file_write ,
2008-02-06 01:40:10 -08:00
. unlocked_ioctl = ext2_ioctl ,
2006-08-29 19:06:20 +01:00
# ifdef CONFIG_COMPAT
. compat_ioctl = ext2_compat_ioctl ,
# endif
2005-06-23 22:05:26 -07:00
. mmap = xip_file_mmap ,
2010-03-03 09:05:06 -05:00
. open = dquot_file_open ,
2005-06-23 22:05:26 -07:00
. release = ext2_release_file ,
2009-12-15 16:46:49 -08:00
. fsync = ext2_fsync ,
2005-06-23 22:05:26 -07:00
} ;
# endif
2007-02-12 00:55:38 -08:00
const struct inode_operations ext2_file_inode_operations = {
2005-04-16 15:20:36 -07:00
# ifdef CONFIG_EXT2_FS_XATTR
. setxattr = generic_setxattr ,
. getxattr = generic_getxattr ,
. listxattr = ext2_listxattr ,
. removexattr = generic_removexattr ,
# endif
. setattr = ext2_setattr ,
2009-08-28 12:12:24 -07:00
. check_acl = ext2_check_acl ,
2008-10-03 17:32:43 -04:00
. fiemap = ext2_fiemap ,
2005-04-16 15:20:36 -07:00
} ;