]> git.proxmox.com Git - mirror_spl-debian.git/commit - module/spl/spl-vnode.c
Fix stack overflow in vn_rdwr() due to memory reclaim
authorLi Wei <W.Li@Sun.COM>
Thu, 12 Aug 2010 16:24:31 +0000 (09:24 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 12 Aug 2010 16:34:33 +0000 (09:34 -0700)
commit4be55565fe550febc92af2e26db7d5125f58d3b5
treec57c236c2c7e499939f4b5f0815cac34ea2d49eb
parent46aa7b3939bbbac86d2a4cfc556b33398ec12d08
Fix stack overflow in vn_rdwr() due to memory reclaim

Unless __GFP_IO and __GFP_FS are removed from the file mapping gfp
mask we may enter memory reclaim during IO.  In this case shrink_slab()
entered another file system which is notoriously hungry for stack.
This additional stack usage may cause a stack overflow.  This patch
removes __GFP_IO and __GFP_FS from the mapping gfp mask of each file
during vn_open() to avoid any reclaim in the vn_rdwr() IO path.  The
original mask is then restored at vn_close() time.  Hats off to the
loop driver which does something similiar for the same reason.

  [...]
  shrink_slab+0xdc/0x153
  try_to_free_pages+0x1da/0x2d7
  __alloc_pages+0x1d7/0x2da
  do_generic_mapping_read+0x2c9/0x36f
  file_read_actor+0x0/0x145
  __generic_file_aio_read+0x14f/0x19b
  generic_file_aio_read+0x34/0x39
  do_sync_read+0xc7/0x104
  vfs_read+0xcb/0x171
  :spl:vn_rdwr+0x2b8/0x402
  :zfs:vdev_file_io_start+0xad/0xe1
  [...]

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
include/sys/vnode.h
module/spl/spl-vnode.c