Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 293020
b: refs/heads/master
c: 5d7f6d1
h: refs/heads/master
v: v3
  • Loading branch information
Dan Williams authored and James Bottomley committed Feb 29, 2012
1 parent 0e0e30e commit f7fc153
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ab5266335ba1a43461443f9823276a2b44dd1ba7
refs/heads/master: 5d7f6d1071eadd020edb2cf366d358e0f6d0a0f9
19 changes: 13 additions & 6 deletions trunk/drivers/scsi/libsas/sas_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,15 +51,11 @@ static void sas_queue_event(int event, unsigned long *pending,
}
}

int sas_drain_work(struct sas_ha_struct *ha)

void __sas_drain_work(struct sas_ha_struct *ha)
{
struct workqueue_struct *wq = ha->core.shost->work_q;
struct work_struct *w, *_w;
int err;

err = mutex_lock_interruptible(&ha->drain_mutex);
if (err)
return err;

set_bit(SAS_HA_DRAINING, &ha->state);
/* flush submitters */
Expand All @@ -75,6 +71,17 @@ int sas_drain_work(struct sas_ha_struct *ha)
sas_queue_work(ha, w);
}
spin_unlock_irq(&ha->state_lock);
}

int sas_drain_work(struct sas_ha_struct *ha)
{
int err;

err = mutex_lock_interruptible(&ha->drain_mutex);
if (err)
return err;
if (test_bit(SAS_HA_REGISTERED, &ha->state))
__sas_drain_work(ha);
mutex_unlock(&ha->drain_mutex);

return 0;
Expand Down
18 changes: 11 additions & 7 deletions trunk/drivers/scsi/libsas/sas_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,18 +160,22 @@ int sas_register_ha(struct sas_ha_struct *sas_ha)

int sas_unregister_ha(struct sas_ha_struct *sas_ha)
{
unsigned long flags;

/* Set the state to unregistered to avoid further unchained
* events to be queued
* events to be queued, and flush any in-progress drainers
*/
spin_lock_irqsave(&sas_ha->state_lock, flags);
mutex_lock(&sas_ha->drain_mutex);
spin_lock_irq(&sas_ha->state_lock);
clear_bit(SAS_HA_REGISTERED, &sas_ha->state);
spin_unlock_irqrestore(&sas_ha->state_lock, flags);
sas_drain_work(sas_ha);
spin_unlock_irq(&sas_ha->state_lock);
__sas_drain_work(sas_ha);
mutex_unlock(&sas_ha->drain_mutex);

sas_unregister_ports(sas_ha);
sas_drain_work(sas_ha);

/* flush unregistration work */
mutex_lock(&sas_ha->drain_mutex);
__sas_drain_work(sas_ha);
mutex_unlock(&sas_ha->drain_mutex);

if (sas_ha->lldd_max_execute_num > 1) {
sas_shutdown_queue(sas_ha);
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/scsi/libsas/sas_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ int sas_init_events(struct sas_ha_struct *sas_ha);
void sas_shutdown_queue(struct sas_ha_struct *sas_ha);
void sas_disable_revalidation(struct sas_ha_struct *ha);
void sas_enable_revalidation(struct sas_ha_struct *ha);
void __sas_drain_work(struct sas_ha_struct *ha);

void sas_deform_port(struct asd_sas_phy *phy, int gone);

Expand Down

0 comments on commit f7fc153

Please sign in to comment.