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
8f29843a
Commit
8f29843a
authored
May 17, 2013
by
Al Viro
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[readdir] convert 9p
Signed-off-by:
Al Viro
<
viro@zeniv.linux.org.uk
>
parent
0edf977d
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
28 additions
and
44 deletions
+28
-44
fs/9p/vfs_dir.c
fs/9p/vfs_dir.c
+28
-44
No files found.
fs/9p/vfs_dir.c
View file @
8f29843a
...
...
@@ -101,16 +101,15 @@ static struct p9_rdir *v9fs_alloc_rdir_buf(struct file *filp, int buflen)
}
/**
* v9fs_dir_readdir - read a directory
* @filp: opened file structure
* @dirent: directory structure ???
* @filldir: function to populate directory structure ???
* v9fs_dir_readdir - iterate through a directory
* @file: opened file structure
* @ctx: actor we feed the entries to
*
*/
static
int
v9fs_dir_readdir
(
struct
file
*
fil
p
,
void
*
dirent
,
filldir_t
filldir
)
static
int
v9fs_dir_readdir
(
struct
file
*
fil
e
,
struct
dir_context
*
ctx
)
{
int
over
;
bool
over
;
struct
p9_wstat
st
;
int
err
=
0
;
struct
p9_fid
*
fid
;
...
...
@@ -118,19 +117,19 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir)
int
reclen
=
0
;
struct
p9_rdir
*
rdir
;
p9_debug
(
P9_DEBUG_VFS
,
"name %s
\n
"
,
fil
p
->
f_path
.
dentry
->
d_name
.
name
);
fid
=
fil
p
->
private_data
;
p9_debug
(
P9_DEBUG_VFS
,
"name %s
\n
"
,
fil
e
->
f_path
.
dentry
->
d_name
.
name
);
fid
=
fil
e
->
private_data
;
buflen
=
fid
->
clnt
->
msize
-
P9_IOHDRSZ
;
rdir
=
v9fs_alloc_rdir_buf
(
fil
p
,
buflen
);
rdir
=
v9fs_alloc_rdir_buf
(
fil
e
,
buflen
);
if
(
!
rdir
)
return
-
ENOMEM
;
while
(
1
)
{
if
(
rdir
->
tail
==
rdir
->
head
)
{
err
=
v9fs_file_readn
(
fil
p
,
rdir
->
buf
,
NULL
,
buflen
,
filp
->
f_
pos
);
err
=
v9fs_file_readn
(
fil
e
,
rdir
->
buf
,
NULL
,
buflen
,
ctx
->
pos
);
if
(
err
<=
0
)
return
err
;
...
...
@@ -148,51 +147,45 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir)
}
reclen
=
st
.
size
+
2
;
over
=
filldir
(
dirent
,
st
.
name
,
strlen
(
st
.
name
),
filp
->
f_pos
,
v9fs_qid2ino
(
&
st
.
qid
),
dt_type
(
&
st
));
over
=
!
dir_emit
(
ctx
,
st
.
name
,
strlen
(
st
.
name
),
v9fs_qid2ino
(
&
st
.
qid
),
dt_type
(
&
st
));
p9stat_free
(
&
st
);
if
(
over
)
return
0
;
rdir
->
head
+=
reclen
;
filp
->
f_
pos
+=
reclen
;
ctx
->
pos
+=
reclen
;
}
}
}
/**
* v9fs_dir_readdir_dotl - read a directory
* @filp: opened file structure
* @dirent: buffer to fill dirent structures
* @filldir: function to populate dirent structures
* v9fs_dir_readdir_dotl - iterate through a directory
* @file: opened file structure
* @ctx: actor we feed the entries to
*
*/
static
int
v9fs_dir_readdir_dotl
(
struct
file
*
filp
,
void
*
dirent
,
filldir_t
filldir
)
static
int
v9fs_dir_readdir_dotl
(
struct
file
*
file
,
struct
dir_context
*
ctx
)
{
int
over
;
int
err
=
0
;
struct
p9_fid
*
fid
;
int
buflen
;
struct
p9_rdir
*
rdir
;
struct
p9_dirent
curdirent
;
u64
oldoffset
=
0
;
p9_debug
(
P9_DEBUG_VFS
,
"name %s
\n
"
,
fil
p
->
f_path
.
dentry
->
d_name
.
name
);
fid
=
fil
p
->
private_data
;
p9_debug
(
P9_DEBUG_VFS
,
"name %s
\n
"
,
fil
e
->
f_path
.
dentry
->
d_name
.
name
);
fid
=
fil
e
->
private_data
;
buflen
=
fid
->
clnt
->
msize
-
P9_READDIRHDRSZ
;
rdir
=
v9fs_alloc_rdir_buf
(
fil
p
,
buflen
);
rdir
=
v9fs_alloc_rdir_buf
(
fil
e
,
buflen
);
if
(
!
rdir
)
return
-
ENOMEM
;
while
(
1
)
{
if
(
rdir
->
tail
==
rdir
->
head
)
{
err
=
p9_client_readdir
(
fid
,
rdir
->
buf
,
buflen
,
filp
->
f_
pos
);
ctx
->
pos
);
if
(
err
<=
0
)
return
err
;
...
...
@@ -210,22 +203,13 @@ static int v9fs_dir_readdir_dotl(struct file *filp, void *dirent,
return
-
EIO
;
}
/* d_off in dirent structure tracks the offset into
* the next dirent in the dir. However, filldir()
* expects offset into the current dirent. Hence
* while calling filldir send the offset from the
* previous dirent structure.
*/
over
=
filldir
(
dirent
,
curdirent
.
d_name
,
strlen
(
curdirent
.
d_name
),
oldoffset
,
v9fs_qid2ino
(
&
curdirent
.
qid
),
curdirent
.
d_type
);
oldoffset
=
curdirent
.
d_off
;
if
(
over
)
if
(
!
dir_emit
(
ctx
,
curdirent
.
d_name
,
strlen
(
curdirent
.
d_name
),
v9fs_qid2ino
(
&
curdirent
.
qid
),
curdirent
.
d_type
))
return
0
;
filp
->
f_
pos
=
curdirent
.
d_off
;
ctx
->
pos
=
curdirent
.
d_off
;
rdir
->
head
+=
err
;
}
}
...
...
@@ -254,7 +238,7 @@ int v9fs_dir_release(struct inode *inode, struct file *filp)
const
struct
file_operations
v9fs_dir_operations
=
{
.
read
=
generic_read_dir
,
.
llseek
=
generic_file_llseek
,
.
readdir
=
v9fs_dir_readdir
,
.
iterate
=
v9fs_dir_readdir
,
.
open
=
v9fs_file_open
,
.
release
=
v9fs_dir_release
,
};
...
...
@@ -262,7 +246,7 @@ const struct file_operations v9fs_dir_operations = {
const
struct
file_operations
v9fs_dir_operations_dotl
=
{
.
read
=
generic_read_dir
,
.
llseek
=
generic_file_llseek
,
.
readdir
=
v9fs_dir_readdir_dotl
,
.
iterate
=
v9fs_dir_readdir_dotl
,
.
open
=
v9fs_file_open
,
.
release
=
v9fs_dir_release
,
.
fsync
=
v9fs_file_fsync_dotl
,
...
...
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