[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: Mark Haverkamp <markh@osdl.org> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
committed by
James Bottomley
parent
77d644d4d7
commit
31876f328f
@@ -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)
|
|||||||
* 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user