mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 06:12:08 +00:00
[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>
This commit is contained in:
parent
389d1ea508
commit
caf736085f
@ -209,6 +209,8 @@ init_cache:
|
|||||||
ctl.valid = 1;
|
ctl.valid = 1;
|
||||||
read_really:
|
read_really:
|
||||||
result = server->ops->readdir(filp, dirent, filldir, &ctl);
|
result = server->ops->readdir(filp, dirent, filldir, &ctl);
|
||||||
|
if (result == -ERESTARTSYS && page)
|
||||||
|
ClearPageUptodate(page);
|
||||||
if (ctl.idx == -1)
|
if (ctl.idx == -1)
|
||||||
goto invalid_cache; /* retry */
|
goto invalid_cache; /* retry */
|
||||||
ctl.head.end = ctl.fpos - 1;
|
ctl.head.end = ctl.fpos - 1;
|
||||||
@ -217,7 +219,8 @@ finished:
|
|||||||
if (page) {
|
if (page) {
|
||||||
cache->head = ctl.head;
|
cache->head = ctl.head;
|
||||||
kunmap(page);
|
kunmap(page);
|
||||||
SetPageUptodate(page);
|
if (result != -ERESTARTSYS)
|
||||||
|
SetPageUptodate(page);
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
page_cache_release(page);
|
page_cache_release(page);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user