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:
 [<ffffffffa0547d66>] prepare_read+0x106/0x1d0 [scst_vdisk]
 [<ffffffffa0547f20>] fileio_alloc_data_buf+0xf0/0x330 [scst_vdisk]
 [<ffffffffa046fc9b>] scst_prepare_space+0x9b/0x6e0 [scst]
 [<ffffffffa047d4d5>] scst_process_active_cmd+0x545/0x840 [scst]
 [<ffffffffa047dad2>] scst_cmd_init_done+0x302/0x5d0 [scst]
 [<ffffffffa0563ab2>] scst_cmd_init_stage1_done.constprop.37+0x12/0x20 [iscsi_scst]
 [<ffffffffa056a9ea>] scsi_cmnd_start+0x25a/0x550 [iscsi_scst]
 [<ffffffffa056b4a8>] cmnd_rx_start+0x148/0x1a0 [iscsi_scst]
 [<ffffffffa056e4f8>] process_read_io+0x3b8/0x800 [iscsi_scst]
 [<ffffffffa056ea07>] scst_do_job_rd+0xc7/0x220 [iscsi_scst]
 [<ffffffffa056efed>] istrd+0x16d/0x2e0 [iscsi_scst]
 [<ffffffff81079efd>] kthread+0xed/0x110
 [<ffffffff817227fc>] ret_from_fork+0x7c/0xb0

Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>



git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@5988 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
Vladislav Bolkhovitin
2015-01-22 05:13:59 +00:00
parent fdc6cdf1ed
commit 31c8f996df

View File

@@ -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)