2 * Copyright (C) International Business Machines Corp., 2000-2002
3 * Portions Copyright (C) Christoph Hellwig, 2001-2002
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
13 * the GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include <linux/quotaops.h>
23 #include "jfs_incore.h"
24 #include "jfs_inode.h"
26 #include "jfs_txnmgr.h"
27 #include "jfs_xattr.h"
29 #include "jfs_debug.h"
31 int jfs_fsync(struct file
*file
, int datasync
)
33 struct inode
*inode
= file
->f_mapping
->host
;
36 if (!(inode
->i_state
& I_DIRTY
) ||
37 (datasync
&& !(inode
->i_state
& I_DIRTY_DATASYNC
))) {
38 /* Make sure committed changes hit the disk */
39 jfs_flush_journal(JFS_SBI(inode
->i_sb
)->log
, 1);
43 rc
|= jfs_commit_inode(inode
, 1);
48 static int jfs_open(struct inode
*inode
, struct file
*file
)
52 if ((rc
= dquot_file_open(inode
, file
)))
56 * We attempt to allow only one "active" file open per aggregate
57 * group. Otherwise, appending to files in parallel can cause
58 * fragmentation within the files.
60 * If the file is empty, it was probably just created and going
61 * to be written to. If it has a size, we'll hold off until the
62 * file is actually grown.
64 if (S_ISREG(inode
->i_mode
) && file
->f_mode
& FMODE_WRITE
&&
65 (inode
->i_size
== 0)) {
66 struct jfs_inode_info
*ji
= JFS_IP(inode
);
67 spin_lock_irq(&ji
->ag_lock
);
68 if (ji
->active_ag
== -1) {
69 struct jfs_sb_info
*jfs_sb
= JFS_SBI(inode
->i_sb
);
70 ji
->active_ag
= BLKTOAG(addressPXD(&ji
->ixpxd
), jfs_sb
);
71 atomic_inc( &jfs_sb
->bmap
->db_active
[ji
->active_ag
]);
73 spin_unlock_irq(&ji
->ag_lock
);
78 static int jfs_release(struct inode
*inode
, struct file
*file
)
80 struct jfs_inode_info
*ji
= JFS_IP(inode
);
82 spin_lock_irq(&ji
->ag_lock
);
83 if (ji
->active_ag
!= -1) {
84 struct bmap
*bmap
= JFS_SBI(inode
->i_sb
)->bmap
;
85 atomic_dec(&bmap
->db_active
[ji
->active_ag
]);
88 spin_unlock_irq(&ji
->ag_lock
);
93 int jfs_setattr(struct dentry
*dentry
, struct iattr
*iattr
)
95 struct inode
*inode
= dentry
->d_inode
;
98 rc
= inode_change_ok(inode
, iattr
);
102 if (is_quota_modification(inode
, iattr
))
103 dquot_initialize(inode
);
104 if ((iattr
->ia_valid
& ATTR_UID
&& iattr
->ia_uid
!= inode
->i_uid
) ||
105 (iattr
->ia_valid
& ATTR_GID
&& iattr
->ia_gid
!= inode
->i_gid
)) {
106 rc
= dquot_transfer(inode
, iattr
);
111 if ((iattr
->ia_valid
& ATTR_SIZE
) &&
112 iattr
->ia_size
!= i_size_read(inode
)) {
113 rc
= vmtruncate(inode
, iattr
->ia_size
);
118 setattr_copy(inode
, iattr
);
119 mark_inode_dirty(inode
);
121 if (iattr
->ia_valid
& ATTR_MODE
)
122 rc
= jfs_acl_chmod(inode
);
126 const struct inode_operations jfs_file_inode_operations
= {
127 .truncate
= jfs_truncate
,
128 .setxattr
= jfs_setxattr
,
129 .getxattr
= jfs_getxattr
,
130 .listxattr
= jfs_listxattr
,
131 .removexattr
= jfs_removexattr
,
132 .setattr
= jfs_setattr
,
133 #ifdef CONFIG_JFS_POSIX_ACL
134 .check_acl
= jfs_check_acl
,
138 const struct file_operations jfs_file_operations
= {
140 .llseek
= generic_file_llseek
,
141 .write
= do_sync_write
,
142 .read
= do_sync_read
,
143 .aio_read
= generic_file_aio_read
,
144 .aio_write
= generic_file_aio_write
,
145 .mmap
= generic_file_mmap
,
146 .splice_read
= generic_file_splice_read
,
147 .splice_write
= generic_file_splice_write
,
149 .release
= jfs_release
,
150 .unlocked_ioctl
= jfs_ioctl
,
152 .compat_ioctl
= jfs_compat_ioctl
,