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
0edf977d
Commit
0edf977d
authored
May 17, 2013
by
Al Viro
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[readdir] convert affs
Signed-off-by:
Al Viro
<
viro@zeniv.linux.org.uk
>
parent
2638ffba
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
24 additions
and
45 deletions
+24
-45
fs/affs/dir.c
fs/affs/dir.c
+24
-45
No files found.
fs/affs/dir.c
View file @
0edf977d
...
...
@@ -15,12 +15,12 @@
#include "affs.h"
static
int
affs_readdir
(
struct
file
*
,
void
*
,
filldir_t
);
static
int
affs_readdir
(
struct
file
*
,
struct
dir_context
*
);
const
struct
file_operations
affs_dir_operations
=
{
.
read
=
generic_read_dir
,
.
llseek
=
generic_file_llseek
,
.
readdir
=
affs_readdir
,
.
iterate
=
affs_readdir
,
.
fsync
=
affs_file_fsync
,
};
...
...
@@ -40,52 +40,35 @@ const struct inode_operations affs_dir_inode_operations = {
};
static
int
affs_readdir
(
struct
file
*
fil
p
,
void
*
dirent
,
filldir_t
filldir
)
affs_readdir
(
struct
file
*
fil
e
,
struct
dir_context
*
ctx
)
{
struct
inode
*
inode
=
file_inode
(
fil
p
);
struct
inode
*
inode
=
file_inode
(
fil
e
);
struct
super_block
*
sb
=
inode
->
i_sb
;
struct
buffer_head
*
dir_bh
;
struct
buffer_head
*
fh_bh
;
struct
buffer_head
*
dir_bh
=
NULL
;
struct
buffer_head
*
fh_bh
=
NULL
;
unsigned
char
*
name
;
int
namelen
;
u32
i
;
int
hash_pos
;
int
chain_pos
;
u32
f_pos
;
u32
ino
;
int
stored
;
int
res
;
pr_debug
(
"AFFS: readdir(ino=%lu,f_pos=%lx)
\n
"
,
inode
->
i_ino
,(
unsigned
long
)
filp
->
f_
pos
);
pr_debug
(
"AFFS: readdir(ino=%lu,f_pos=%lx)
\n
"
,
inode
->
i_ino
,(
unsigned
long
)
ctx
->
pos
);
stored
=
0
;
res
=
-
EIO
;
dir_bh
=
NULL
;
fh_bh
=
NULL
;
f_pos
=
filp
->
f_pos
;
if
(
f_pos
==
0
)
{
filp
->
private_data
=
(
void
*
)
0
;
if
(
filldir
(
dirent
,
"."
,
1
,
f_pos
,
inode
->
i_ino
,
DT_DIR
)
<
0
)
if
(
ctx
->
pos
<
2
)
{
file
->
private_data
=
(
void
*
)
0
;
if
(
!
dir_emit_dots
(
file
,
ctx
))
return
0
;
filp
->
f_pos
=
f_pos
=
1
;
stored
++
;
}
if
(
f_pos
==
1
)
{
if
(
filldir
(
dirent
,
".."
,
2
,
f_pos
,
parent_ino
(
filp
->
f_path
.
dentry
),
DT_DIR
)
<
0
)
return
stored
;
filp
->
f_pos
=
f_pos
=
2
;
stored
++
;
}
affs_lock_dir
(
inode
);
chain_pos
=
(
f_
pos
-
2
)
&
0xffff
;
hash_pos
=
(
f_
pos
-
2
)
>>
16
;
chain_pos
=
(
ctx
->
pos
-
2
)
&
0xffff
;
hash_pos
=
(
ctx
->
pos
-
2
)
>>
16
;
if
(
chain_pos
==
0xffff
)
{
affs_warning
(
sb
,
"readdir"
,
"More than 65535 entries in chain"
);
chain_pos
=
0
;
hash_pos
++
;
filp
->
f_
pos
=
((
hash_pos
<<
16
)
|
chain_pos
)
+
2
;
ctx
->
pos
=
((
hash_pos
<<
16
)
|
chain_pos
)
+
2
;
}
dir_bh
=
affs_bread
(
sb
,
inode
->
i_ino
);
if
(
!
dir_bh
)
...
...
@@ -94,8 +77,8 @@ affs_readdir(struct file *filp, void *dirent, filldir_t filldir)
/* If the directory hasn't changed since the last call to readdir(),
* we can jump directly to where we left off.
*/
ino
=
(
u32
)(
long
)
fil
p
->
private_data
;
if
(
ino
&&
fil
p
->
f_version
==
inode
->
i_version
)
{
ino
=
(
u32
)(
long
)
fil
e
->
private_data
;
if
(
ino
&&
fil
e
->
f_version
==
inode
->
i_version
)
{
pr_debug
(
"AFFS: readdir() left off=%d
\n
"
,
ino
);
goto
inside
;
}
...
...
@@ -105,7 +88,7 @@ affs_readdir(struct file *filp, void *dirent, filldir_t filldir)
fh_bh
=
affs_bread
(
sb
,
ino
);
if
(
!
fh_bh
)
{
affs_error
(
sb
,
"readdir"
,
"Cannot read block %d"
,
i
);
goto
readdir_out
;
return
-
EIO
;
}
ino
=
be32_to_cpu
(
AFFS_TAIL
(
sb
,
fh_bh
)
->
hash_chain
);
affs_brelse
(
fh_bh
);
...
...
@@ -119,38 +102,34 @@ affs_readdir(struct file *filp, void *dirent, filldir_t filldir)
ino
=
be32_to_cpu
(
AFFS_HEAD
(
dir_bh
)
->
table
[
hash_pos
]);
if
(
!
ino
)
continue
;
f_
pos
=
(
hash_pos
<<
16
)
+
2
;
ctx
->
pos
=
(
hash_pos
<<
16
)
+
2
;
inside:
do
{
fh_bh
=
affs_bread
(
sb
,
ino
);
if
(
!
fh_bh
)
{
affs_error
(
sb
,
"readdir"
,
"Cannot read block %d"
,
ino
);
goto
readdir_done
;
break
;
}
namelen
=
min
(
AFFS_TAIL
(
sb
,
fh_bh
)
->
name
[
0
],
(
u8
)
30
);
name
=
AFFS_TAIL
(
sb
,
fh_bh
)
->
name
+
1
;
pr_debug
(
"AFFS: readdir(): filldir(
\"
%.*s
\"
, ino=%u), hash=%d, f_pos=%x
\n
"
,
namelen
,
name
,
ino
,
hash_pos
,
f_
pos
);
if
(
filldir
(
dirent
,
name
,
namelen
,
f_pos
,
ino
,
DT_UNKNOWN
)
<
0
)
namelen
,
name
,
ino
,
hash_pos
,
(
u32
)
ctx
->
pos
);
if
(
!
dir_emit
(
ctx
,
name
,
namelen
,
ino
,
DT_UNKNOWN
)
)
goto
readdir_done
;
stored
++
;
f_pos
++
;
ctx
->
pos
++
;
ino
=
be32_to_cpu
(
AFFS_TAIL
(
sb
,
fh_bh
)
->
hash_chain
);
affs_brelse
(
fh_bh
);
fh_bh
=
NULL
;
}
while
(
ino
);
}
readdir_done:
filp
->
f_pos
=
f_pos
;
filp
->
f_version
=
inode
->
i_version
;
filp
->
private_data
=
(
void
*
)(
long
)
ino
;
res
=
stored
;
file
->
f_version
=
inode
->
i_version
;
file
->
private_data
=
(
void
*
)(
long
)
ino
;
readdir_out:
affs_brelse
(
dir_bh
);
affs_brelse
(
fh_bh
);
affs_unlock_dir
(
inode
);
pr_debug
(
"AFFS: readdir()=%d
\n
"
,
stored
);
return
res
;
return
0
;
}
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