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
configfs
configfs_internal.h
Go to the documentation of this file.
1
/* -*- mode: c; c-basic-offset:8; -*-
2
* vim: noexpandtab sw=8 ts=8 sts=0:
3
*
4
* configfs_internal.h - Internal stuff for configfs
5
*
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public
8
* License as published by the Free Software Foundation; either
9
* version 2 of the License, or (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public
17
* License along with this program; if not, write to the
18
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19
* Boston, MA 021110-1307, USA.
20
*
21
* Based on sysfs:
22
* sysfs is Copyright (C) 2001, 2002, 2003 Patrick Mochel
23
*
24
* configfs Copyright (C) 2005 Oracle. All rights reserved.
25
*/
26
27
#include <linux/slab.h>
28
#include <linux/list.h>
29
#include <
linux/spinlock.h
>
30
31
struct
configfs_dirent
{
32
atomic_t
s_count
;
33
int
s_dependent_count
;
34
struct
list_head
s_sibling
;
35
struct
list_head
s_children
;
36
struct
list_head
s_links
;
37
void
*
s_element
;
38
int
s_type
;
39
umode_t
s_mode
;
40
struct
dentry
*
s_dentry
;
41
struct
iattr
*
s_iattr
;
42
#ifdef CONFIG_LOCKDEP
43
int
s_depth;
44
#endif
45
};
46
47
#define CONFIGFS_ROOT 0x0001
48
#define CONFIGFS_DIR 0x0002
49
#define CONFIGFS_ITEM_ATTR 0x0004
50
#define CONFIGFS_ITEM_LINK 0x0020
51
#define CONFIGFS_USET_DIR 0x0040
52
#define CONFIGFS_USET_DEFAULT 0x0080
53
#define CONFIGFS_USET_DROPPING 0x0100
54
#define CONFIGFS_USET_IN_MKDIR 0x0200
55
#define CONFIGFS_USET_CREATING 0x0400
56
#define CONFIGFS_NOT_PINNED (CONFIGFS_ITEM_ATTR)
57
58
extern
struct
mutex
configfs_symlink_mutex
;
59
extern
spinlock_t
configfs_dirent_lock
;
60
61
extern
struct
kmem_cache
*
configfs_dir_cachep
;
62
63
extern
int
configfs_is_root
(
struct
config_item
*
item
);
64
65
extern
struct
inode
*
configfs_new_inode
(
umode_t
mode
,
struct
configfs_dirent
*,
struct
super_block
*);
66
extern
int
configfs_create
(
struct
dentry
*,
umode_t
mode
,
int
(*
init
)(
struct
inode
*));
67
extern
int
configfs_inode_init
(
void
);
68
extern
void
configfs_inode_exit
(
void
);
69
70
extern
int
configfs_create_file
(
struct
config_item
*,
const
struct
configfs_attribute
*);
71
extern
int
configfs_make_dirent
(
struct
configfs_dirent
*,
72
struct
dentry
*,
void
*,
umode_t
,
int
);
73
extern
int
configfs_dirent_is_ready
(
struct
configfs_dirent
*);
74
75
extern
int
configfs_add_file
(
struct
dentry
*,
const
struct
configfs_attribute
*,
int
);
76
extern
void
configfs_hash_and_remove
(
struct
dentry
* dir,
const
char
*
name
);
77
78
extern
const
unsigned
char
*
configfs_get_name
(
struct
configfs_dirent
*
sd
);
79
extern
void
configfs_drop_dentry
(
struct
configfs_dirent
*
sd
,
struct
dentry
*parent);
80
extern
int
configfs_setattr
(
struct
dentry
*
dentry
,
struct
iattr
*
iattr
);
81
82
extern
struct
dentry
*
configfs_pin_fs
(
void
);
83
extern
void
configfs_release_fs
(
void
);
84
85
extern
struct
rw_semaphore
configfs_rename_sem
;
86
extern
const
struct
file_operations
configfs_dir_operations
;
87
extern
const
struct
file_operations
configfs_file_operations
;
88
extern
const
struct
file_operations
bin_fops
;
89
extern
const
struct
inode_operations
configfs_dir_inode_operations
;
90
extern
const
struct
inode_operations
configfs_root_inode_operations
;
91
extern
const
struct
inode_operations
configfs_symlink_inode_operations
;
92
extern
const
struct
dentry_operations
configfs_dentry_ops
;
93
94
extern
int
configfs_symlink
(
struct
inode
*dir,
struct
dentry
*
dentry
,
95
const
char
*symname);
96
extern
int
configfs_unlink
(
struct
inode
*dir,
struct
dentry
*
dentry
);
97
98
struct
configfs_symlink
{
99
struct
list_head
sl_list
;
100
struct
config_item
*
sl_target
;
101
};
102
103
extern
int
configfs_create_link
(
struct
configfs_symlink
*
sl
,
104
struct
dentry
*parent,
105
struct
dentry
*
dentry
);
106
107
static
inline
struct
config_item
* to_item(
struct
dentry
*
dentry
)
108
{
109
struct
configfs_dirent
*
sd
= dentry->
d_fsdata
;
110
return
((
struct
config_item
*) sd->
s_element
);
111
}
112
113
static
inline
struct
configfs_attribute
*
to_attr
(
struct
dentry * dentry)
114
{
115
struct
configfs_dirent
* sd = dentry->
d_fsdata
;
116
return
((
struct
configfs_attribute
*) sd->
s_element
);
117
}
118
119
static
inline
struct
config_item
*configfs_get_config_item(
struct
dentry *dentry)
120
{
121
struct
config_item
*
item
=
NULL
;
122
123
spin_lock(&dentry->
d_lock
);
124
if
(!d_unhashed(dentry)) {
125
struct
configfs_dirent
* sd = dentry->
d_fsdata
;
126
if
(sd->
s_type
&
CONFIGFS_ITEM_LINK
) {
127
struct
configfs_symlink
*
sl
= sd->
s_element
;
128
item =
config_item_get
(sl->
sl_target
);
129
}
else
130
item =
config_item_get
(sd->
s_element
);
131
}
132
spin_unlock(&dentry->
d_lock
);
133
134
return
item
;
135
}
136
137
static
inline
void
release_configfs_dirent(
struct
configfs_dirent
* sd)
138
{
139
if
(!(sd->
s_type
&
CONFIGFS_ROOT
)) {
140
kfree
(sd->
s_iattr
);
141
kmem_cache_free
(configfs_dir_cachep, sd);
142
}
143
}
144
145
static
inline
struct
configfs_dirent
* configfs_get(
struct
configfs_dirent
* sd)
146
{
147
if
(sd) {
148
WARN_ON
(!
atomic_read
(&sd->
s_count
));
149
atomic_inc
(&sd->
s_count
);
150
}
151
return
sd;
152
}
153
154
static
inline
void
configfs_put(
struct
configfs_dirent
* sd)
155
{
156
WARN_ON
(!
atomic_read
(&sd->
s_count
));
157
if
(
atomic_dec_and_test
(&sd->
s_count
))
158
release_configfs_dirent(sd);
159
}
160
Generated on Thu Jan 10 2013 14:46:18 for Linux Kernel by
1.8.2