Commit 31876f32 authored by Mark Haverkamp's avatar Mark Haverkamp Committed by James Bottomley

[SCSI] aacraid: Add timeout for events

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: default avatarMark Haverkamp <markh@osdl.org>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 77d644d4
...@@ -788,6 +788,7 @@ struct fsa_dev_info { ...@@ -788,6 +788,7 @@ struct fsa_dev_info {
u64 size; u64 size;
u32 type; u32 type;
u32 config_waiting_on; u32 config_waiting_on;
unsigned long config_waiting_stamp;
u16 queue_depth; u16 queue_depth;
u8 config_needed; u8 config_needed;
u8 valid; u8 valid;
......
...@@ -784,6 +784,7 @@ void aac_printf(struct aac_dev *dev, u32 val) ...@@ -784,6 +784,7 @@ void aac_printf(struct aac_dev *dev, u32 val)
* dispatches it to the appropriate routine for handling. * 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) static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
{ {
struct hw_fib * hw_fib = fibptr->hw_fib; struct hw_fib * hw_fib = fibptr->hw_fib;
...@@ -837,6 +838,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) ...@@ -837,6 +838,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
if (device) { if (device) {
dev->fsa_dev[container].config_needed = CHANGE; dev->fsa_dev[container].config_needed = CHANGE;
dev->fsa_dev[container].config_waiting_on = AifEnConfigChange; dev->fsa_dev[container].config_waiting_on = AifEnConfigChange;
dev->fsa_dev[container].config_waiting_stamp = jiffies;
scsi_device_put(device); scsi_device_put(device);
} }
} }
...@@ -849,13 +851,15 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) ...@@ -849,13 +851,15 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
if (container != (u32)-1) { if (container != (u32)-1) {
if (container >= dev->maximum_num_containers) if (container >= dev->maximum_num_containers)
break; break;
if (dev->fsa_dev[container].config_waiting_on == if ((dev->fsa_dev[container].config_waiting_on ==
le32_to_cpu(*(u32 *)aifcmd->data)) 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; dev->fsa_dev[container].config_waiting_on = 0;
} else for (container = 0; } else for (container = 0;
container < dev->maximum_num_containers; ++container) { container < dev->maximum_num_containers; ++container) {
if (dev->fsa_dev[container].config_waiting_on == if ((dev->fsa_dev[container].config_waiting_on ==
le32_to_cpu(*(u32 *)aifcmd->data)) 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; dev->fsa_dev[container].config_waiting_on = 0;
} }
break; break;
...@@ -872,6 +876,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) ...@@ -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_needed = ADD;
dev->fsa_dev[container].config_waiting_on = dev->fsa_dev[container].config_waiting_on =
AifEnConfigChange; AifEnConfigChange;
dev->fsa_dev[container].config_waiting_stamp = jiffies;
break; break;
/* /*
...@@ -884,6 +889,7 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) ...@@ -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_needed = DELETE;
dev->fsa_dev[container].config_waiting_on = dev->fsa_dev[container].config_waiting_on =
AifEnConfigChange; AifEnConfigChange;
dev->fsa_dev[container].config_waiting_stamp = jiffies;
break; break;
/* /*
...@@ -894,11 +900,13 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) ...@@ -894,11 +900,13 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
container = le32_to_cpu(((u32 *)aifcmd->data)[1]); container = le32_to_cpu(((u32 *)aifcmd->data)[1]);
if (container >= dev->maximum_num_containers) if (container >= dev->maximum_num_containers)
break; 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; break;
dev->fsa_dev[container].config_needed = CHANGE; dev->fsa_dev[container].config_needed = CHANGE;
dev->fsa_dev[container].config_waiting_on = dev->fsa_dev[container].config_waiting_on =
AifEnConfigChange; AifEnConfigChange;
dev->fsa_dev[container].config_waiting_stamp = jiffies;
break; break;
case AifEnConfigChange: case AifEnConfigChange:
...@@ -913,13 +921,15 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) ...@@ -913,13 +921,15 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
if (container != (u32)-1) { if (container != (u32)-1) {
if (container >= dev->maximum_num_containers) if (container >= dev->maximum_num_containers)
break; break;
if (dev->fsa_dev[container].config_waiting_on == if ((dev->fsa_dev[container].config_waiting_on ==
le32_to_cpu(*(u32 *)aifcmd->data)) 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; dev->fsa_dev[container].config_waiting_on = 0;
} else for (container = 0; } else for (container = 0;
container < dev->maximum_num_containers; ++container) { container < dev->maximum_num_containers; ++container) {
if (dev->fsa_dev[container].config_waiting_on == if ((dev->fsa_dev[container].config_waiting_on ==
le32_to_cpu(*(u32 *)aifcmd->data)) 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; dev->fsa_dev[container].config_waiting_on = 0;
} }
break; break;
...@@ -946,6 +956,8 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) ...@@ -946,6 +956,8 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
dev->fsa_dev[container].config_waiting_on = dev->fsa_dev[container].config_waiting_on =
AifEnContainerChange; AifEnContainerChange;
dev->fsa_dev[container].config_needed = ADD; dev->fsa_dev[container].config_needed = ADD;
dev->fsa_dev[container].config_waiting_stamp =
jiffies;
} }
} }
if ((((u32 *)aifcmd->data)[1] == cpu_to_le32(AifJobCtrZero)) 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) ...@@ -961,6 +973,8 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
dev->fsa_dev[container].config_waiting_on = dev->fsa_dev[container].config_waiting_on =
AifEnContainerChange; AifEnContainerChange;
dev->fsa_dev[container].config_needed = DELETE; dev->fsa_dev[container].config_needed = DELETE;
dev->fsa_dev[container].config_waiting_stamp =
jiffies;
} }
} }
break; break;
...@@ -969,8 +983,9 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr) ...@@ -969,8 +983,9 @@ static void aac_handle_aif(struct aac_dev * dev, struct fib * fibptr)
device_config_needed = NOTHING; device_config_needed = NOTHING;
for (container = 0; container < dev->maximum_num_containers; for (container = 0; container < dev->maximum_num_containers;
++container) { ++container) {
if ((dev->fsa_dev[container].config_waiting_on == 0) if ((dev->fsa_dev[container].config_waiting_on == 0) &&
&& (dev->fsa_dev[container].config_needed != NOTHING)) { (dev->fsa_dev[container].config_needed != NOTHING) &&
time_before(jiffies, dev->fsa_dev[container].config_waiting_stamp + AIF_SNIFF_TIMEOUT)) {
device_config_needed = device_config_needed =
dev->fsa_dev[container].config_needed; dev->fsa_dev[container].config_needed;
dev->fsa_dev[container].config_needed = NOTHING; dev->fsa_dev[container].config_needed = NOTHING;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment