2005-04-17 02:20:36 +04:00
/*
2005-05-05 00:29:35 +04:00
* Copyright ( C ) International Business Machines Corp . , 2000 - 2002
* Portions Copyright ( C ) Christoph Hellwig , 2001 - 2002
2005-04-17 02:20:36 +04:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See
* the GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
# include <linux/fs.h>
# include "jfs_incore.h"
2005-05-05 00:29:35 +04:00
# include "jfs_inode.h"
2005-04-17 02:20:36 +04:00
# include "jfs_dmap.h"
# include "jfs_txnmgr.h"
# include "jfs_xattr.h"
# include "jfs_acl.h"
# include "jfs_debug.h"
int jfs_fsync ( struct file * file , struct dentry * dentry , int datasync )
{
struct inode * inode = dentry - > d_inode ;
int rc = 0 ;
if ( ! ( inode - > i_state & I_DIRTY ) | |
( datasync & & ! ( inode - > i_state & I_DIRTY_DATASYNC ) ) ) {
/* Make sure committed changes hit the disk */
jfs_flush_journal ( JFS_SBI ( inode - > i_sb ) - > log , 1 ) ;
return rc ;
}
rc | = jfs_commit_inode ( inode , 1 ) ;
return rc ? - EIO : 0 ;
}
static int jfs_open ( struct inode * inode , struct file * file )
{
int rc ;
if ( ( rc = generic_file_open ( inode , file ) ) )
return rc ;
/*
* We attempt to allow only one " active " file open per aggregate
* group . Otherwise , appending to files in parallel can cause
* fragmentation within the files .
*
* If the file is empty , it was probably just created and going
* to be written to . If it has a size , we ' ll hold off until the
* file is actually grown .
*/
if ( S_ISREG ( inode - > i_mode ) & & file - > f_mode & FMODE_WRITE & &
( inode - > i_size = = 0 ) ) {
struct jfs_inode_info * ji = JFS_IP ( inode ) ;
spin_lock_irq ( & ji - > ag_lock ) ;
if ( ji - > active_ag = = - 1 ) {
ji - > active_ag = ji - > agno ;
atomic_inc (
& JFS_SBI ( inode - > i_sb ) - > bmap - > db_active [ ji - > agno ] ) ;
}
spin_unlock_irq ( & ji - > ag_lock ) ;
}
return 0 ;
}
static int jfs_release ( struct inode * inode , struct file * file )
{
struct jfs_inode_info * ji = JFS_IP ( inode ) ;
spin_lock_irq ( & ji - > ag_lock ) ;
if ( ji - > active_ag ! = - 1 ) {
struct bmap * bmap = JFS_SBI ( inode - > i_sb ) - > bmap ;
atomic_dec ( & bmap - > db_active [ ji - > active_ag ] ) ;
ji - > active_ag = - 1 ;
}
spin_unlock_irq ( & ji - > ag_lock ) ;
return 0 ;
}
struct inode_operations jfs_file_inode_operations = {
. truncate = jfs_truncate ,
. setxattr = jfs_setxattr ,
. getxattr = jfs_getxattr ,
. listxattr = jfs_listxattr ,
. removexattr = jfs_removexattr ,
# ifdef CONFIG_JFS_POSIX_ACL
. setattr = jfs_setattr ,
. permission = jfs_permission ,
# endif
} ;
2006-03-28 13:56:42 +04:00
const struct file_operations jfs_file_operations = {
2005-04-17 02:20:36 +04:00
. open = jfs_open ,
. llseek = generic_file_llseek ,
. write = generic_file_write ,
. read = generic_file_read ,
. aio_read = generic_file_aio_read ,
. aio_write = generic_file_aio_write ,
. mmap = generic_file_mmap ,
. readv = generic_file_readv ,
. writev = generic_file_writev ,
. sendfile = generic_file_sendfile ,
. fsync = jfs_fsync ,
. release = jfs_release ,
2006-02-09 18:09:16 +03:00
. ioctl = jfs_ioctl ,
2005-04-17 02:20:36 +04:00
} ;