diff options
author | Li Wei <[email protected]> | 2010-08-12 09:24:31 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2010-08-12 09:34:33 -0700 |
commit | 4be55565fe550febc92af2e26db7d5125f58d3b5 (patch) | |
tree | c57c236c2c7e499939f4b5f0815cac34ea2d49eb /include | |
parent | 46aa7b3939bbbac86d2a4cfc556b33398ec12d08 (diff) |
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 <[email protected]>
Diffstat (limited to 'include')
-rw-r--r-- | include/sys/vnode.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/include/sys/vnode.h b/include/sys/vnode.h index 09d843366..104e65d15 100644 --- a/include/sys/vnode.h +++ b/include/sys/vnode.h @@ -180,6 +180,7 @@ typedef struct vnode { struct stdata *v_stream; /* associated stream */ enum vtype v_type; /* vnode type */ dev_t v_rdev; /* device (VCHR, VBLK) */ + gfp_t v_gfp_mask; /* original mapping gfp mask */ } vnode_t; typedef struct vn_file { |