lkml.org 
[lkml]   [2015]   [Feb]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 04/13] FS-Cache: Handle a new operation submitted against a killed object
    From
    Date
    Reject new operations that are being submitted against an object if that
    object has failed its lookup or creation states or has been killed by the
    cache backend for some other reason, such as having been culled.

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

    fs/fscache/object.c | 2 ++
    fs/fscache/operation.c | 6 ++++++
    2 files changed, 8 insertions(+)

    diff --git a/fs/fscache/object.c b/fs/fscache/object.c
    index 12bb468bf0ae..9b79fc9a1464 100644
    --- a/fs/fscache/object.c
    +++ b/fs/fscache/object.c
    @@ -610,6 +610,8 @@ static const struct fscache_state *fscache_lookup_failure(struct fscache_object
    object->cache->ops->lookup_complete(object);
    fscache_stat_d(&fscache_n_cop_lookup_complete);

    + set_bit(FSCACHE_OBJECT_KILLED_BY_CACHE, &object->flags);
    +
    cookie = object->cookie;
    set_bit(FSCACHE_COOKIE_UNAVAILABLE, &cookie->flags);
    if (test_and_clear_bit(FSCACHE_COOKIE_LOOKING_UP, &cookie->flags))
    diff --git a/fs/fscache/operation.c b/fs/fscache/operation.c
    index dec6defe3be3..18658fffbba1 100644
    --- a/fs/fscache/operation.c
    +++ b/fs/fscache/operation.c
    @@ -176,6 +176,9 @@ int fscache_submit_exclusive_op(struct fscache_object *object,
    list_add_tail(&op->pend_link, &object->pending_ops);
    fscache_stat(&fscache_n_op_pend);
    ret = 0;
    + } else if (flags & BIT(FSCACHE_OBJECT_KILLED_BY_CACHE)) {
    + op->state = FSCACHE_OP_ST_CANCELLED;
    + ret = -ENOBUFS;
    } else {
    fscache_report_unexpected_submission(object, op, ostate);
    op->state = FSCACHE_OP_ST_CANCELLED;
    @@ -249,6 +252,9 @@ int fscache_submit_op(struct fscache_object *object,
    list_add_tail(&op->pend_link, &object->pending_ops);
    fscache_stat(&fscache_n_op_pend);
    ret = 0;
    + } else if (flags & BIT(FSCACHE_OBJECT_KILLED_BY_CACHE)) {
    + op->state = FSCACHE_OP_ST_CANCELLED;
    + ret = -ENOBUFS;
    } else {
    fscache_report_unexpected_submission(object, op, ostate);
    ASSERT(!fscache_object_is_active(object));


    \
     
     \ /
      Last update: 2015-02-26 15:21    [W:3.543 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site