diff options
Diffstat (limited to 'fs/fscache/object.c')
-rw-r--r-- | fs/fscache/object.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/fscache/object.c b/fs/fscache/object.c index 3b0712213993..53d35c504240 100644 --- a/fs/fscache/object.c +++ b/fs/fscache/object.c | |||
@@ -495,6 +495,7 @@ void fscache_object_lookup_negative(struct fscache_object *object) | |||
495 | * returning ENODATA. | 495 | * returning ENODATA. |
496 | */ | 496 | */ |
497 | set_bit(FSCACHE_COOKIE_NO_DATA_YET, &cookie->flags); | 497 | set_bit(FSCACHE_COOKIE_NO_DATA_YET, &cookie->flags); |
498 | clear_bit(FSCACHE_COOKIE_UNAVAILABLE, &cookie->flags); | ||
498 | 499 | ||
499 | _debug("wake up lookup %p", &cookie->flags); | 500 | _debug("wake up lookup %p", &cookie->flags); |
500 | clear_bit_unlock(FSCACHE_COOKIE_LOOKING_UP, &cookie->flags); | 501 | clear_bit_unlock(FSCACHE_COOKIE_LOOKING_UP, &cookie->flags); |
@@ -527,6 +528,7 @@ void fscache_obtained_object(struct fscache_object *object) | |||
527 | 528 | ||
528 | /* We do (presumably) have data */ | 529 | /* We do (presumably) have data */ |
529 | clear_bit_unlock(FSCACHE_COOKIE_NO_DATA_YET, &cookie->flags); | 530 | clear_bit_unlock(FSCACHE_COOKIE_NO_DATA_YET, &cookie->flags); |
531 | clear_bit(FSCACHE_COOKIE_UNAVAILABLE, &cookie->flags); | ||
530 | 532 | ||
531 | /* Allow write requests to begin stacking up and read requests | 533 | /* Allow write requests to begin stacking up and read requests |
532 | * to begin shovelling data. | 534 | * to begin shovelling data. |
@@ -679,7 +681,8 @@ static const struct fscache_state *fscache_drop_object(struct fscache_object *ob | |||
679 | */ | 681 | */ |
680 | spin_lock(&cookie->lock); | 682 | spin_lock(&cookie->lock); |
681 | hlist_del_init(&object->cookie_link); | 683 | hlist_del_init(&object->cookie_link); |
682 | if (test_and_clear_bit(FSCACHE_COOKIE_INVALIDATING, &cookie->flags)) | 684 | if (hlist_empty(&cookie->backing_objects) && |
685 | test_and_clear_bit(FSCACHE_COOKIE_INVALIDATING, &cookie->flags)) | ||
683 | awaken = true; | 686 | awaken = true; |
684 | spin_unlock(&cookie->lock); | 687 | spin_unlock(&cookie->lock); |
685 | 688 | ||
@@ -927,7 +930,7 @@ static const struct fscache_state *_fscache_invalidate_object(struct fscache_obj | |||
927 | */ | 930 | */ |
928 | if (!fscache_use_cookie(object)) { | 931 | if (!fscache_use_cookie(object)) { |
929 | ASSERT(object->cookie->stores.rnode == NULL); | 932 | ASSERT(object->cookie->stores.rnode == NULL); |
930 | set_bit(FSCACHE_COOKIE_RETIRED, &cookie->flags); | 933 | set_bit(FSCACHE_OBJECT_RETIRED, &object->flags); |
931 | _leave(" [no cookie]"); | 934 | _leave(" [no cookie]"); |
932 | return transit_to(KILL_OBJECT); | 935 | return transit_to(KILL_OBJECT); |
933 | } | 936 | } |