From 95ecf45c89905ababca38a0293a37a40bf2fce6d Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 7 Jul 2014 16:19:42 -0700 Subject: [PATCH] 3.14-stable patches added patches: sym53c8xx_2-set-did_requeue-return-code-when-aborting-squeue.patch --- ...roc-stat-convert-to-single_open_size.patch | 80 ------------------- queue-3.14/series | 2 +- ...eue-return-code-when-aborting-squeue.patch | 56 +++++++++++++ 3 files changed, 57 insertions(+), 81 deletions(-) delete mode 100644 queue-3.14/proc-stat-convert-to-single_open_size.patch create mode 100644 queue-3.14/sym53c8xx_2-set-did_requeue-return-code-when-aborting-squeue.patch diff --git a/queue-3.14/proc-stat-convert-to-single_open_size.patch b/queue-3.14/proc-stat-convert-to-single_open_size.patch deleted file mode 100644 index f20c81645a8..00000000000 --- a/queue-3.14/proc-stat-convert-to-single_open_size.patch +++ /dev/null @@ -1,80 +0,0 @@ -From f74373a5cc7a0155d232c4e999648c7a95435bb2 Mon Sep 17 00:00:00 2001 -From: Heiko Carstens -Date: Wed, 2 Jul 2014 15:22:37 -0700 -Subject: /proc/stat: convert to single_open_size() - -From: Heiko Carstens - -commit f74373a5cc7a0155d232c4e999648c7a95435bb2 upstream. - -These two patches are supposed to "fix" failed order-4 memory -allocations which have been observed when reading /proc/stat. The -problem has been observed on s390 as well as on x86. - -To address the problem change the seq_file memory allocations to -fallback to use vmalloc, so that allocations also work if memory is -fragmented. - -This approach seems to be simpler and less intrusive than changing -/proc/stat to use an interator. Also it "fixes" other users as well, -which use seq_file's single_open() interface. - -This patch (of 2): - -Use seq_file's single_open_size() to preallocate a buffer that is large -enough to hold the whole output, instead of open coding it. Also -calculate the requested size using the number of online cpus instead of -possible cpus, since the size of the output only depends on the number -of online cpus. - -Signed-off-by: Heiko Carstens -Acked-by: David Rientjes -Cc: Ian Kent -Cc: Hendrik Brueckner -Cc: Thorsten Diehl -Cc: Andrea Righi -Cc: Christoph Hellwig -Cc: Al Viro -Cc: Stefan Bader -Signed-off-by: Andrew Morton -Signed-off-by: Linus Torvalds -Signed-off-by: Greg Kroah-Hartman - ---- - fs/proc/stat.c | 22 ++-------------------- - 1 file changed, 2 insertions(+), 20 deletions(-) - ---- a/fs/proc/stat.c -+++ b/fs/proc/stat.c -@@ -184,29 +184,11 @@ static int show_stat(struct seq_file *p, - - static int stat_open(struct inode *inode, struct file *file) - { -- size_t size = 1024 + 128 * num_possible_cpus(); -- char *buf; -- struct seq_file *m; -- int res; -+ size_t size = 1024 + 128 * num_online_cpus(); - - /* minimum size to display an interrupt count : 2 bytes */ - size += 2 * nr_irqs; -- -- /* don't ask for more than the kmalloc() max size */ -- if (size > KMALLOC_MAX_SIZE) -- size = KMALLOC_MAX_SIZE; -- buf = kmalloc(size, GFP_KERNEL); -- if (!buf) -- return -ENOMEM; -- -- res = single_open(file, show_stat, NULL); -- if (!res) { -- m = file->private_data; -- m->buf = buf; -- m->size = ksize(buf); -- } else -- kfree(buf); -- return res; -+ return single_open_size(file, show_stat, NULL, size); - } - - static const struct file_operations proc_stat_operations = { diff --git a/queue-3.14/series b/queue-3.14/series index 996f6ae1aca..77fa350bd56 100644 --- a/queue-3.14/series +++ b/queue-3.14/series @@ -74,7 +74,6 @@ tracing-remove-ftrace_stop-start-from-reading-the-trace-file.patch md-flush-writes-before-starting-a-recovery.patch irqchip-spear_shirq-fix-interrupt-offset.patch mm-page_alloc-fix-cma-area-initialisation-when-pageblock-max_order.patch -proc-stat-convert-to-single_open_size.patch mlx4_core-fix-incorrect-flags1-bitmap-test-in-mlx4_query_func_cap.patch clk-qcom-fix-clk_rcg2_is_enabled-check.patch clk-qcom-fix-mmcc-8974-s-pll-configurations.patch @@ -92,3 +91,4 @@ arch-unicore32-mm-alignment.c-include-asm-pgtable.h-to-avoid-compiling-error.pat drivers-video-fbdev-fb-puv3.c-add-header-files-for-function-unifb_mmap.patch mm-numa-remove-bug_on-in-__handle_mm_fault.patch slab-fix-oops-when-reading-proc-slab_allocators.patch +sym53c8xx_2-set-did_requeue-return-code-when-aborting-squeue.patch diff --git a/queue-3.14/sym53c8xx_2-set-did_requeue-return-code-when-aborting-squeue.patch b/queue-3.14/sym53c8xx_2-set-did_requeue-return-code-when-aborting-squeue.patch new file mode 100644 index 00000000000..023ee2ca3e5 --- /dev/null +++ b/queue-3.14/sym53c8xx_2-set-did_requeue-return-code-when-aborting-squeue.patch @@ -0,0 +1,56 @@ +From fd1232b214af43a973443aec6a2808f16ee5bf70 Mon Sep 17 00:00:00 2001 +From: Mikulas Patocka +Date: Tue, 8 Apr 2014 21:52:05 -0400 +Subject: sym53c8xx_2: Set DID_REQUEUE return code when aborting squeue + +From: Mikulas Patocka + +commit fd1232b214af43a973443aec6a2808f16ee5bf70 upstream. + +This patch fixes I/O errors with the sym53c8xx_2 driver when the disk +returns QUEUE FULL status. + +When the controller encounters an error (including QUEUE FULL or BUSY +status), it aborts all not yet submitted requests in the function +sym_dequeue_from_squeue. + +This function aborts them with DID_SOFT_ERROR. + +If the disk has full tag queue, the request that caused the overflow is +aborted with QUEUE FULL status (and the scsi midlayer properly retries +it until it is accepted by the disk), but the sym53c8xx_2 driver aborts +the following requests with DID_SOFT_ERROR --- for them, the midlayer +does just a few retries and then signals the error up to sd. + +The result is that disk returning QUEUE FULL causes request failures. + +The error was reproduced on 53c895 with COMPAQ BD03685A24 disk +(rebranded ST336607LC) with command queue 48 or 64 tags. The disk has +64 tags, but under some access patterns it return QUEUE FULL when there +are less than 64 pending tags. The SCSI specification allows returning +QUEUE FULL anytime and it is up to the host to retry. + +Signed-off-by: Mikulas Patocka +Cc: Matthew Wilcox +Cc: James Bottomley +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/scsi/sym53c8xx_2/sym_hipd.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/scsi/sym53c8xx_2/sym_hipd.c ++++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c +@@ -3000,7 +3000,11 @@ sym_dequeue_from_squeue(struct sym_hcb * + if ((target == -1 || cp->target == target) && + (lun == -1 || cp->lun == lun) && + (task == -1 || cp->tag == task)) { ++#ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING + sym_set_cam_status(cp->cmd, DID_SOFT_ERROR); ++#else ++ sym_set_cam_status(cp->cmd, DID_REQUEUE); ++#endif + sym_remque(&cp->link_ccbq); + sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq); + } -- 2.47.3