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
security
inode.c
Go to the documentation of this file.
1
/*
2
* inode.c - securityfs
3
*
4
* Copyright (C) 2005 Greg Kroah-Hartman <
[email protected]
>
5
*
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License version
8
* 2 as published by the Free Software Foundation.
9
*
10
* Based on fs/debugfs/inode.c which had the following copyright notice:
11
* Copyright (C) 2004 Greg Kroah-Hartman <
[email protected]
>
12
* Copyright (C) 2004 IBM Inc.
13
*/
14
15
/* #define DEBUG */
16
#include <linux/module.h>
17
#include <linux/fs.h>
18
#include <
linux/mount.h
>
19
#include <
linux/pagemap.h
>
20
#include <
linux/init.h
>
21
#include <
linux/namei.h
>
22
#include <
linux/security.h
>
23
#include <linux/magic.h>
24
25
static
struct
vfsmount
*
mount
;
26
static
int
mount_count;
27
28
static
inline
int
positive(
struct
dentry
*
dentry
)
29
{
30
return
dentry->
d_inode
&& !d_unhashed(dentry);
31
}
32
33
static
int
fill_super(
struct
super_block
*
sb
,
void
*
data
,
int
silent)
34
{
35
static
struct
tree_descr
files
[] = {{
""
}};
36
37
return
simple_fill_super
(sb,
SECURITYFS_MAGIC
, files);
38
}
39
40
static
struct
dentry
*get_sb(
struct
file_system_type
*fs_type,
41
int
flags
,
const
char
*dev_name,
42
void
*
data
)
43
{
44
return
mount_single
(fs_type, flags, data, fill_super);
45
}
46
47
static
struct
file_system_type
fs_type = {
48
.owner =
THIS_MODULE
,
49
.name =
"securityfs"
,
50
.mount = get_sb,
51
.kill_sb =
kill_litter_super
,
52
};
53
82
struct
dentry
*
securityfs_create_file
(
const
char
*
name
,
umode_t
mode
,
83
struct
dentry
*parent,
void
*
data
,
84
const
struct
file_operations
*
fops
)
85
{
86
struct
dentry
*
dentry
;
87
int
is_dir =
S_ISDIR
(mode);
88
struct
inode
*
dir
, *
inode
;
89
int
error
;
90
91
if
(!is_dir) {
92
BUG_ON
(!fops);
93
mode = (mode &
S_IALLUGO
) |
S_IFREG
;
94
}
95
96
pr_debug
(
"securityfs: creating file '%s'\n"
,name);
97
98
error =
simple_pin_fs
(&fs_type, &mount, &mount_count);
99
if
(error)
100
return
ERR_PTR(error);
101
102
if
(!parent)
103
parent = mount->
mnt_root
;
104
105
dir = parent->
d_inode
;
106
107
mutex_lock
(&dir->
i_mutex
);
108
dentry =
lookup_one_len
(name, parent,
strlen
(name));
109
if
(IS_ERR(dentry))
110
goto
out
;
111
112
if
(dentry->
d_inode
) {
113
error = -
EEXIST
;
114
goto
out1;
115
}
116
117
inode =
new_inode
(dir->
i_sb
);
118
if
(!inode) {
119
error = -
ENOMEM
;
120
goto
out1;
121
}
122
123
inode->
i_ino
=
get_next_ino
();
124
inode->
i_mode
=
mode
;
125
inode->
i_atime
= inode->
i_mtime
= inode->
i_ctime
=
CURRENT_TIME
;
126
inode->
i_private
=
data
;
127
if
(is_dir) {
128
inode->
i_op
= &
simple_dir_inode_operations
;
129
inode->
i_fop
= &
simple_dir_operations
;
130
inc_nlink
(inode);
131
inc_nlink
(dir);
132
}
else
{
133
inode->
i_fop
=
fops
;
134
}
135
d_instantiate
(dentry, inode);
136
dget(dentry);
137
mutex_unlock
(&dir->
i_mutex
);
138
return
dentry;
139
140
out1:
141
dput
(dentry);
142
dentry = ERR_PTR(error);
143
out
:
144
mutex_unlock
(&dir->
i_mutex
);
145
simple_release_fs
(&mount, &mount_count);
146
return
dentry;
147
}
148
EXPORT_SYMBOL_GPL
(
securityfs_create_file
);
149
171
struct
dentry
*
securityfs_create_dir
(
const
char
*
name
,
struct
dentry
*parent)
172
{
173
return
securityfs_create_file
(name,
174
S_IFDIR
|
S_IRWXU
|
S_IRUGO
|
S_IXUGO
,
175
parent,
NULL
,
NULL
);
176
}
177
EXPORT_SYMBOL_GPL
(
securityfs_create_dir
);
178
192
void
securityfs_remove
(
struct
dentry
*
dentry
)
193
{
194
struct
dentry *
parent
;
195
196
if
(!dentry || IS_ERR(dentry))
197
return
;
198
199
parent = dentry->
d_parent
;
200
if
(!parent || !parent->
d_inode
)
201
return
;
202
203
mutex_lock
(&parent->
d_inode
->i_mutex);
204
if
(positive(dentry)) {
205
if
(dentry->
d_inode
) {
206
if
(
S_ISDIR
(dentry->
d_inode
->i_mode))
207
simple_rmdir
(parent->
d_inode
, dentry);
208
else
209
simple_unlink
(parent->
d_inode
, dentry);
210
dput
(dentry);
211
}
212
}
213
mutex_unlock
(&parent->
d_inode
->i_mutex);
214
simple_release_fs
(&mount, &mount_count);
215
}
216
EXPORT_SYMBOL_GPL
(
securityfs_remove
);
217
218
static
struct
kobject
*security_kobj;
219
220
static
int
__init
securityfs_init(
void
)
221
{
222
int
retval
;
223
224
security_kobj =
kobject_create_and_add
(
"security"
,
kernel_kobj
);
225
if
(!security_kobj)
226
return
-
EINVAL
;
227
228
retval =
register_filesystem
(&fs_type);
229
if
(retval)
230
kobject_put
(security_kobj);
231
return
retval
;
232
}
233
234
core_initcall
(securityfs_init);
235
MODULE_LICENSE
(
"GPL"
);
236
Generated on Thu Jan 10 2013 13:15:26 for Linux Kernel by
1.8.2