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
jfs_inode.c
Go to the documentation of this file.
1
/*
2
* Copyright (C) International Business Machines Corp., 2000-2004
3
*
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or
7
* (at your option) any later version.
8
*
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
12
* the GNU General Public License for more details.
13
*
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
*/
18
19
#include <linux/fs.h>
20
#include <
linux/quotaops.h
>
21
#include "
jfs_incore.h
"
22
#include "
jfs_inode.h
"
23
#include "
jfs_filsys.h
"
24
#include "
jfs_imap.h
"
25
#include "
jfs_dinode.h
"
26
#include "
jfs_debug.h
"
27
28
29
void
jfs_set_inode_flags
(
struct
inode
*
inode
)
30
{
31
unsigned
int
flags
= JFS_IP(inode)->mode2;
32
33
inode->
i_flags
&= ~(
S_IMMUTABLE
|
S_APPEND
|
34
S_NOATIME
|
S_DIRSYNC
|
S_SYNC
);
35
36
if
(flags &
JFS_IMMUTABLE_FL
)
37
inode->
i_flags
|=
S_IMMUTABLE
;
38
if
(flags &
JFS_APPEND_FL
)
39
inode->
i_flags
|=
S_APPEND
;
40
if
(flags &
JFS_NOATIME_FL
)
41
inode->
i_flags
|=
S_NOATIME
;
42
if
(flags &
JFS_DIRSYNC_FL
)
43
inode->
i_flags
|=
S_DIRSYNC
;
44
if
(flags &
JFS_SYNC_FL
)
45
inode->
i_flags
|=
S_SYNC
;
46
}
47
48
void
jfs_get_inode_flags
(
struct
jfs_inode_info
*jfs_ip)
49
{
50
unsigned
int
flags
= jfs_ip->
vfs_inode
.i_flags;
51
52
jfs_ip->
mode2
&= ~(
JFS_IMMUTABLE_FL
|
JFS_APPEND_FL
|
JFS_NOATIME_FL
|
53
JFS_DIRSYNC_FL
|
JFS_SYNC_FL
);
54
if
(flags &
S_IMMUTABLE
)
55
jfs_ip->
mode2
|=
JFS_IMMUTABLE_FL
;
56
if
(flags &
S_APPEND
)
57
jfs_ip->
mode2
|=
JFS_APPEND_FL
;
58
if
(flags &
S_NOATIME
)
59
jfs_ip->
mode2
|=
JFS_NOATIME_FL
;
60
if
(flags &
S_DIRSYNC
)
61
jfs_ip->
mode2
|=
JFS_DIRSYNC_FL
;
62
if
(flags &
S_SYNC
)
63
jfs_ip->
mode2
|=
JFS_SYNC_FL
;
64
}
65
66
/*
67
* NAME: ialloc()
68
*
69
* FUNCTION: Allocate a new inode
70
*
71
*/
72
struct
inode
*
ialloc
(
struct
inode
*parent,
umode_t
mode
)
73
{
74
struct
super_block
*
sb
= parent->
i_sb
;
75
struct
inode
*
inode
;
76
struct
jfs_inode_info
*jfs_inode;
77
int
rc
;
78
79
inode =
new_inode
(sb);
80
if
(!inode) {
81
jfs_warn
(
"ialloc: new_inode returned NULL!"
);
82
rc = -
ENOMEM
;
83
goto
fail;
84
}
85
86
jfs_inode = JFS_IP(inode);
87
88
rc =
diAlloc
(parent,
S_ISDIR
(mode), inode);
89
if
(rc) {
90
jfs_warn
(
"ialloc: diAlloc returned %d!"
, rc);
91
if
(rc == -
EIO
)
92
make_bad_inode
(inode);
93
goto
fail_put;
94
}
95
96
if
(
insert_inode_locked
(inode) < 0) {
97
rc = -
EINVAL
;
98
goto
fail_unlock;
99
}
100
101
inode_init_owner
(inode, parent, mode);
102
/*
103
* New inodes need to save sane values on disk when
104
* uid & gid mount options are used
105
*/
106
jfs_inode->
saved_uid
= inode->
i_uid
;
107
jfs_inode->
saved_gid
= inode->
i_gid
;
108
109
/*
110
* Allocate inode to quota.
111
*/
112
dquot_initialize
(inode);
113
rc =
dquot_alloc_inode
(inode);
114
if
(rc)
115
goto
fail_drop;
116
117
/* inherit flags from parent */
118
jfs_inode->
mode2
= JFS_IP(parent)->mode2 &
JFS_FL_INHERIT
;
119
120
if
(
S_ISDIR
(mode)) {
121
jfs_inode->
mode2
|=
IDIRECTORY
;
122
jfs_inode->
mode2
&= ~
JFS_DIRSYNC_FL
;
123
}
124
else
{
125
jfs_inode->
mode2
|=
INLINEEA
|
ISPARSE
;
126
if
(
S_ISLNK
(mode))
127
jfs_inode->
mode2
&= ~(
JFS_IMMUTABLE_FL
|
JFS_APPEND_FL
);
128
}
129
jfs_inode->
mode2
|= inode->
i_mode
;
130
131
inode->
i_blocks
= 0;
132
inode->
i_mtime
= inode->
i_atime
= inode->
i_ctime
=
CURRENT_TIME
;
133
jfs_inode->
otime
= inode->
i_ctime
.tv_sec;
134
inode->
i_generation
= JFS_SBI(sb)->gengen++;
135
136
jfs_inode->
cflag
= 0;
137
138
/* Zero remaining fields */
139
memset
(&jfs_inode->
acl
, 0,
sizeof
(
dxd_t
));
140
memset
(&jfs_inode->
ea
, 0,
sizeof
(
dxd_t
));
141
jfs_inode->
next_index
= 0;
142
jfs_inode->
acltype
= 0;
143
jfs_inode->
btorder
= 0;
144
jfs_inode->
btindex
= 0;
145
jfs_inode->
bxflag
= 0;
146
jfs_inode->
blid
= 0;
147
jfs_inode->
atlhead
= 0;
148
jfs_inode->
atltail
= 0;
149
jfs_inode->
xtlid
= 0;
150
jfs_set_inode_flags
(inode);
151
152
jfs_info
(
"ialloc returns inode = 0x%p\n"
, inode);
153
154
return
inode
;
155
156
fail_drop:
157
dquot_drop
(inode);
158
inode->
i_flags
|=
S_NOQUOTA
;
159
fail_unlock:
160
clear_nlink
(inode);
161
unlock_new_inode
(inode);
162
fail_put:
163
iput
(inode);
164
fail:
165
return
ERR_PTR(rc);
166
}
Generated on Thu Jan 10 2013 14:47:47 for Linux Kernel by
1.8.2