Skip to contentSkip to conversation

Print only 5 messages "rejecting I/O to dead device"

PATCH In review Luben Tuikov 1 participant 1 message Nov 3, 2006 SCSI

lore
Share & tools
lore
#0 lore raw

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

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.

---
 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(-)
drivers/scsi/scsi_lib.c +7 -4
index 802132e..8b208b4 100644
@@ -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");
drivers/scsi/scsi_scan.c +2 -1
index aa374ed..c82ea82 100644
@@ -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;
include/scsi/scsi_device.h +3 -2
index 14bc5ec..6e51f56 100644
@@ -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];
Signature · 1 line
1.4.3.3.g6cec