From 31c8f996dfcab30d6db6c56247cb7cbdb7e3c1db Mon Sep 17 00:00:00 2001 From: Vladislav Bolkhovitin Date: Thu, 22 Jan 2015 05:13:59 +0000 Subject: [PATCH] scst_vdisk: Fix zero-copy read for tmpfs For some filesystems, e.g. tmpfs, address_space.readpage is NULL. Disable zero-copy reading for such filesystems. See also shmem_aops in mm/shmem.c. See also inode_init_always() and empty_aops in fs/inode.c. This patch avoids that the following call trace is triggered: BUG: unable to handle kernel NULL pointer dereference at (null) Call Trace: [] prepare_read+0x106/0x1d0 [scst_vdisk] [] fileio_alloc_data_buf+0xf0/0x330 [scst_vdisk] [] scst_prepare_space+0x9b/0x6e0 [scst] [] scst_process_active_cmd+0x545/0x840 [scst] [] scst_cmd_init_done+0x302/0x5d0 [scst] [] scst_cmd_init_stage1_done.constprop.37+0x12/0x20 [iscsi_scst] [] scsi_cmnd_start+0x25a/0x550 [iscsi_scst] [] cmnd_rx_start+0x148/0x1a0 [iscsi_scst] [] process_read_io+0x3b8/0x800 [iscsi_scst] [] scst_do_job_rd+0xc7/0x220 [iscsi_scst] [] istrd+0x16d/0x2e0 [iscsi_scst] [] kthread+0xed/0x110 [] ret_from_fork+0x7c/0xb0 Signed-off-by: Bart Van Assche git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@5988 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst/src/dev_handlers/scst_vdisk.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scst/src/dev_handlers/scst_vdisk.c b/scst/src/dev_handlers/scst_vdisk.c index 460050c5a..165ec00cc 100644 --- a/scst/src/dev_handlers/scst_vdisk.c +++ b/scst/src/dev_handlers/scst_vdisk.c @@ -2777,7 +2777,8 @@ static int fileio_alloc_data_buf(struct scst_cmd *cmd) * copy. */ if (cmd->tgt_i_data_buf_alloced || - (cmd->data_direction & SCST_DATA_READ) == 0) { + (cmd->data_direction & SCST_DATA_READ) == 0 || + (virt_dev->fd && !virt_dev->fd->f_mapping->a_ops->readpage)) { p->use_zero_copy = false; } if (!p->use_zero_copy)