Skip to content

Commit

Permalink
lcs: Channel errors drive lcs_recovery which leads to kernel panic.
Browse files Browse the repository at this point in the history
When the lcs irq routine detects channel failures it drives device recovery.
After this event the device is no longer usable for shutdown requests,
because the lcs_irq routine may get wrong channel status information.
In such a case the lcs_irq routine marks the channel in 'error' state.
The channel state comes back to 'running' after restarting the channels.

Signed-off-by: Klaus D. Wacker <[email protected]>
Signed-off-by: Ursula Braun <[email protected]>
Signed-off-by: Jeff Garzik <[email protected]>
  • Loading branch information
Klaus D. Wacker authored and David S. Miller committed Oct 10, 2007
1 parent d8fae9c commit 59579da
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 3 deletions.
11 changes: 8 additions & 3 deletions drivers/s390/net/lcs.c
Original file line number Diff line number Diff line change
Expand Up @@ -1400,11 +1400,14 @@ lcs_irq(struct ccw_device *cdev, unsigned long intparm, struct irb *irb)
PRINT_WARN("check on device %s, dstat=0x%X, cstat=0x%X \n",
cdev->dev.bus_id, dstat, cstat);
if (rc) {
lcs_schedule_recovery(card);
wake_up(&card->wait_q);
return;
channel->state = LCS_CH_STATE_ERROR;
}
}
if (channel->state == LCS_CH_STATE_ERROR) {
lcs_schedule_recovery(card);
wake_up(&card->wait_q);
return;
}
/* How far in the ccw chain have we processed? */
if ((channel->state != LCS_CH_STATE_INIT) &&
(irb->scsw.fctl & SCSW_FCTL_START_FUNC)) {
Expand Down Expand Up @@ -1708,6 +1711,8 @@ lcs_stopcard(struct lcs_card *card)

if (card->read.state != LCS_CH_STATE_STOPPED &&
card->write.state != LCS_CH_STATE_STOPPED &&
card->read.state != LCS_CH_STATE_ERROR &&
card->write.state != LCS_CH_STATE_ERROR &&
card->state == DEV_STATE_UP) {
lcs_clear_multicast_list(card);
rc = lcs_send_stoplan(card,LCS_INITIATOR_TCPIP);
Expand Down
1 change: 1 addition & 0 deletions drivers/s390/net/lcs.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ enum lcs_channel_states {
LCS_CH_STATE_RUNNING,
LCS_CH_STATE_SUSPENDED,
LCS_CH_STATE_CLEARED,
LCS_CH_STATE_ERROR,
};

/**
Expand Down

0 comments on commit 59579da

Please sign in to comment.