diff options
author | Andrew Morton <akpm@osdl.org> | 2006-02-01 06:04:39 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-02-01 11:53:09 -0500 |
commit | caf736085f2f0d22a992a855d9caae14973f7ea4 (patch) | |
tree | 1224cebafe4104c9621ffa06c08311c19668acc5 /fs/smbfs | |
parent | 389d1ea50849f84c3a9f8640fcb66827746b4ab4 (diff) |
[PATCH] smbfs readdir vs signal fix
An old patch designed to fix http://bugme.osdl.org/show_bug.cgi?id=4497,
"getdents gives empty/random result upon signal".
If smbfs's readdir() is interupted by a signal, smb_readdir() failed to
noticed that and proceeded to treat the unread-into page as valid directory
contents. Fix that up by handling the -ERESTARTSYS.
Thanks to Stian Skjelstad for reporting and testing.
Cc: Stian Skjelstad <stian@nixia.no>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/smbfs')
-rw-r--r-- | fs/smbfs/dir.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/smbfs/dir.c b/fs/smbfs/dir.c index c6c33e15143a..0424d06b147e 100644 --- a/fs/smbfs/dir.c +++ b/fs/smbfs/dir.c | |||
@@ -209,6 +209,8 @@ init_cache: | |||
209 | ctl.valid = 1; | 209 | ctl.valid = 1; |
210 | read_really: | 210 | read_really: |
211 | result = server->ops->readdir(filp, dirent, filldir, &ctl); | 211 | result = server->ops->readdir(filp, dirent, filldir, &ctl); |
212 | if (result == -ERESTARTSYS && page) | ||
213 | ClearPageUptodate(page); | ||
212 | if (ctl.idx == -1) | 214 | if (ctl.idx == -1) |
213 | goto invalid_cache; /* retry */ | 215 | goto invalid_cache; /* retry */ |
214 | ctl.head.end = ctl.fpos - 1; | 216 | ctl.head.end = ctl.fpos - 1; |
@@ -217,7 +219,8 @@ finished: | |||
217 | if (page) { | 219 | if (page) { |
218 | cache->head = ctl.head; | 220 | cache->head = ctl.head; |
219 | kunmap(page); | 221 | kunmap(page); |
220 | SetPageUptodate(page); | 222 | if (result != -ERESTARTSYS) |
223 | SetPageUptodate(page); | ||
221 | unlock_page(page); | 224 | unlock_page(page); |
222 | page_cache_release(page); | 225 | page_cache_release(page); |
223 | } | 226 | } |