projects
/
GitHub
/
MotorolaMobilityLLC
/
kernel-slsi.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
6b16351
)
NFS: Fix list manipulation snafus in fs/nfs/direct.c
author
Trond Myklebust
<Trond.Myklebust@netapp.com>
Sun, 8 Jul 2012 14:24:10 +0000
(10:24 -0400)
committer
Trond Myklebust
<Trond.Myklebust@netapp.com>
Sun, 8 Jul 2012 14:32:08 +0000
(10:32 -0400)
Fix 2 bugs in nfs_direct_write_reschedule:
- The request needs to be removed from the 'reqs' list before it can
be added to 'failed'.
- Fix an infinite loop if the 'failed' list is non-empty.
Reported-by: Julia Lawall <julia.lawall@lip6.fr>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/direct.c
patch
|
blob
|
blame
|
history
diff --git
a/fs/nfs/direct.c
b/fs/nfs/direct.c
index 9a4cbfc85d81fd203efe4db51f8897eb6bf45185..48253372ab1d115def0b81f56b097db6e98a0f88 100644
(file)
--- a/
fs/nfs/direct.c
+++ b/
fs/nfs/direct.c
@@
-484,6
+484,7
@@
static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
list_for_each_entry_safe(req, tmp, &reqs, wb_list) {
if (!nfs_pageio_add_request(&desc, req)) {
+ nfs_list_remove_request(req);
nfs_list_add_request(req, &failed);
spin_lock(cinfo.lock);
dreq->flags = 0;
@@
-494,8
+495,11
@@
static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
}
nfs_pageio_complete(&desc);
- while (!list_empty(&failed))
+ while (!list_empty(&failed)) {
+ req = nfs_list_entry(failed.next);
+ nfs_list_remove_request(req);
nfs_unlock_and_release_request(req);
+ }
if (put_dreq(dreq))
nfs_direct_write_complete(dreq, dreq->inode);