Commit 47051a21 authored by David Howells's avatar David Howells Committed by David S. Miller

[AFS]: Fix VLocation record update wakeup

Fix the wakeup transitions after a VLocation record update completes
one way or another.  This builds on Dave Miller's partial fix.

Also move wakeups outside the spinlocked sections.
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1a028e50
...@@ -416,8 +416,8 @@ struct afs_vlocation *afs_vlocation_lookup(struct afs_cell *cell, ...@@ -416,8 +416,8 @@ struct afs_vlocation *afs_vlocation_lookup(struct afs_cell *cell,
goto error_abandon; goto error_abandon;
spin_lock(&vl->lock); spin_lock(&vl->lock);
vl->state = AFS_VL_VALID; vl->state = AFS_VL_VALID;
wake_up(&vl->waitq);
spin_unlock(&vl->lock); spin_unlock(&vl->lock);
wake_up(&vl->waitq);
/* schedule for regular updates */ /* schedule for regular updates */
afs_vlocation_queue_for_updates(vl); afs_vlocation_queue_for_updates(vl);
...@@ -442,7 +442,7 @@ struct afs_vlocation *afs_vlocation_lookup(struct afs_cell *cell, ...@@ -442,7 +442,7 @@ struct afs_vlocation *afs_vlocation_lookup(struct afs_cell *cell,
_debug("invalid [state %d]", state); _debug("invalid [state %d]", state);
if ((state == AFS_VL_NEW || state == AFS_VL_NO_VOLUME)) { if (state == AFS_VL_NEW || state == AFS_VL_NO_VOLUME) {
vl->state = AFS_VL_CREATING; vl->state = AFS_VL_CREATING;
spin_unlock(&vl->lock); spin_unlock(&vl->lock);
goto fill_in_record; goto fill_in_record;
...@@ -453,11 +453,10 @@ struct afs_vlocation *afs_vlocation_lookup(struct afs_cell *cell, ...@@ -453,11 +453,10 @@ struct afs_vlocation *afs_vlocation_lookup(struct afs_cell *cell,
_debug("wait"); _debug("wait");
spin_unlock(&vl->lock); spin_unlock(&vl->lock);
ret = wait_event_interruptible( ret = wait_event_interruptible(vl->waitq,
vl->waitq, vl->state == AFS_VL_NEW ||
vl->state == AFS_VL_NEW || vl->state == AFS_VL_VALID ||
vl->state == AFS_VL_VALID || vl->state == AFS_VL_NO_VOLUME);
vl->state == AFS_VL_NO_VOLUME);
if (ret < 0) if (ret < 0)
goto error; goto error;
spin_lock(&vl->lock); spin_lock(&vl->lock);
...@@ -471,8 +470,8 @@ struct afs_vlocation *afs_vlocation_lookup(struct afs_cell *cell, ...@@ -471,8 +470,8 @@ struct afs_vlocation *afs_vlocation_lookup(struct afs_cell *cell,
error_abandon: error_abandon:
spin_lock(&vl->lock); spin_lock(&vl->lock);
vl->state = AFS_VL_NEW; vl->state = AFS_VL_NEW;
wake_up(&vl->waitq);
spin_unlock(&vl->lock); spin_unlock(&vl->lock);
wake_up(&vl->waitq);
error: error:
ASSERT(vl != NULL); ASSERT(vl != NULL);
afs_put_vlocation(vl); afs_put_vlocation(vl);
...@@ -675,7 +674,6 @@ static void afs_vlocation_updater(struct work_struct *work) ...@@ -675,7 +674,6 @@ static void afs_vlocation_updater(struct work_struct *work)
case 0: case 0:
afs_vlocation_apply_update(vl, &vldb); afs_vlocation_apply_update(vl, &vldb);
vl->state = AFS_VL_VALID; vl->state = AFS_VL_VALID;
wake_up(&vl->waitq);
break; break;
case -ENOMEDIUM: case -ENOMEDIUM:
vl->state = AFS_VL_VOLUME_DELETED; vl->state = AFS_VL_VOLUME_DELETED;
...@@ -685,6 +683,7 @@ static void afs_vlocation_updater(struct work_struct *work) ...@@ -685,6 +683,7 @@ static void afs_vlocation_updater(struct work_struct *work)
break; break;
} }
spin_unlock(&vl->lock); spin_unlock(&vl->lock);
wake_up(&vl->waitq);
/* and then reschedule */ /* and then reschedule */
_debug("reschedule"); _debug("reschedule");
......
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