Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
fs
jfs
file.c
Go to the documentation of this file.
1
/*
2
* Copyright (C) International Business Machines Corp., 2000-2002
3
* Portions Copyright (C) Christoph Hellwig, 2001-2002
4
*
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.
9
*
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.
14
*
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
18
*/
19
20
#include <
linux/mm.h
>
21
#include <linux/fs.h>
22
#include <
linux/quotaops.h
>
23
#include "
jfs_incore.h
"
24
#include "
jfs_inode.h
"
25
#include "
jfs_dmap.h
"
26
#include "
jfs_txnmgr.h
"
27
#include "
jfs_xattr.h
"
28
#include "
jfs_acl.h
"
29
#include "
jfs_debug.h
"
30
31
int
jfs_fsync
(
struct
file
*
file
, loff_t
start
, loff_t
end
,
int
datasync)
32
{
33
struct
inode
*
inode
= file->
f_mapping
->host;
34
int
rc
= 0;
35
36
rc =
filemap_write_and_wait_range
(inode->
i_mapping
, start, end);
37
if
(rc)
38
return
rc
;
39
40
mutex_lock
(&inode->
i_mutex
);
41
if
(!(inode->
i_state
&
I_DIRTY
) ||
42
(datasync && !(inode->
i_state
&
I_DIRTY_DATASYNC
))) {
43
/* Make sure committed changes hit the disk */
44
jfs_flush_journal
(JFS_SBI(inode->
i_sb
)->log, 1);
45
mutex_unlock
(&inode->
i_mutex
);
46
return
rc
;
47
}
48
49
rc |=
jfs_commit_inode
(inode, 1);
50
mutex_unlock
(&inode->
i_mutex
);
51
52
return
rc ? -
EIO
: 0;
53
}
54
55
static
int
jfs_open(
struct
inode
*
inode
,
struct
file
*
file
)
56
{
57
int
rc
;
58
59
if
((rc =
dquot_file_open
(inode, file)))
60
return
rc
;
61
62
/*
63
* We attempt to allow only one "active" file open per aggregate
64
* group. Otherwise, appending to files in parallel can cause
65
* fragmentation within the files.
66
*
67
* If the file is empty, it was probably just created and going
68
* to be written to. If it has a size, we'll hold off until the
69
* file is actually grown.
70
*/
71
if
(
S_ISREG
(inode->
i_mode
) && file->
f_mode
&
FMODE_WRITE
&&
72
(inode->
i_size
== 0)) {
73
struct
jfs_inode_info
*ji = JFS_IP(inode);
74
spin_lock_irq(&ji->
ag_lock
);
75
if
(ji->
active_ag
== -1) {
76
struct
jfs_sb_info
*jfs_sb = JFS_SBI(inode->
i_sb
);
77
ji->
active_ag
=
BLKTOAG
(
addressPXD
(&ji->
ixpxd
), jfs_sb);
78
atomic_inc
( &jfs_sb->
bmap
->db_active[ji->
active_ag
]);
79
}
80
spin_unlock_irq(&ji->
ag_lock
);
81
}
82
83
return
0;
84
}
85
static
int
jfs_release(
struct
inode *inode,
struct
file *file)
86
{
87
struct
jfs_inode_info
*ji = JFS_IP(inode);
88
89
spin_lock_irq(&ji->
ag_lock
);
90
if
(ji->
active_ag
!= -1) {
91
struct
bmap
*
bmap
= JFS_SBI(inode->
i_sb
)->bmap;
92
atomic_dec
(&bmap->
db_active
[ji->
active_ag
]);
93
ji->
active_ag
= -1;
94
}
95
spin_unlock_irq(&ji->
ag_lock
);
96
97
return
0;
98
}
99
100
int
jfs_setattr
(
struct
dentry
*
dentry
,
struct
iattr
*
iattr
)
101
{
102
struct
inode *inode = dentry->
d_inode
;
103
int
rc
;
104
105
rc =
inode_change_ok
(inode, iattr);
106
if
(rc)
107
return
rc
;
108
109
if
(is_quota_modification(inode, iattr))
110
dquot_initialize
(inode);
111
if
((iattr->
ia_valid
&
ATTR_UID
&& !uid_eq(iattr->
ia_uid
, inode->
i_uid
)) ||
112
(iattr->
ia_valid
&
ATTR_GID
&& !gid_eq(iattr->
ia_gid
, inode->
i_gid
))) {
113
rc =
dquot_transfer
(inode, iattr);
114
if
(rc)
115
return
rc
;
116
}
117
118
if
((iattr->
ia_valid
&
ATTR_SIZE
) &&
119
iattr->
ia_size
!= i_size_read(inode)) {
120
inode_dio_wait
(inode);
121
122
rc =
vmtruncate
(inode, iattr->
ia_size
);
123
if
(rc)
124
return
rc
;
125
}
126
127
setattr_copy
(inode, iattr);
128
mark_inode_dirty(inode);
129
130
if
(iattr->
ia_valid
&
ATTR_MODE
)
131
rc =
jfs_acl_chmod
(inode);
132
return
rc
;
133
}
134
135
const
struct
inode_operations
jfs_file_inode_operations
= {
136
.truncate =
jfs_truncate
,
137
.setxattr =
jfs_setxattr
,
138
.getxattr =
jfs_getxattr
,
139
.listxattr =
jfs_listxattr
,
140
.removexattr =
jfs_removexattr
,
141
.setattr =
jfs_setattr
,
142
#ifdef CONFIG_JFS_POSIX_ACL
143
.get_acl =
jfs_get_acl
,
144
#endif
145
};
146
147
const
struct
file_operations
jfs_file_operations
= {
148
.open = jfs_open,
149
.llseek =
generic_file_llseek
,
150
.write =
do_sync_write
,
151
.read =
do_sync_read
,
152
.aio_read =
generic_file_aio_read
,
153
.aio_write =
generic_file_aio_write
,
154
.mmap =
generic_file_mmap
,
155
.splice_read =
generic_file_splice_read
,
156
.splice_write =
generic_file_splice_write
,
157
.fsync =
jfs_fsync
,
158
.release = jfs_release,
159
.unlocked_ioctl =
jfs_ioctl
,
160
#ifdef CONFIG_COMPAT
161
.compat_ioctl =
jfs_compat_ioctl
,
162
#endif
163
};
Generated on Thu Jan 10 2013 13:09:26 for Linux Kernel by
1.8.2