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
Kirill Smelkov
linux
Commits
c8f7cc1e
Commit
c8f7cc1e
authored
Jul 24, 2002
by
Richard Gooch
Browse files
Options
Browse Files
Download
Plain Diff
Merge atnf.csiro.au:/workaholix1/kernel/v2.5/linus
into atnf.csiro.au:/workaholix1/kernel/v2.5/rgooch-2.5
parents
1da3174f
2c4b185c
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
81 additions
and
46 deletions
+81
-46
Documentation/filesystems/devfs/ChangeLog
Documentation/filesystems/devfs/ChangeLog
+8
-0
Documentation/filesystems/devfs/README
Documentation/filesystems/devfs/README
+25
-4
fs/devfs/base.c
fs/devfs/base.c
+48
-42
No files found.
Documentation/filesystems/devfs/ChangeLog
View file @
c8f7cc1e
...
@@ -1931,3 +1931,11 @@ Changes for patch v213
...
@@ -1931,3 +1931,11 @@ Changes for patch v213
- Protected <scan_dir_for_removable> and <get_removable_partition>
- Protected <scan_dir_for_removable> and <get_removable_partition>
from changing directory contents
from changing directory contents
===============================================================================
Changes for patch v214
- Switched to ISO C structure field initialisers
- Updated README from master HTML file
- Fixed devfs entry leak in <devfs_readdir> when *readdir fails
Documentation/filesystems/devfs/README
View file @
c8f7cc1e
...
@@ -3,7 +3,7 @@ Devfs (Device File System) FAQ
...
@@ -3,7 +3,7 @@ Devfs (Device File System) FAQ
Linux Devfs (Device File System) FAQ
Linux Devfs (Device File System) FAQ
Richard Gooch
Richard Gooch
7-APR
-2002
21-JUL
-2002
Document languages:
Document languages:
...
@@ -788,6 +788,9 @@ following to set this up:
...
@@ -788,6 +788,9 @@ following to set this up:
make sure the kernel does not mount devfs at boot time
make sure the kernel does not mount devfs at boot time
make sure you have a correct /dev/console entry in your
root file-system (where your disc-based /dev lives)
create the /dev-state directory
create the /dev-state directory
...
@@ -1288,9 +1291,10 @@ parameters:c=1,b=2,t=3,u=4 would appear as:
...
@@ -1288,9 +1291,10 @@ parameters:c=1,b=2,t=3,u=4 would appear as:
SCSI Generic Devices
SCSI Generic Devices
All SCSI CD-ROMs are placed under /dev/sg. A similar naming
The generic (aka. raw) interface for all SCSI devices are placed under
scheme is used as for SCSI discs. A SCSI generic device with the
/dev/sg.
A similar naming scheme is used as for SCSI discs. A
parameters:c=1,b=2,t=3,u=4 would appear as:
SCSI generic device with the parameters:c=1,b=2,t=3,u=4 would appear
as:
/dev/sg/c1b2t3u4
/dev/sg/c1b2t3u4
...
@@ -1605,6 +1609,23 @@ make sure that devfs is mounted on /dev. See above for how to
...
@@ -1605,6 +1609,23 @@ make sure that devfs is mounted on /dev. See above for how to
do that.
do that.
I have extra or incorrect entries in /dev
You may have stale entries in your dev-state area. Check for a
RESTORE configuration line in your devfsd configuration
(typically
/etc/devfsd.conf). If you have this line, check
the contents of the specified directory for stale entries. Remove
any entries which are incorrect, then reboot.
I get "Unable to open initial console" messages at boot
This usually happens when you don't have devfs automounted onto
/dev
at boot time, and there is no valid
/dev/console
entry on your root file-system. Create a valid
/dev/console
device node.
...
...
fs/devfs/base.c
View file @
c8f7cc1e
...
@@ -633,6 +633,11 @@
...
@@ -633,6 +633,11 @@
20020514 Richard Gooch <rgooch@atnf.csiro.au>
20020514 Richard Gooch <rgooch@atnf.csiro.au>
Minor cleanup of <scan_dir_for_removable>.
Minor cleanup of <scan_dir_for_removable>.
v1.17
v1.17
20020721 Richard Gooch <rgooch@atnf.csiro.au>
Switched to ISO C structure field initialisers.
20020722 Richard Gooch <rgooch@atnf.csiro.au>
Fixed devfs entry leak in <devfs_readdir> when *readdir fails.
v1.18
*/
*/
#include <linux/types.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/errno.h>
...
@@ -665,7 +670,7 @@
...
@@ -665,7 +670,7 @@
#include <asm/bitops.h>
#include <asm/bitops.h>
#include <asm/atomic.h>
#include <asm/atomic.h>
#define DEVFS_VERSION "1.1
7 (20020514
)"
#define DEVFS_VERSION "1.1
8 (20020722
)"
#define DEVFS_NAME "devfs"
#define DEVFS_NAME "devfs"
...
@@ -877,7 +882,7 @@ static ssize_t stat_read (struct file *file, char *buf, size_t len,
...
@@ -877,7 +882,7 @@ static ssize_t stat_read (struct file *file, char *buf, size_t len,
loff_t
*
ppos
);
loff_t
*
ppos
);
static
struct
file_operations
stat_fops
=
static
struct
file_operations
stat_fops
=
{
{
read:
stat_read
,
.
read
=
stat_read
,
};
};
#endif
#endif
...
@@ -885,9 +890,9 @@ static struct file_operations stat_fops =
...
@@ -885,9 +890,9 @@ static struct file_operations stat_fops =
/* Devfs daemon file operations */
/* Devfs daemon file operations */
static
struct
file_operations
devfsd_fops
=
static
struct
file_operations
devfsd_fops
=
{
{
read:
devfsd_read
,
.
read
=
devfsd_read
,
ioctl:
devfsd_ioctl
,
.
ioctl
=
devfsd_ioctl
,
release:
devfsd_close
,
.
release
=
devfsd_close
,
};
};
...
@@ -1446,12 +1451,12 @@ static int wait_for_devfsd_finished (struct fs_info *fs_info)
...
@@ -1446,12 +1451,12 @@ static int wait_for_devfsd_finished (struct fs_info *fs_info)
if
(
fs_info
->
devfsd_task
==
NULL
)
return
(
TRUE
);
if
(
fs_info
->
devfsd_task
==
NULL
)
return
(
TRUE
);
if
(
devfsd_queue_empty
(
fs_info
)
&&
fs_info
->
devfsd_sleeping
)
return
TRUE
;
if
(
devfsd_queue_empty
(
fs_info
)
&&
fs_info
->
devfsd_sleeping
)
return
TRUE
;
if
(
is_devfsd_or_child
(
fs_info
)
)
return
(
FALSE
);
if
(
is_devfsd_or_child
(
fs_info
)
)
return
(
FALSE
);
set_current_state
(
TASK_UNINTERRUPTIBLE
);
add_wait_queue
(
&
fs_info
->
revalidate_wait_queue
,
&
wait
);
add_wait_queue
(
&
fs_info
->
revalidate_wait_queue
,
&
wait
);
current
->
state
=
TASK_UNINTERRUPTIBLE
;
if
(
!
devfsd_queue_empty
(
fs_info
)
||
!
fs_info
->
devfsd_sleeping
)
if
(
!
devfsd_queue_empty
(
fs_info
)
||
!
fs_info
->
devfsd_sleeping
)
if
(
fs_info
->
devfsd_task
)
schedule
();
if
(
fs_info
->
devfsd_task
)
schedule
();
remove_wait_queue
(
&
fs_info
->
revalidate_wait_queue
,
&
wait
);
remove_wait_queue
(
&
fs_info
->
revalidate_wait_queue
,
&
wait
);
current
->
state
=
TASK_RUNNING
;
__set_current_state
(
TASK_RUNNING
)
;
return
(
TRUE
);
return
(
TRUE
);
}
/* End Function wait_for_devfsd_finished */
}
/* End Function wait_for_devfsd_finished */
...
@@ -2576,9 +2581,9 @@ static void devfs_clear_inode (struct inode *inode)
...
@@ -2576,9 +2581,9 @@ static void devfs_clear_inode (struct inode *inode)
static
struct
super_operations
devfs_sops
=
static
struct
super_operations
devfs_sops
=
{
{
drop_inode:
generic_delete_inode
,
.
drop_inode
=
generic_delete_inode
,
clear_inode:
devfs_clear_inode
,
.
clear_inode
=
devfs_clear_inode
,
statfs:
simple_statfs
,
.
statfs
=
simple_statfs
,
};
};
...
@@ -2724,19 +2729,20 @@ static int devfs_readdir (struct file *file, void *dirent, filldir_t filldir)
...
@@ -2724,19 +2729,20 @@ static int devfs_readdir (struct file *file, void *dirent, filldir_t filldir)
{
{
err
=
(
*
filldir
)
(
dirent
,
de
->
name
,
de
->
namelen
,
err
=
(
*
filldir
)
(
dirent
,
de
->
name
,
de
->
namelen
,
file
->
f_pos
,
de
->
inode
.
ino
,
de
->
mode
>>
12
);
file
->
f_pos
,
de
->
inode
.
ino
,
de
->
mode
>>
12
);
if
(
err
>=
0
)
if
(
err
<
0
)
devfs_put
(
de
);
else
{
{
file
->
f_pos
++
;
file
->
f_pos
++
;
++
stored
;
++
stored
;
}
}
}
}
if
(
err
==
-
EINVAL
)
break
;
if
(
err
<
0
)
return
err
;
read_lock
(
&
parent
->
u
.
dir
.
lock
);
read_lock
(
&
parent
->
u
.
dir
.
lock
);
next
=
devfs_get
(
de
->
next
);
next
=
devfs_get
(
de
->
next
);
read_unlock
(
&
parent
->
u
.
dir
.
lock
);
read_unlock
(
&
parent
->
u
.
dir
.
lock
);
devfs_put
(
de
);
devfs_put
(
de
);
de
=
next
;
de
=
next
;
if
(
err
==
-
EINVAL
)
break
;
if
(
err
<
0
)
return
err
;
}
}
break
;
break
;
}
}
...
@@ -2795,14 +2801,14 @@ static int devfs_open (struct inode *inode, struct file *file)
...
@@ -2795,14 +2801,14 @@ static int devfs_open (struct inode *inode, struct file *file)
static
struct
file_operations
devfs_fops
=
static
struct
file_operations
devfs_fops
=
{
{
open:
devfs_open
,
.
open
=
devfs_open
,
};
};
static
struct
file_operations
devfs_dir_fops
=
static
struct
file_operations
devfs_dir_fops
=
{
{
read:
generic_read_dir
,
.
read
=
generic_read_dir
,
readdir:
devfs_readdir
,
.
readdir
=
devfs_readdir
,
open:
devfs_open
,
.
open
=
devfs_open
,
};
};
...
@@ -2844,19 +2850,19 @@ static int devfs_d_delete (struct dentry *dentry);
...
@@ -2844,19 +2850,19 @@ static int devfs_d_delete (struct dentry *dentry);
static
struct
dentry_operations
devfs_dops
=
static
struct
dentry_operations
devfs_dops
=
{
{
d_delete:
devfs_d_delete
,
.
d_delete
=
devfs_d_delete
,
d_release:
devfs_d_release
,
.
d_release
=
devfs_d_release
,
d_iput:
devfs_d_iput
,
.
d_iput
=
devfs_d_iput
,
};
};
static
int
devfs_d_revalidate_wait
(
struct
dentry
*
dentry
,
int
flags
);
static
int
devfs_d_revalidate_wait
(
struct
dentry
*
dentry
,
int
flags
);
static
struct
dentry_operations
devfs_wait_dops
=
static
struct
dentry_operations
devfs_wait_dops
=
{
{
d_delete:
devfs_d_delete
,
.
d_delete
=
devfs_d_delete
,
d_release:
devfs_d_release
,
.
d_release
=
devfs_d_release
,
d_iput:
devfs_d_iput
,
.
d_iput
=
devfs_d_iput
,
d_revalidate:
devfs_d_revalidate_wait
,
.
d_revalidate
=
devfs_d_revalidate_wait
,
};
};
/**
/**
...
@@ -2943,8 +2949,8 @@ static int devfs_d_revalidate_wait (struct dentry *dentry, int flags)
...
@@ -2943,8 +2949,8 @@ static int devfs_d_revalidate_wait (struct dentry *dentry, int flags)
read_lock
(
&
parent
->
u
.
dir
.
lock
);
read_lock
(
&
parent
->
u
.
dir
.
lock
);
if
(
dentry
->
d_fsdata
)
if
(
dentry
->
d_fsdata
)
{
{
set_current_state
(
TASK_UNINTERRUPTIBLE
);
add_wait_queue
(
&
lookup_info
->
wait_queue
,
&
wait
);
add_wait_queue
(
&
lookup_info
->
wait_queue
,
&
wait
);
current
->
state
=
TASK_UNINTERRUPTIBLE
;
read_unlock
(
&
parent
->
u
.
dir
.
lock
);
read_unlock
(
&
parent
->
u
.
dir
.
lock
);
schedule
();
schedule
();
}
}
...
@@ -3223,25 +3229,25 @@ static int devfs_follow_link (struct dentry *dentry, struct nameidata *nd)
...
@@ -3223,25 +3229,25 @@ static int devfs_follow_link (struct dentry *dentry, struct nameidata *nd)
static
struct
inode_operations
devfs_iops
=
static
struct
inode_operations
devfs_iops
=
{
{
setattr:
devfs_notify_change
,
.
setattr
=
devfs_notify_change
,
};
};
static
struct
inode_operations
devfs_dir_iops
=
static
struct
inode_operations
devfs_dir_iops
=
{
{
lookup:
devfs_lookup
,
.
lookup
=
devfs_lookup
,
unlink:
devfs_unlink
,
.
unlink
=
devfs_unlink
,
symlink:
devfs_symlink
,
.
symlink
=
devfs_symlink
,
mkdir:
devfs_mkdir
,
.
mkdir
=
devfs_mkdir
,
rmdir:
devfs_rmdir
,
.
rmdir
=
devfs_rmdir
,
mknod:
devfs_mknod
,
.
mknod
=
devfs_mknod
,
setattr:
devfs_notify_change
,
.
setattr
=
devfs_notify_change
,
};
};
static
struct
inode_operations
devfs_symlink_iops
=
static
struct
inode_operations
devfs_symlink_iops
=
{
{
readlink:
devfs_readlink
,
.
readlink
=
devfs_readlink
,
follow_link:
devfs_follow_link
,
.
follow_link
=
devfs_follow_link
,
setattr:
devfs_notify_change
,
.
setattr
=
devfs_notify_change
,
};
};
static
int
devfs_fill_super
(
struct
super_block
*
sb
,
void
*
data
,
int
silent
)
static
int
devfs_fill_super
(
struct
super_block
*
sb
,
void
*
data
,
int
silent
)
...
@@ -3279,9 +3285,9 @@ static struct super_block *devfs_get_sb (struct file_system_type *fs_type,
...
@@ -3279,9 +3285,9 @@ static struct super_block *devfs_get_sb (struct file_system_type *fs_type,
static
struct
file_system_type
devfs_fs_type
=
static
struct
file_system_type
devfs_fs_type
=
{
{
name:
DEVFS_NAME
,
.
name
=
DEVFS_NAME
,
get_sb:
devfs_get_sb
,
.
get_sb
=
devfs_get_sb
,
kill_sb:
kill_anon_super
,
.
kill_sb
=
kill_anon_super
,
};
};
/* File operations for devfsd follow */
/* File operations for devfsd follow */
...
@@ -3305,8 +3311,8 @@ static ssize_t devfsd_read (struct file *file, char *buf, size_t len,
...
@@ -3305,8 +3311,8 @@ static ssize_t devfsd_read (struct file *file, char *buf, size_t len,
info
->
major
=
0
;
info
->
major
=
0
;
info
->
minor
=
0
;
info
->
minor
=
0
;
/* Block for a new entry */
/* Block for a new entry */
set_current_state
(
TASK_INTERRUPTIBLE
);
add_wait_queue
(
&
fs_info
->
devfsd_wait_queue
,
&
wait
);
add_wait_queue
(
&
fs_info
->
devfsd_wait_queue
,
&
wait
);
current
->
state
=
TASK_INTERRUPTIBLE
;
while
(
devfsd_queue_empty
(
fs_info
)
)
while
(
devfsd_queue_empty
(
fs_info
)
)
{
{
fs_info
->
devfsd_sleeping
=
TRUE
;
fs_info
->
devfsd_sleeping
=
TRUE
;
...
@@ -3316,13 +3322,13 @@ static ssize_t devfsd_read (struct file *file, char *buf, size_t len,
...
@@ -3316,13 +3322,13 @@ static ssize_t devfsd_read (struct file *file, char *buf, size_t len,
if
(
signal_pending
(
current
)
)
if
(
signal_pending
(
current
)
)
{
{
remove_wait_queue
(
&
fs_info
->
devfsd_wait_queue
,
&
wait
);
remove_wait_queue
(
&
fs_info
->
devfsd_wait_queue
,
&
wait
);
current
->
state
=
TASK_RUNNING
;
__set_current_state
(
TASK_RUNNING
)
;
return
-
EINTR
;
return
-
EINTR
;
}
}
set_current_state
(
TASK_INTERRUPTIBLE
);
set_current_state
(
TASK_INTERRUPTIBLE
);
}
}
remove_wait_queue
(
&
fs_info
->
devfsd_wait_queue
,
&
wait
);
remove_wait_queue
(
&
fs_info
->
devfsd_wait_queue
,
&
wait
);
current
->
state
=
TASK_RUNNING
;
__set_current_state
(
TASK_RUNNING
)
;
/* Now play with the data */
/* Now play with the data */
ival
=
atomic_read
(
&
fs_info
->
devfsd_overrun_count
);
ival
=
atomic_read
(
&
fs_info
->
devfsd_overrun_count
);
info
->
overrun_count
=
ival
;
info
->
overrun_count
=
ival
;
...
...
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