Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
c20f1044
Commit
c20f1044
authored
Jun 05, 2003
by
Patrick Mochel
Browse files
Options
Browse Files
Download
Plain Diff
Merge osdl.org:/home/mochel/src/kernel/devel/linux-2.5-virgin
into osdl.org:/home/mochel/src/kernel/devel/linux-2.5-core
parents
ebb11c7e
ed35f39b
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
51 additions
and
95 deletions
+51
-95
drivers/base/core.c
drivers/base/core.c
+29
-0
fs/filesystems.c
fs/filesystems.c
+14
-75
fs/namespace.c
fs/namespace.c
+2
-2
include/linux/device.h
include/linux/device.h
+2
-0
include/linux/fs.h
include/linux/fs.h
+0
-1
lib/kobject.c
lib/kobject.c
+4
-17
No files found.
drivers/base/core.c
View file @
c20f1044
...
...
@@ -343,11 +343,40 @@ void device_unregister(struct device * dev)
put_device
(
dev
);
}
/**
* device_for_each_child - device child iterator.
* @dev: parent struct device.
* @data: data for the callback.
* @fn: function to be called for each device.
*
* Iterate over @dev's child devices, and call @fn for each,
* passing it @data.
*
* We check the return of @fn each time. If it returns anything
* other than 0, we break out and return that value.
*/
int
device_for_each_child
(
struct
device
*
dev
,
void
*
data
,
int
(
*
fn
)(
struct
device
*
,
void
*
))
{
struct
device
*
child
;
int
error
=
0
;
down_read
(
&
devices_subsys
.
rwsem
);
list_for_each_entry
(
child
,
&
dev
->
children
,
node
)
{
if
((
error
=
fn
(
child
,
data
)))
break
;
}
up_read
(
&
devices_subsys
.
rwsem
);
return
error
;
}
int
__init
devices_init
(
void
)
{
return
subsystem_register
(
&
devices_subsys
);
}
EXPORT_SYMBOL
(
device_for_each_child
);
EXPORT_SYMBOL
(
device_initialize
);
EXPORT_SYMBOL
(
device_add
);
EXPORT_SYMBOL
(
device_register
);
...
...
fs/filesystems.c
View file @
c20f1044
...
...
@@ -49,38 +49,6 @@ static struct file_system_type **find_filesystem(const char *name)
return
p
;
}
/* define fs_subsys */
static
decl_subsys
(
fs
,
NULL
,
NULL
);
static
int
register_fs_subsys
(
struct
file_system_type
*
fs
)
{
struct
subsystem
*
sub
=
&
fs
->
subsys
;
snprintf
(
sub
->
kset
.
kobj
.
name
,
KOBJ_NAME_LEN
,
"%s"
,
fs
->
name
);
subsys_set_kset
(
fs
,
fs_subsys
);
return
subsystem_register
(
sub
);
}
static
int
unlink_fs
(
struct
file_system_type
*
fs
)
{
struct
file_system_type
**
tmp
;
write_lock
(
&
file_systems_lock
);
tmp
=
&
file_systems
;
while
(
*
tmp
)
{
if
(
fs
==
*
tmp
)
{
*
tmp
=
fs
->
next
;
fs
->
next
=
NULL
;
write_unlock
(
&
file_systems_lock
);
return
0
;
}
tmp
=
&
(
*
tmp
)
->
next
;
}
write_unlock
(
&
file_systems_lock
);
return
-
EINVAL
;
}
/**
* register_filesystem - register a new filesystem
* @fs: the file system structure
...
...
@@ -111,12 +79,6 @@ int register_filesystem(struct file_system_type * fs)
else
*
p
=
fs
;
write_unlock
(
&
file_systems_lock
);
if
(
!
res
)
{
/* we implicitly possess reference to @fs during registration,
* so it cannot be unregister from under us. */
register_fs_subsys
(
fs
);
}
return
res
;
}
...
...
@@ -134,44 +96,21 @@ int register_filesystem(struct file_system_type * fs)
int
unregister_filesystem
(
struct
file_system_type
*
fs
)
{
int
res
;
res
=
unlink_fs
(
fs
);
if
(
!
res
)
subsystem_unregister
(
&
fs
->
subsys
);
return
res
;
}
extern
int
sysfs_init
(
void
);
/**
* fs_subsys_init - initialize sysfs and fs subsystem.
*
* In order to register filesystems in sysfs, it has to be
* initialized. Also, we need the base fs filesystem, so the
* registered filesystems have a home.
*
* During sysfs_init(), the registration of sysfs into itself
* will fail, since it's not mounted yet. To make sure that
* sysfs does show up, we re-register sysfs's embedded subsystem,
* which will get added, since sysfs is now mounted.
*/
void
__init
fs_subsys_init
(
void
)
{
struct
file_system_type
**
p
;
/* make sure sysfs is up and running */
sysfs_init
();
/* register fs_subsys */
subsystem_register
(
&
fs_subsys
);
p
=
find_filesystem
(
"sysfs"
);
struct
file_system_type
**
tmp
;
if
(
p
)
/* make sure it's registered */
register_fs_subsys
(
*
p
);
write_lock
(
&
file_systems_lock
);
tmp
=
&
file_systems
;
while
(
*
tmp
)
{
if
(
fs
==
*
tmp
)
{
*
tmp
=
fs
->
next
;
fs
->
next
=
NULL
;
write_unlock
(
&
file_systems_lock
);
return
0
;
}
tmp
=
&
(
*
tmp
)
->
next
;
}
write_unlock
(
&
file_systems_lock
);
return
-
EINVAL
;
}
static
int
fs_index
(
const
char
__user
*
__name
)
...
...
fs/namespace.c
View file @
c20f1044
...
...
@@ -24,7 +24,7 @@
#include <asm/uaccess.h>
extern
int
__init
init_rootfs
(
void
);
extern
int
__init
fs_subsy
s_init
(
void
);
extern
int
__init
sysf
s_init
(
void
);
static
struct
list_head
*
mount_hashtable
;
static
int
hash_mask
,
hash_bits
;
...
...
@@ -1144,7 +1144,7 @@ void __init mnt_init(unsigned long mempages)
d
++
;
i
--
;
}
while
(
i
);
fs_subsy
s_init
();
sysf
s_init
();
init_rootfs
();
init_mount_tree
();
}
include/linux/device.h
View file @
c20f1044
...
...
@@ -303,6 +303,8 @@ extern void device_unregister(struct device * dev);
extern
void
device_initialize
(
struct
device
*
dev
);
extern
int
device_add
(
struct
device
*
dev
);
extern
void
device_del
(
struct
device
*
dev
);
extern
int
device_for_each_child
(
struct
device
*
,
void
*
,
int
(
*
fn
)(
struct
device
*
,
void
*
));
/*
* Manual binding of a device to driver. See drivers/base/bus.c
...
...
include/linux/fs.h
View file @
c20f1044
...
...
@@ -917,7 +917,6 @@ struct export_operations {
struct
file_system_type
{
const
char
*
name
;
struct
subsystem
subsys
;
int
fs_flags
;
struct
super_block
*
(
*
get_sb
)
(
struct
file_system_type
*
,
int
,
const
char
*
,
void
*
);
...
...
lib/kobject.c
View file @
c20f1044
...
...
@@ -17,10 +17,6 @@
#include <linux/module.h>
#include <linux/stat.h>
/* This lock can be removed entirely when the sysfs_init() code is cleaned up
* to not try to reference itself before it is initialized. */
static
spinlock_t
kobj_lock
=
SPIN_LOCK_UNLOCKED
;
/**
* populate_dir - populate directory with attributes.
* @kobj: object we're working on.
...
...
@@ -350,14 +346,12 @@ void kobject_unregister(struct kobject * kobj)
struct
kobject
*
kobject_get
(
struct
kobject
*
kobj
)
{
struct
kobject
*
ret
=
kobj
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
kobj_lock
,
flags
);
if
(
kobj
&&
atomic_read
(
&
kobj
->
refcount
)
>
0
)
if
(
kobj
)
{
WARN_ON
(
!
atomic_read
(
&
kobj
->
refcount
));
atomic_inc
(
&
kobj
->
refcount
);
else
}
else
ret
=
NULL
;
spin_unlock_irqrestore
(
&
kobj_lock
,
flags
);
return
ret
;
}
...
...
@@ -387,15 +381,8 @@ void kobject_cleanup(struct kobject * kobj)
void
kobject_put
(
struct
kobject
*
kobj
)
{
unsigned
long
flags
;
local_irq_save
(
flags
);
if
(
atomic_dec_and_lock
(
&
kobj
->
refcount
,
&
kobj_lock
))
{
spin_unlock_irqrestore
(
&
kobj_lock
,
flags
);
if
(
atomic_dec_and_test
(
&
kobj
->
refcount
))
kobject_cleanup
(
kobj
);
}
else
{
local_irq_restore
(
flags
);
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment