X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosc%2Fosc_cache.c;fp=lustre%2Fosc%2Fosc_cache.c;h=884d14ceb0e1cea6c160eb534f61bdb43f85e81c;hp=d3e23782555435f73ff141c11b1174c8165a5ca1;hb=6af696f0a4e04eaf08de01b549ffa01e6b9bb8ef;hpb=c80319213c6dc4ac9826a1bd10c75373e08db837 diff --git a/lustre/osc/osc_cache.c b/lustre/osc/osc_cache.c index d3e2378..884d14c 100644 --- a/lustre/osc/osc_cache.c +++ b/lustre/osc/osc_cache.c @@ -314,8 +314,8 @@ static void osc_extent_state_set(struct osc_extent *ext, int state) /* LASSERT(sanity_check_nolock(ext) == 0); */ /* TODO: validate the state machine */ - ext->oe_state = state; - wake_up_all(&ext->oe_waitq); + smp_store_release(&ext->oe_state, state); + wake_up(&ext->oe_waitq); } static struct osc_extent *osc_extent_alloc(struct osc_object *obj) @@ -893,17 +893,6 @@ int osc_extent_finish(const struct lu_env *env, struct osc_extent *ext, RETURN(0); } -static int extent_wait_cb(struct osc_extent *ext, enum osc_extent_state state) -{ - int ret; - - osc_object_lock(ext->oe_obj); - ret = ext->oe_state == state; - osc_object_unlock(ext->oe_obj); - - return ret; -} - /** * Wait for the extent's state to become @state. */ @@ -932,14 +921,16 @@ static int osc_extent_wait(const struct lu_env *env, struct osc_extent *ext, osc_extent_release(env, ext); /* wait for the extent until its state becomes @state */ - rc = wait_event_idle_timeout(ext->oe_waitq, extent_wait_cb(ext, state), + rc = wait_event_idle_timeout(ext->oe_waitq, + smp_load_acquire(&ext->oe_state) == state, cfs_time_seconds(600)); if (rc == 0) { OSC_EXTENT_DUMP(D_ERROR, ext, "%s: wait ext to %u timedout, recovery in progress?\n", cli_name(osc_cli(obj)), state); - wait_event_idle(ext->oe_waitq, extent_wait_cb(ext, state)); + wait_event_idle(ext->oe_waitq, + smp_load_acquire(&ext->oe_state) == state); } if (ext->oe_rc < 0) rc = ext->oe_rc;