lkml.org 
[lkml]   [2009]   [Nov]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 20/28] FS-Cache: Make sure FSCACHE_COOKIE_LOOKING_UP cleared on lookup failure
    Date
    We must make sure that FSCACHE_COOKIE_LOOKING_UP is cleared on lookup failure
    (if an object reaches the LC_DYING state), and we should clear it before
    clearing FSCACHE_COOKIE_CREATING.

    If this doesn't happen then fscache_wait_for_deferred_lookup() may hold
    allocation and retrieval operations indefinitely until they're interrupted by
    signals - which in turn pins the dying object until they go away.

    Signed-off-by: David Howells <dhowells@redhat.com>
    ---

    fs/fscache/object.c | 17 ++++++++++++-----
    1 files changed, 12 insertions(+), 5 deletions(-)

    diff --git a/fs/fscache/object.c b/fs/fscache/object.c
    index 1a1afa8..74bc562 100644
    --- a/fs/fscache/object.c
    +++ b/fs/fscache/object.c
    @@ -105,6 +105,7 @@ static inline void fscache_done_parent_op(struct fscache_object *object)
    static void fscache_object_state_machine(struct fscache_object *object)
    {
    enum fscache_object_state new_state;
    + struct fscache_cookie *cookie;

    ASSERT(object != NULL);

    @@ -158,11 +159,17 @@ static void fscache_object_state_machine(struct fscache_object *object)

    spin_lock(&object->lock);
    object->state = FSCACHE_OBJECT_DYING;
    - if (object->cookie &&
    - test_and_clear_bit(FSCACHE_COOKIE_CREATING,
    - &object->cookie->flags))
    - wake_up_bit(&object->cookie->flags,
    - FSCACHE_COOKIE_CREATING);
    + cookie = object->cookie;
    + if (cookie) {
    + if (test_and_clear_bit(FSCACHE_COOKIE_LOOKING_UP,
    + &cookie->flags))
    + wake_up_bit(&cookie->flags,
    + FSCACHE_COOKIE_LOOKING_UP);
    + if (test_and_clear_bit(FSCACHE_COOKIE_CREATING,
    + &cookie->flags))
    + wake_up_bit(&cookie->flags,
    + FSCACHE_COOKIE_CREATING);
    + }
    spin_unlock(&object->lock);

    fscache_done_parent_op(object);


    \
     
     \ /
      Last update: 2009-11-19 18:55    [W:0.021 / U:61.420 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site