FS-Cache: Handle a new operation submitted against a killed object
authorDavid Howells <dhowells@redhat.com>
Wed, 25 Feb 2015 11:53:57 +0000 (11:53 +0000)
committerDavid Howells <dhowells@redhat.com>
Thu, 2 Apr 2015 13:28:53 +0000 (14:28 +0100)
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>
Reviewed-by: Steve Dickson <steved@redhat.com>
Acked-by: Jeff Layton <jeff.layton@primarydata.com>
fs/fscache/object.c
fs/fscache/operation.c

index 12bb468bf0aebf4823381bcce6d6cee9d4df678e..9b79fc9a1464a1522d45a203bcfc7f10261ea62a 100644 (file)
@@ -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))
index dec6defe3be30941bbd0171bfba560e42bd78919..18658fffbba17f11cffbdf8d2249eefe9557badc 100644 (file)
@@ -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));