kernel_optimize_test/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
callback_xdr.c
callback.c rpc: allow gss callbacks to client 2008-12-23 16:18:34 -05:00
callback.h
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
file.c fs: symlink write_begin allocation context fix 2009-01-04 13:33:20 -08:00
getroot.c
idmap.c
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
Makefile
mount_clnt.c NFS: "[no]resvport" mount option changes mountd client too 2008-12-23 15:21:37 -05:00
namespace.c
nfs2xdr.c
nfs3acl.c
nfs3proc.c
nfs3xdr.c
nfs4_fs.h fs/nfs/nfs4proc.c: make nfs4_map_errors() static 2008-12-30 16:35:55 -05:00
nfs4namespace.c
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
proc.c
read.c
super.c Merge branch 'devel' into next 2008-12-30 16:51:43 -05:00
symlink.c
sysctl.c
unlink.c
write.c