[SCSI] aacraid: Add timeout for events
authorMark Haverkamp <markh@osdl.org>
Mon, 27 Mar 2006 17:43:55 +0000 (09:43 -0800)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Thu, 13 Apr 2006 15:13:18 +0000 (10:13 -0500)
Received from Mark Salyzyn

Plug and play actions resulting from event sequences shall time out if
they take longer than 30 seconds to complete.

Signed-off-by: Mark Haverkamp <markh@osdl.org>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/commsup.c

index 51c96ca..c251789 100644 (file)
@@ -788,6 +788,7 @@ struct fsa_dev_info {
        u64             size;
        u32             type;
        u32             config_waiting_on;
+       unsigned long   config_waiting_stamp;
        u16             queue_depth;
        u8              config_needed;
        u8              valid;
index c7f80ec..bed4e2d 100644 (file)
@@ -784,6 +784,7 @@ void aac_printf(struct aac_dev *dev, u32 val)
  *     dispatches it to the appropriate routine for handling.
  */
 
+#define AIF_SNIFF_TIMEOUT      (30*HZ)
 static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
 {
        struct hw_fib * hw_fib = fibptr->hw_fib;
@@ -837,6 +838,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
                                if (device) {
                                        dev->fsa_dev[container].config_needed = CHANGE;
                                        dev->fsa_dev[container].config_waiting_on = AifEnConfigChange;
+                                       dev->fsa_dev[container].config_waiting_stamp = jiffies;
                                        scsi_device_put(device);
                                }
                        }
@@ -849,13 +851,15 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
                if (container != (u32)-1) {
                        if (container >= dev->maximum_num_containers)
                                break;
-                       if (dev->fsa_dev[container].config_waiting_on ==
-                           le32_to_cpu(*(u32 *)aifcmd->data))
+                       if ((dev->fsa_dev[container].config_waiting_on ==
+                           le32_to_cpu(*(u32 *)aifcmd->data)) &&
+                        time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT))
                                dev->fsa_dev[container].config_waiting_on = 0;
                } else for (container = 0;
                    container < dev->maximum_num_containers; ++container) {
-                       if (dev->fsa_dev[container].config_waiting_on ==
-                           le32_to_cpu(*(u32 *)aifcmd->data))
+                       if ((dev->fsa_dev[container].config_waiting_on ==
+                           le32_to_cpu(*(u32 *)aifcmd->data)) &&
+                        time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT))
                                dev->fsa_dev[container].config_waiting_on = 0;
                }
                break;
@@ -872,6 +876,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
                        dev->fsa_dev[container].config_needed = ADD;
                        dev->fsa_dev[container].config_waiting_on =
                                AifEnConfigChange;
+                       dev->fsa_dev[container].config_waiting_stamp = jiffies;
                        break;
 
                /*
@@ -884,6 +889,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
                        dev->fsa_dev[container].config_needed = DELETE;
                        dev->fsa_dev[container].config_waiting_on =
                                AifEnConfigChange;
+                       dev->fsa_dev[container].config_waiting_stamp = jiffies;
                        break;
 
                /*
@@ -894,11 +900,13 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
                        container = le32_to_cpu(((u32 *)aifcmd->data)[1]);
                        if (container >= dev->maximum_num_containers)
                                break;
-                       if (dev->fsa_dev[container].config_waiting_on)
+                       if (dev->fsa_dev[container].config_waiting_on &&
+                        time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT))
                                break;
                        dev->fsa_dev[container].config_needed = CHANGE;
                        dev->fsa_dev[container].config_waiting_on =
                                AifEnConfigChange;
+                       dev->fsa_dev[container].config_waiting_stamp = jiffies;
                        break;
 
                case AifEnConfigChange:
@@ -913,13 +921,15 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
                if (container != (u32)-1) {
                        if (container >= dev->maximum_num_containers)
                                break;
-                       if (dev->fsa_dev[container].config_waiting_on ==
-                           le32_to_cpu(*(u32 *)aifcmd->data))
+                       if ((dev->fsa_dev[container].config_waiting_on ==
+                           le32_to_cpu(*(u32 *)aifcmd->data)) &&
+                        time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT))
                                dev->fsa_dev[container].config_waiting_on = 0;
                } else for (container = 0;
                    container < dev->maximum_num_containers; ++container) {
-                       if (dev->fsa_dev[container].config_waiting_on ==
-                           le32_to_cpu(*(u32 *)aifcmd->data))
+                       if ((dev->fsa_dev[container].config_waiting_on ==
+                           le32_to_cpu(*(u32 *)aifcmd->data)) &&
+                        time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT))
                                dev->fsa_dev[container].config_waiting_on = 0;
                }
                break;
@@ -946,6 +956,8 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
                                dev->fsa_dev[container].config_waiting_on =
                                        AifEnContainerChange;
                                dev->fsa_dev[container].config_needed = ADD;
+                               dev->fsa_dev[container].config_waiting_stamp =
+                                       jiffies;
                        }
                }
                if ((((u32 *)aifcmd->data)[1] == cpu_to_le32(AifJobCtrZero))
@@ -961,6 +973,8 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
                                dev->fsa_dev[container].config_waiting_on =
                                        AifEnContainerChange;
                                dev->fsa_dev[container].config_needed = DELETE;
+                               dev->fsa_dev[container].config_waiting_stamp =
+                                       jiffies;
                        }
                }
                break;
@@ -969,8 +983,9 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
        device_config_needed = NOTHING;
        for (container = 0; container < dev->maximum_num_containers;
            ++container) {
-               if ((dev->fsa_dev[container].config_waiting_on == 0)
-                && (dev->fsa_dev[container].config_needed != NOTHING)) {
+               if ((dev->fsa_dev[container].config_waiting_on == 0) &&
+                       (dev->fsa_dev[container].config_needed != NOTHING) &&
+                       time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) {
                        device_config_needed =
                                dev->fsa_dev[container].config_needed;
                        dev->fsa_dev[container].config_needed = NOTHING;