Patch "scsi: fix memory leak with scsi-mq" has been added to the 4.1-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
scsi: fix memory leak with scsi-mq
to the 4.1-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
scsi-fix-memory-leak-with-scsi-mq.patch
and it can be found in the queue-4.1 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
0c958ecc69c277b25f38f72bc6d18ab145e8167cMon Sep 17 00:00:00 2001
From: Tony Battersby <[email protected]>
Date: Thu, 16 Jul 2015 11:40:41 -0400
Subject: scsi: fix memory leak with scsi-mq
From: Tony Battersby <[email protected]>
commit 0c958ecc69c277b25f38f72bc6d18ab145e8167c upstream.
Fix a memory leak with scsi-mq triggered by commands with large data transfer length.
__sg_alloc_table() sets both table->nents and table->orig_nents to the same value. When the scatterlist is DMA-mapped, table->nents is overwritten with the (possibly smaller) size of the DMA-mapped scatterlist, while table->orig_nents retains the original size of the allocated scatterlist. scsi_free_sgtable() should therefore check orig_nents instead of nents, and all code that initializes sdb->table without calling __sg_alloc_table() should set both nents and orig_nents.
--- drivers/scsi/scsi_error.c | 2 +- drivers/scsi/scsi_lib.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/scsi/scsi_error.c +1 -1
@@ -944,7 +944,7 @@ void scsi_eh_prep_cmnd(struct scsi_cmnd scmd->sdb.length); scmd->sdb.table.sgl = &ses->sense_sgl; scmd->sc_data_direction =DMA_FROM_DEVICE ; - scmd->sdb.table.nents =1 ; + scmd->sdb.table.nents = scmd->sdb.table.orig_nents =1 ; scmd->cmnd[0 ] =REQUEST_SENSE ; scmd->cmnd[4 ] = scmd->sdb.length; scmd->cmd_len =COMMAND_SIZE (scmd->cmnd[0 ]);
drivers/scsi/scsi_lib.c +3 -3
@@ -583,7 +583,7 @@ static struct scatterlist *scsi_sg_allocstatic void scsi_free_sgtable (struct scsi_data_buffer *sdb,bool mq) { -if (mq && sdb->table.nents <=SCSI_MAX_SG_SEGMENTS ) +if (mq && sdb->table.orig_nents <=SCSI_MAX_SG_SEGMENTS )return ;__sg_free_table (&sdb->table,SCSI_MAX_SG_SEGMENTS , mq, scsi_sg_free); }
@@ -597,8 +597,8 @@ static int scsi_alloc_sgtable(struct scsif (mq) {if (nents <=SCSI_MAX_SG_SEGMENTS ) { - sdb->table.nents = nents; -sg_init_table (sdb->table.sgl, sdb->table.nents); + sdb->table.nents = sdb->table.orig_nents = nents; +sg_init_table (sdb->table.sgl, nents);return 0 ; } first_chunk = sdb->table.sgl;
Patches currently in stable-queue which might be from [email protected] are
queue-4.1/scsi-fix-memory-leak-with-scsi-mq.patch