mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-04 20:19:47 +08:00
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> |
||
|---|---|---|
| .. | ||
| locking/dlm | ||
| acl.c | ||
| acl.h | ||
| bmap.c | ||
| bmap.h | ||
| daemon.c | ||
| daemon.h | ||
| dir.c | ||
| dir.h | ||
| eaops.c | ||
| eaops.h | ||
| eattr.c | ||
| eattr.h | ||
| gfs2.h | ||
| glock.c | ||
| glock.h | ||
| glops.c | ||
| glops.h | ||
| incore.h | ||
| inode.c | ||
| inode.h | ||
| Kconfig | ||
| locking.c | ||
| log.c | ||
| log.h | ||
| lops.c | ||
| lops.h | ||
| main.c | ||
| Makefile | ||
| meta_io.c | ||
| meta_io.h | ||
| mount.c | ||
| mount.h | ||
| ops_address.c | ||
| ops_address.h | ||
| ops_dentry.c | ||
| ops_dentry.h | ||
| ops_export.c | ||
| ops_file.c | ||
| ops_fstype.c | ||
| ops_fstype.h | ||
| ops_inode.c | ||
| ops_inode.h | ||
| ops_super.c | ||
| ops_super.h | ||
| quota.c | ||
| quota.h | ||
| recovery.c | ||
| recovery.h | ||
| rgrp.c | ||
| rgrp.h | ||
| super.c | ||
| super.h | ||
| sys.c | ||
| sys.h | ||
| trans.c | ||
| trans.h | ||
| util.c | ||
| util.h | ||