kernel-ark/fs/nfs
Fred Isaman f8512ad0da 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>
2008-03-19 17:59:02 -04:00
..
callback_proc.c NFSv4: Iterate through all nfs_clients when the server recalls a delegation 2008-01-30 02:06:12 -05:00
callback_xdr.c nfs: fix sparse warnings 2008-02-20 16:15:44 -05:00
callback.c Wrap buffers used for rpc debug printks into RPC_IFDEBUG 2008-02-21 18:42:29 -05:00
callback.h NFS: Change cb_recallargs to pass "struct sockaddr *" instead of sockaddr_in 2008-01-30 02:05:55 -05:00
client.c Merge branch 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc 2008-02-01 11:45:47 +11:00
delegation.c nfs: fix sparse warnings 2008-02-20 16:15:44 -05:00
delegation.h NFS: Add an asynchronous delegreturn operation for use in nfs_clear_inode 2008-01-30 02:06:12 -05:00
dir.c NFS: Fix dentry revalidation for NFSv4 referrals and mountpoint crossings 2008-03-07 14:35:41 -05:00
direct.c Merge branch 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc 2008-02-01 11:45:47 +11:00
file.c NFS: nfs_write_end clean up 2008-01-30 02:06:02 -05:00
getroot.c Convert ERR_PTR(PTR_ERR(p)) instances to ERR_CAST(p) 2008-02-07 08:42:26 -08:00
idmap.c nfs: fix sparse warnings 2008-02-20 16:15:44 -05:00
inode.c NFS: Fix the fsid revalidation in nfs_update_inode() 2008-03-07 14:35:37 -05:00
internal.h NFS: use new LSM interfaces to explicitly set mount options 2008-03-06 08:40:59 +11:00
iostat.h NFSv4: Fix an oops in nfs4_fill_super 2006-03-20 13:44:48 -05:00
Makefile [NFS] [PATCH] nfs: tiny makefile cleanup 2007-10-09 17:15:36 -04:00
mount_clnt.c NFS: Switch from intr mount option to TASK_KILLABLE 2007-12-06 17:40:25 -05:00
namespace.c Introduce path_put() 2008-02-14 21:13:33 -08:00
nfs2xdr.c NFS: Use unsigned intermediates for manipulating header lengths (NFSv2 XDR) 2008-01-30 02:05:44 -05:00
nfs3acl.c NFS: Remove nfs_begin_data_update/nfs_end_data_update 2007-10-09 17:19:53 -04:00
nfs3proc.c Merge branch 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc 2008-02-01 11:45:47 +11:00
nfs3xdr.c NFS: Use unsigned intermediates for manipulating header lengths (NFSv3 XDR) 2008-01-30 02:05:44 -05:00
nfs4_fs.h NFSv4: Give the lock stateid its own sequence queue 2008-01-10 13:35:32 -08:00
nfs4namespace.c NFS: Adjust nfs_clone_mount structure to store "struct sockaddr *" 2008-01-30 02:05:56 -05:00
nfs4proc.c Embed a struct path into struct nameidata instead of nd->{dentry,mnt} 2008-02-14 21:13:33 -08:00
nfs4renewd.c NFSv4: Fix circular locking dependency in nfs4_kill_renewd 2008-01-03 09:37:16 -05:00
nfs4state.c nfs: fix sparse warnings 2008-02-20 16:15:44 -05:00
nfs4xdr.c NFS: Ensure NFSv4 SETCLIENTID send buffer is large enough 2008-01-30 02:05:51 -05:00
nfsroot.c NFS: Switch from intr mount option to TASK_KILLABLE 2007-12-06 17:40:25 -05:00
pagelist.c Merge branch 'task_killable' of git://git.kernel.org/pub/scm/linux/kernel/git/willy/misc 2008-02-01 11:45:47 +11:00
proc.c NLM/NFS: Use cached nlm_host when calling nlmclnt_proc() 2008-01-30 02:06:07 -05:00
read.c nfs: don't ignore return value from nfs_pageio_add_request 2008-03-19 17:59:02 -04:00
super.c NFS: use new LSM interfaces to explicitly set mount options 2008-03-06 08:40:59 +11:00
symlink.c header cleaning: don't include smp_lock.h when not used 2007-05-08 11:15:07 -07:00
sysctl.c [PATCH] nfs: fix congestion control 2007-03-16 19:25:05 -07:00
unlink.c NFS/SUNRPC: Convert all users of rpc_call_setup() 2008-01-30 02:05:32 -05:00
write.c nfs: don't ignore return value from nfs_pageio_add_request 2008-03-19 17:59:02 -04:00