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
f0dd2136
Commit
f0dd2136
authored
Jun 22, 2005
by
Trond Myklebust
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] NFS: Clean up readdir changes.
Signed-off-by:
Trond Myklebust
<
Trond.Myklebust@netapp.com
>
parent
00a92642
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
48 additions
and
39 deletions
+48
-39
fs/nfs/dir.c
fs/nfs/dir.c
+48
-37
fs/nfs/inode.c
fs/nfs/inode.c
+0
-1
include/linux/nfs_fs.h
include/linux/nfs_fs.h
+0
-1
No files found.
fs/nfs/dir.c
View file @
f0dd2136
...
...
@@ -51,8 +51,10 @@ static int nfs_mknod(struct inode *, struct dentry *, int, dev_t);
static
int
nfs_rename
(
struct
inode
*
,
struct
dentry
*
,
struct
inode
*
,
struct
dentry
*
);
static
int
nfs_fsync_dir
(
struct
file
*
,
struct
dentry
*
,
int
);
static
loff_t
nfs_llseek_dir
(
struct
file
*
,
loff_t
,
int
);
struct
file_operations
nfs_dir_operations
=
{
.
llseek
=
nfs_llseek_dir
,
.
read
=
generic_read_dir
,
.
readdir
=
nfs_readdir
,
.
open
=
nfs_opendir
,
...
...
@@ -141,9 +143,8 @@ typedef struct {
struct
page
*
page
;
unsigned
long
page_index
;
u32
*
ptr
;
u64
target_cookie
;
int
target_index
;
int
current_index
;
u64
*
dir_cookie
;
loff_t
current_index
;
struct
nfs_entry
*
entry
;
decode_dirent_t
decode
;
int
plus
;
...
...
@@ -227,7 +228,7 @@ void dir_page_release(nfs_readdir_descriptor_t *desc)
/*
* Given a pointer to a buffer that has already been filled by a call
* to readdir, find the next entry with cookie '
desc->target
_cookie'.
* to readdir, find the next entry with cookie '
*desc->dir
_cookie'.
*
* If the end of the buffer has been reached, return -EAGAIN, if not,
* return the offset within the buffer of the next entry to be
...
...
@@ -241,8 +242,8 @@ int find_dirent(nfs_readdir_descriptor_t *desc)
status
;
while
((
status
=
dir_decode
(
desc
))
==
0
)
{
dfprintk
(
VFS
,
"NFS: found cookie %Lu
\n
"
,
(
long
long
)
entry
->
cookie
);
if
(
entry
->
prev_cookie
==
desc
->
target
_cookie
)
dfprintk
(
VFS
,
"NFS: found cookie %Lu
\n
"
,
(
unsigned
long
long
)
entry
->
cookie
);
if
(
entry
->
prev_cookie
==
*
desc
->
dir
_cookie
)
break
;
if
(
loop_count
++
>
200
)
{
loop_count
=
0
;
...
...
@@ -255,7 +256,7 @@ int find_dirent(nfs_readdir_descriptor_t *desc)
/*
* Given a pointer to a buffer that has already been filled by a call
* to readdir, find the entry at offset 'desc->
target_index
'.
* to readdir, find the entry at offset 'desc->
file->f_pos
'.
*
* If the end of the buffer has been reached, return -EAGAIN, if not,
* return the offset within the buffer of the next entry to be
...
...
@@ -273,10 +274,10 @@ int find_dirent_index(nfs_readdir_descriptor_t *desc)
if
(
status
)
break
;
dfprintk
(
VFS
,
"NFS: found cookie %Lu at index %
d
\n
"
,
(
long
long
)
entry
->
cookie
,
desc
->
current_index
);
dfprintk
(
VFS
,
"NFS: found cookie %Lu at index %
Ld
\n
"
,
(
unsigned
long
long
)
entry
->
cookie
,
desc
->
current_index
);
if
(
desc
->
target_index
==
desc
->
current_index
)
{
desc
->
target
_cookie
=
entry
->
cookie
;
if
(
desc
->
file
->
f_pos
==
desc
->
current_index
)
{
*
desc
->
dir
_cookie
=
entry
->
cookie
;
break
;
}
desc
->
current_index
++
;
...
...
@@ -314,7 +315,7 @@ int find_dirent_page(nfs_readdir_descriptor_t *desc)
/* NOTE: Someone else may have changed the READDIRPLUS flag */
desc
->
page
=
page
;
desc
->
ptr
=
kmap
(
page
);
/* matching kunmap in nfs_do_filldir */
if
(
desc
->
target_cookie
)
if
(
*
desc
->
dir_cookie
!=
0
)
status
=
find_dirent
(
desc
);
else
status
=
find_dirent_index
(
desc
);
...
...
@@ -332,8 +333,8 @@ int find_dirent_page(nfs_readdir_descriptor_t *desc)
* Recurse through the page cache pages, and return a
* filled nfs_entry structure of the next directory entry if possible.
*
* The target for the search is '
desc->target
_cookie' if non-0,
* 'desc->
target_index
' otherwise
* The target for the search is '
*desc->dir
_cookie' if non-0,
* 'desc->
file->f_pos
' otherwise
*/
static
inline
int
readdir_search_pagecache
(
nfs_readdir_descriptor_t
*
desc
)
...
...
@@ -341,18 +342,15 @@ int readdir_search_pagecache(nfs_readdir_descriptor_t *desc)
int
loop_count
=
0
;
int
res
;
if
(
desc
->
target_cookie
)
dfprintk
(
VFS
,
"NFS: readdir_search_pagecache() searching for cookie %Lu
\n
"
,
(
long
long
)
desc
->
target_cookie
);
else
dfprintk
(
VFS
,
"NFS: readdir_search_pagecache() searching for cookie number %d
\n
"
,
desc
->
target_index
);
/* Always search-by-index from the beginning of the cache */
if
(
!
(
desc
->
target_cookie
))
{
if
(
*
desc
->
dir_cookie
==
0
)
{
dfprintk
(
VFS
,
"NFS: readdir_search_pagecache() searching for offset %Ld
\n
"
,
(
long
long
)
desc
->
file
->
f_pos
);
desc
->
page_index
=
0
;
desc
->
entry
->
cookie
=
desc
->
entry
->
prev_cookie
=
0
;
desc
->
entry
->
eof
=
0
;
desc
->
current_index
=
0
;
}
}
else
dfprintk
(
VFS
,
"NFS: readdir_search_pagecache() searching for cookie %Lu
\n
"
,
(
unsigned
long
long
)
*
desc
->
dir_cookie
);
for
(;;)
{
res
=
find_dirent_page
(
desc
);
...
...
@@ -386,7 +384,6 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent,
struct
file
*
file
=
desc
->
file
;
struct
nfs_entry
*
entry
=
desc
->
entry
;
struct
dentry
*
dentry
=
NULL
;
struct
nfs_open_context
*
ctx
=
file
->
private_data
;
unsigned
long
fileid
;
int
loop_count
=
0
,
res
;
...
...
@@ -415,7 +412,7 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent,
if
(
res
<
0
)
break
;
file
->
f_pos
++
;
desc
->
target
_cookie
=
entry
->
cookie
;
*
desc
->
dir
_cookie
=
entry
->
cookie
;
if
(
dir_decode
(
desc
)
!=
0
)
{
desc
->
page_index
++
;
break
;
...
...
@@ -425,12 +422,10 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent,
schedule
();
}
}
ctx
->
dir_pos
=
file
->
f_pos
;
ctx
->
dir_cookie
=
desc
->
target_cookie
;
dir_page_release
(
desc
);
if
(
dentry
!=
NULL
)
dput
(
dentry
);
dfprintk
(
VFS
,
"NFS: nfs_do_filldir() filling ended @ cookie %Lu; returning = %d
\n
"
,
(
long
long
)
desc
->
target
_cookie
,
res
);
dfprintk
(
VFS
,
"NFS: nfs_do_filldir() filling ended @ cookie %Lu; returning = %d
\n
"
,
(
unsigned
long
long
)
*
desc
->
dir
_cookie
,
res
);
return
res
;
}
...
...
@@ -456,14 +451,14 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent,
struct
page
*
page
=
NULL
;
int
status
;
dfprintk
(
VFS
,
"NFS: uncached_readdir() searching for cookie %Lu
\n
"
,
(
long
long
)
desc
->
target
_cookie
);
dfprintk
(
VFS
,
"NFS: uncached_readdir() searching for cookie %Lu
\n
"
,
(
unsigned
long
long
)
*
desc
->
dir
_cookie
);
page
=
alloc_page
(
GFP_HIGHUSER
);
if
(
!
page
)
{
status
=
-
ENOMEM
;
goto
out
;
}
desc
->
error
=
NFS_PROTO
(
inode
)
->
readdir
(
file
->
f_dentry
,
cred
,
desc
->
target
_cookie
,
desc
->
error
=
NFS_PROTO
(
inode
)
->
readdir
(
file
->
f_dentry
,
cred
,
*
desc
->
dir
_cookie
,
page
,
NFS_SERVER
(
inode
)
->
dtsize
,
desc
->
plus
);
...
...
@@ -472,7 +467,7 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent,
desc
->
ptr
=
kmap
(
page
);
/* matching kunmap in nfs_do_filldir */
if
(
desc
->
error
>=
0
)
{
if
((
status
=
dir_decode
(
desc
))
==
0
)
desc
->
entry
->
prev_cookie
=
desc
->
target
_cookie
;
desc
->
entry
->
prev_cookie
=
*
desc
->
dir
_cookie
;
}
else
status
=
-
EIO
;
if
(
status
<
0
)
...
...
@@ -501,7 +496,6 @@ static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
{
struct
dentry
*
dentry
=
filp
->
f_dentry
;
struct
inode
*
inode
=
dentry
->
d_inode
;
struct
nfs_open_context
*
ctx
=
filp
->
private_data
;
nfs_readdir_descriptor_t
my_desc
,
*
desc
=
&
my_desc
;
struct
nfs_entry
my_entry
;
...
...
@@ -519,21 +513,16 @@ static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
/*
* filp->f_pos points to the dirent entry number.
*
ctx->dir_pos has the number of the cached cookie.
We have
*
*desc->dir_cookie has the cookie for the next entry.
We have
* to either find the entry with the appropriate number or
* revalidate the cookie.
*/
memset
(
desc
,
0
,
sizeof
(
*
desc
));
desc
->
file
=
filp
;
desc
->
dir_cookie
=
&
((
struct
nfs_open_context
*
)
filp
->
private_data
)
->
dir_cookie
;
desc
->
decode
=
NFS_PROTO
(
inode
)
->
decode_dirent
;
desc
->
plus
=
NFS_USE_READDIRPLUS
(
inode
);
desc
->
target_index
=
filp
->
f_pos
;
if
(
filp
->
f_pos
==
ctx
->
dir_pos
)
desc
->
target_cookie
=
ctx
->
dir_cookie
;
else
desc
->
target_cookie
=
0
;
my_entry
.
cookie
=
my_entry
.
prev_cookie
=
0
;
my_entry
.
eof
=
0
;
...
...
@@ -546,7 +535,7 @@ static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
if
(
res
==
-
EBADCOOKIE
)
{
/* This means either end of directory */
if
(
desc
->
target_cookie
&&
desc
->
entry
->
cookie
!=
desc
->
target
_cookie
)
{
if
(
*
desc
->
dir_cookie
&&
desc
->
entry
->
cookie
!=
*
desc
->
dir
_cookie
)
{
/* Or that the server has 'lost' a cookie */
res
=
uncached_readdir
(
desc
,
dirent
,
filldir
);
if
(
res
>=
0
)
...
...
@@ -579,6 +568,28 @@ static int nfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
return
0
;
}
loff_t
nfs_llseek_dir
(
struct
file
*
filp
,
loff_t
offset
,
int
origin
)
{
down
(
&
filp
->
f_dentry
->
d_inode
->
i_sem
);
switch
(
origin
)
{
case
1
:
offset
+=
filp
->
f_pos
;
case
0
:
if
(
offset
>=
0
)
break
;
default:
offset
=
-
EINVAL
;
goto
out
;
}
if
(
offset
!=
filp
->
f_pos
)
{
filp
->
f_pos
=
offset
;
((
struct
nfs_open_context
*
)
filp
->
private_data
)
->
dir_cookie
=
0
;
}
out:
up
(
&
filp
->
f_dentry
->
d_inode
->
i_sem
);
return
offset
;
}
/*
* All directory operations under NFS are synchronous, so fsync()
* is a dummy operation.
...
...
fs/nfs/inode.c
View file @
f0dd2136
...
...
@@ -891,7 +891,6 @@ struct nfs_open_context *alloc_nfs_open_context(struct dentry *dentry, struct rp
ctx
->
state
=
NULL
;
ctx
->
lockowner
=
current
->
files
;
ctx
->
error
=
0
;
ctx
->
dir_pos
=
0
;
ctx
->
dir_cookie
=
0
;
}
return
ctx
;
...
...
include/linux/nfs_fs.h
View file @
f0dd2136
...
...
@@ -85,7 +85,6 @@ struct nfs_open_context {
struct
list_head
list
;
int
dir_pos
;
/* Directory cookie cache */
__u64
dir_cookie
;
};
...
...
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