2005-04-17 02:20:36 +04:00
/*
* linux / fs / ext3 / 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
*
* ext3 fs regular file handling primitives
*
* 64 - bit file support on 64 - bit platforms by Jakub Jelinek
* ( jj @ sunsite . ms . mff . cuni . cz )
*/
2010-03-03 17:05:07 +03:00
# include <linux/quotaops.h>
2012-03-30 06:30:07 +04:00
# include "ext3.h"
2005-04-17 02:20:36 +04:00
# include "xattr.h"
# include "acl.h"
/*
* Called when an inode is released . Note that this is different
* from ext3_file_open : open gets called at every open , but release
* gets called only when / all / the files are closed .
*/
static int ext3_release_file ( struct inode * inode , struct file * filp )
{
2010-01-06 23:58:48 +03:00
if ( ext3_test_inode_state ( inode , EXT3_STATE_FLUSH_ON_CLOSE ) ) {
2009-04-03 09:34:35 +04:00
filemap_flush ( inode - > i_mapping ) ;
2010-01-06 23:58:48 +03:00
ext3_clear_inode_state ( inode , EXT3_STATE_FLUSH_ON_CLOSE ) ;
2009-04-03 09:34:35 +04:00
}
2005-04-17 02:20:36 +04:00
/* if we are the last writer on the inode, drop the block reservation */
if ( ( filp - > f_mode & FMODE_WRITE ) & &
( atomic_read ( & inode - > i_writecount ) = = 1 ) )
2005-06-29 07:45:16 +04:00
{
2006-03-23 14:00:42 +03:00
mutex_lock ( & EXT3_I ( inode ) - > truncate_mutex ) ;
2005-04-17 02:20:36 +04:00
ext3_discard_reservation ( inode ) ;
2006-03-23 14:00:42 +03:00
mutex_unlock ( & EXT3_I ( inode ) - > truncate_mutex ) ;
2005-06-29 07:45:16 +04:00
}
2005-04-17 02:20:36 +04:00
if ( is_dx ( inode ) & & filp - > private_data )
ext3_htree_free_dir_info ( filp - > private_data ) ;
return 0 ;
}
2006-03-28 13:56:42 +04:00
const struct file_operations ext3_file_operations = {
2005-04-17 02:20:36 +04:00
. llseek = generic_file_llseek ,
. read = do_sync_read ,
. write = do_sync_write ,
. aio_read = generic_file_aio_read ,
2009-08-18 19:51:23 +04:00
. aio_write = generic_file_aio_write ,
2009-04-03 03:57:12 +04:00
. unlocked_ioctl = ext3_ioctl ,
2006-08-29 22:06:23 +04:00
# ifdef CONFIG_COMPAT
. compat_ioctl = ext3_compat_ioctl ,
# endif
2005-04-17 02:20:36 +04:00
. mmap = generic_file_mmap ,
2010-03-03 17:05:06 +03:00
. open = dquot_file_open ,
2005-04-17 02:20:36 +04:00
. release = ext3_release_file ,
. fsync = ext3_sync_file ,
2006-03-30 17:15:30 +04:00
. splice_read = generic_file_splice_read ,
. splice_write = generic_file_splice_write ,
2005-04-17 02:20:36 +04:00
} ;
2007-02-12 11:55:38 +03:00
const struct inode_operations ext3_file_inode_operations = {
2005-04-17 02:20:36 +04:00
. setattr = ext3_setattr ,
# ifdef CONFIG_EXT3_FS_XATTR
. setxattr = generic_setxattr ,
. getxattr = generic_getxattr ,
. listxattr = ext3_listxattr ,
. removexattr = generic_removexattr ,
# endif
2011-07-23 19:37:31 +04:00
. get_acl = ext3_get_acl ,
2008-10-04 01:32:43 +04:00
. fiemap = ext3_fiemap ,
2005-04-17 02:20:36 +04:00
} ;