Merge branch 'nvmf-4.8-rc' of git://git.infradead.org/nvme-fabrics into for-linus
[cascardo/linux.git] / fs / fscache / object.c
index 12bb468..9e792e3 100644 (file)
@@ -327,6 +327,17 @@ void fscache_object_init(struct fscache_object *object,
 }
 EXPORT_SYMBOL(fscache_object_init);
 
+/*
+ * Mark the object as no longer being live, making sure that we synchronise
+ * against op submission.
+ */
+static inline void fscache_mark_object_dead(struct fscache_object *object)
+{
+       spin_lock(&object->lock);
+       clear_bit(FSCACHE_OBJECT_IS_LIVE, &object->flags);
+       spin_unlock(&object->lock);
+}
+
 /*
  * Abort object initialisation before we start it.
  */
@@ -610,6 +621,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))
@@ -629,7 +642,7 @@ static const struct fscache_state *fscache_kill_object(struct fscache_object *ob
        _enter("{OBJ%x,%d,%d},%d",
               object->debug_id, object->n_ops, object->n_children, event);
 
-       clear_bit(FSCACHE_OBJECT_IS_LIVE, &object->flags);
+       fscache_mark_object_dead(object);
        object->oob_event_mask = 0;
 
        if (list_empty(&object->dependents) &&
@@ -948,7 +961,8 @@ static const struct fscache_state *_fscache_invalidate_object(struct fscache_obj
        if (!op)
                goto nomem;
 
-       fscache_operation_init(op, object->cache->ops->invalidate_object, NULL);
+       fscache_operation_init(op, object->cache->ops->invalidate_object,
+                              NULL, NULL);
        op->flags = FSCACHE_OP_ASYNC |
                (1 << FSCACHE_OP_EXCLUSIVE) |
                (1 << FSCACHE_OP_UNUSE_COOKIE);
@@ -974,13 +988,13 @@ static const struct fscache_state *_fscache_invalidate_object(struct fscache_obj
        return transit_to(UPDATE_OBJECT);
 
 nomem:
-       clear_bit(FSCACHE_OBJECT_IS_LIVE, &object->flags);
+       fscache_mark_object_dead(object);
        fscache_unuse_cookie(object);
        _leave(" [ENOMEM]");
        return transit_to(KILL_OBJECT);
 
 submit_op_failed:
-       clear_bit(FSCACHE_OBJECT_IS_LIVE, &object->flags);
+       fscache_mark_object_dead(object);
        spin_unlock(&cookie->lock);
        fscache_unuse_cookie(object);
        kfree(op);