[PATCH 2/2] [SCSI] Print only 5 messages "rejecting I/O to dead device"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Also set to 5 printing of "rejecting I/O to device being
removed".  See commit ''Print only a single message
"rejecting I/O to device being removed"''.

When we do hot-unplug, those messages are printed so much
and so often that they overwhelm the CPU and cause soft
lockup.

Signed-off-by: Luben Tuikov <ltuikov@xxxxxxxxx>
---
 drivers/scsi/scsi_lib.c    |   11 +++++++----
 drivers/scsi/scsi_scan.c   |    3 ++-
 include/scsi/scsi_device.h |    5 +++--
 3 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 802132e..8b208b4 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1122,8 +1122,11 @@ static int scsi_prep_fn(struct request_q
 		if (sdev->sdev_state == SDEV_DEL) {
 			/* Device is fully deleted, no commands
 			 * at all allowed down */
-			sdev_printk(KERN_ERR, sdev,
-				    "rejecting I/O to dead device\n");
+			if (sdev->num_dead_messages > 0) {
+				sdev->num_dead_messages--;
+				sdev_printk(KERN_ERR, sdev,
+					    "rejecting I/O to dead device\n");
+			}
 			goto kill;
 		}
 		/* OK, we only allow special commands (i.e. not
@@ -1149,8 +1152,8 @@ static int scsi_prep_fn(struct request_q
 			    specials_only == SDEV_BLOCK)
 				goto defer;
 
-			if (sdev->num_rej_messages > 0) {
-				sdev->num_rej_messages--;
+			if (sdev->num_remv_messages > 0) {
+				sdev->num_remv_messages--;
 				sdev_printk(KERN_ERR, sdev,
 					    "rejecting I/O to device "
 					    "being removed\n");
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index aa374ed..c82ea82 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -169,7 +169,8 @@ static struct scsi_device *scsi_alloc_sd
 	INIT_LIST_HEAD(&sdev->cmd_list);
 	INIT_LIST_HEAD(&sdev->starved_entry);
 	spin_lock_init(&sdev->list_lock);
-	sdev->num_rej_messages = SCSI_DEV_NUM_REJ_MESSAGES;
+	sdev->num_remv_messages = SCSI_DEV_NUM_MESSAGES;
+	sdev->num_dead_messages = SCSI_DEV_NUM_MESSAGES;
 
 	sdev->sdev_gendev.parent = get_device(&starget->dev);
 	sdev->sdev_target = starget;
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index 14bc5ec..6e51f56 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -140,8 +140,9 @@ struct scsi_device {
 
 	struct execute_work	ew; /* used to get process context on put */
 
-#define SCSI_DEV_NUM_REJ_MESSAGES 1
-	int	num_rej_messages;
+#define SCSI_DEV_NUM_MESSAGES	5
+	int	num_remv_messages;
+	int	num_dead_messages;
 
 	enum scsi_device_state sdev_state;
 	unsigned long		sdev_data[0];
-- 
1.4.3.3.g6cec


-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux