diff options
Diffstat (limited to 'fs/fscache/cache.c')
-rw-r--r-- | fs/fscache/cache.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/fs/fscache/cache.c b/fs/fscache/cache.c index 129ea537f023..f7cff367db7f 100644 --- a/fs/fscache/cache.c +++ b/fs/fscache/cache.c | |||
@@ -224,8 +224,10 @@ int fscache_add_cache(struct fscache_cache *cache, | |||
224 | BUG_ON(!ifsdef); | 224 | BUG_ON(!ifsdef); |
225 | 225 | ||
226 | cache->flags = 0; | 226 | cache->flags = 0; |
227 | ifsdef->event_mask = ULONG_MAX & ~(1 << FSCACHE_OBJECT_EV_CLEARED); | 227 | ifsdef->event_mask = |
228 | ifsdef->state = FSCACHE_OBJECT_ACTIVE; | 228 | ((1 << NR_FSCACHE_OBJECT_EVENTS) - 1) & |
229 | ~(1 << FSCACHE_OBJECT_EV_CLEARED); | ||
230 | __set_bit(FSCACHE_OBJECT_IS_AVAILABLE, &ifsdef->flags); | ||
229 | 231 | ||
230 | if (!tagname) | 232 | if (!tagname) |
231 | tagname = cache->identifier; | 233 | tagname = cache->identifier; |
@@ -330,25 +332,25 @@ static void fscache_withdraw_all_objects(struct fscache_cache *cache, | |||
330 | { | 332 | { |
331 | struct fscache_object *object; | 333 | struct fscache_object *object; |
332 | 334 | ||
333 | spin_lock(&cache->object_list_lock); | ||
334 | |||
335 | while (!list_empty(&cache->object_list)) { | 335 | while (!list_empty(&cache->object_list)) { |
336 | object = list_entry(cache->object_list.next, | 336 | spin_lock(&cache->object_list_lock); |
337 | struct fscache_object, cache_link); | ||
338 | list_move_tail(&object->cache_link, dying_objects); | ||
339 | 337 | ||
340 | _debug("withdraw %p", object->cookie); | 338 | if (!list_empty(&cache->object_list)) { |
339 | object = list_entry(cache->object_list.next, | ||
340 | struct fscache_object, cache_link); | ||
341 | list_move_tail(&object->cache_link, dying_objects); | ||
341 | 342 | ||
342 | spin_lock(&object->lock); | 343 | _debug("withdraw %p", object->cookie); |
343 | spin_unlock(&cache->object_list_lock); | 344 | |
344 | fscache_raise_event(object, FSCACHE_OBJECT_EV_WITHDRAW); | 345 | /* This must be done under object_list_lock to prevent |
345 | spin_unlock(&object->lock); | 346 | * a race with fscache_drop_object(). |
347 | */ | ||
348 | fscache_raise_event(object, FSCACHE_OBJECT_EV_KILL); | ||
349 | } | ||
346 | 350 | ||
351 | spin_unlock(&cache->object_list_lock); | ||
347 | cond_resched(); | 352 | cond_resched(); |
348 | spin_lock(&cache->object_list_lock); | ||
349 | } | 353 | } |
350 | |||
351 | spin_unlock(&cache->object_list_lock); | ||
352 | } | 354 | } |
353 | 355 | ||
354 | /** | 356 | /** |