aboutsummaryrefslogtreecommitdiff
path: root/net/core/utils.c
diff options
context:
space:
mode:
authorFred Isaman <iisaman@citi.umich.edu>2008-03-19 11:24:39 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2008-03-19 17:59:02 -0400
commitf8512ad0da16cbe156f3a7627971cdf0b39c4138 (patch)
tree2658c63faeda07505793ccc747ee4efbffdaa69c /net/core/utils.c
parent264e3e889d86e552b4191d69bb60f4f3b383135a (diff)
nfs: don't ignore return value from nfs_pageio_add_request
Ignoring the return value from nfs_pageio_add_request can cause deadlocks. In read path: call nfs_pageio_add_request from readpage_async_filler assume at this point that there are requests already in desc, that can't be merged with the current request. so nfs_pageio_doio is fired up to clear out desc. assume something goes wrong in setting up the io, so desc->pg_error is set. This causes nfs_pageio_add_request to return 0, *WITHOUT* adding the original request. BUT, since return code is ignored, readpage_async_filler assumes it has been added, and does nothing further, leaving page locked. do_generic_mapping_read will eventually call lock_page, resulting in deadlock In write path: page is marked dirty by generic_perform_write nfs_writepages is called call nfs_pageio_add_request from nfs_page_async_flush assume at this point that there are requests already in desc, that can't be merged with the current request. so nfs_pageio_doio is fired up to clear out desc. assume something goes wrong in setting up the io, so desc->pg_error is set. This causes nfs_page_async_flush to return 0, *WITHOUT* adding the original request, yet marking the request as locked (PG_BUSY) and in writeback, clearing dirty marks. The next time a write is done to the page, deadlock will result as nfs_write_end calls nfs_update_request Signed-off-by: Fred Isaman <iisaman@citi.umich.edu> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'net/core/utils.c')
0 files changed, 0 insertions, 0 deletions