linux/fs/nfs
Nick Piggin 54566b2c15 fs: symlink write_begin allocation context fix
With the write_begin/write_end aops, page_symlink was broken because it
could no longer pass a GFP_NOFS type mask into the point where the
allocations happened.  They are done in write_begin, which would always
assume that the filesystem can be entered from reclaim.  This bug could
cause filesystem deadlocks.

The funny thing with having a gfp_t mask there is that it doesn't really
allow the caller to arbitrarily tinker with the context in which it can be
called.  It couldn't ever be GFP_ATOMIC, for example, because it needs to
take the page lock.  The only thing any callers care about is __GFP_FS
anyway, so turn that into a single flag.

Add a new flag for write_begin, AOP_FLAG_NOFS.  Filesystems can now act on
this flag in their write_begin function.  Change __grab_cache_page to
accept a nofs argument as well, to honour that flag (while we're there,
change the name to grab_cache_page_write_begin which is more instructive
and does away with random leading underscores).

This is really a more flexible way to go in the end anyway -- if a
filesystem happens to want any extra allocations aside from the pagecache
ones in ints write_begin function, it may now use GFP_KERNEL (rather than
GFP_NOFS) for common case allocations (eg.  ocfs2_alloc_write_ctxt, for a
random example).

[kosaki.motohiro@jp.fujitsu.com: fix ubifs]
[kosaki.motohiro@jp.fujitsu.com: fix fuse]
Signed-off-by: Nick Piggin <npiggin@suse.de>
Reviewed-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: <stable@kernel.org>		[2.6.28.x]
Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
[ Cleaned up the calling convention: just pass in the AOP flags
  untouched to the grab_cache_page_write_begin() function.  That
  just simplifies everybody, and may even allow future expansion of the
  logic.   - Linus ]
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2009-01-04 13:33:20 -08:00
..
callback_proc.c nfs: replace remaining __FUNCTION__ occurrences 2008-05-16 09:43:29 -07:00
callback_xdr.c nfs: replace remaining __FUNCTION__ occurrences 2008-05-16 09:43:29 -07:00
callback.c rpc: allow gss callbacks to client 2008-12-23 16:18:34 -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 NFSv4: Fix up delegation callbacks 2008-12-23 15:21:53 -05:00
delegation.c NFSv4: Convert delegation->type field to fmode_t 2008-12-23 15:21:53 -05:00
delegation.h NFSv4: Convert delegation->type field to fmode_t 2008-12-23 15:21:53 -05:00
dir.c optimize attribute timeouts for "noac" and "actimeo=0" 2008-12-23 15:21:56 -05:00
direct.c NFS: Use NFSDBG_FILE for all fops 2008-07-09 12:09:04 -04:00
file.c fs: symlink write_begin allocation context fix 2009-01-04 13:33:20 -08:00
getroot.c [PATCH] switch all filesystems over to d_obtain_alias 2008-10-23 05:13:01 -04:00
idmap.c nfs: fix sparse warnings 2008-02-20 16:15:44 -05:00
inode.c optimize attribute timeouts for "noac" and "actimeo=0" 2008-12-23 15:21:56 -05:00
internal.h NFS: "[no]resvport" mount option changes mountd client too 2008-12-23 15:21:37 -05:00
iostat.h NFS: Fix a warning in nfs4_async_handle_error 2008-07-09 12:09:18 -04:00
Makefile NFS: Always enable NFS direct I/O 2008-03-19 18:00:34 -04:00
mount_clnt.c NFS: "[no]resvport" mount option changes mountd client too 2008-12-23 15:21:37 -05:00
namespace.c nfs: BUG_ON in nfs_follow_mountpoint 2008-10-07 18:15:16 -04:00
nfs2xdr.c nfs: return negative error value from nfs{,4}_stat_to_errno 2008-04-19 16:54:47 -04:00
nfs3acl.c NFS: missing nfs_fattr_init in nfs3_proc_getacl and nfs3_proc_setacls (resend #2) 2008-10-07 18:16:22 -04:00
nfs3proc.c nfs: authenticated deep mounting 2008-10-07 18:16:22 -04:00
nfs3xdr.c nfs: return negative error value from nfs{,4}_stat_to_errno 2008-04-19 16:54:47 -04:00
nfs4_fs.h fs/nfs/nfs4proc.c: make nfs4_map_errors() static 2008-12-30 16:35:55 -05:00
nfs4namespace.c nfs: Fix misparsing of nfsv4 fs_locations attribute 2008-10-07 18:17:47 -04:00
nfs4proc.c fs/nfs/nfs4proc.c: make nfs4_map_errors() static 2008-12-30 16:35:55 -05:00
nfs4renewd.c NFSv4: Return unreferenced delegations more promptly 2008-12-23 15:21:52 -05:00
nfs4state.c NFSv4: Convert the open and close ops to use fmode 2008-12-23 15:21:56 -05:00
nfs4xdr.c NFS: remove unused status from encode routines 2008-12-23 16:06:18 -05:00
nfsroot.c Merge branch 'devel' into next 2008-12-30 16:51:43 -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 nfs: authenticated deep mounting 2008-10-07 18:16:22 -04:00
read.c nfs: remove redundant tests on reading new pages 2008-12-23 15:21:30 -05:00
super.c Merge branch 'devel' into next 2008-12-30 16:51:43 -05:00
symlink.c nfs: remove unnecessary NFS_NEED_* defines 2008-04-23 16:13:37 -04:00
sysctl.c
unlink.c NFS: Clean up nfs_sb_active/nfs_sb_deactive 2008-10-06 20:08:26 -04:00
write.c NFS: Don't use range_cyclic for data integrity syncs 2008-10-07 18:19:05 -04:00