cachefiles: Fix race between inactivating and culling a cache object
[cascardo/linux.git] / fs / cachefiles / namei.c
index 4ae7500..3f7c2cd 100644 (file)
@@ -263,6 +263,8 @@ requeue:
 void cachefiles_mark_object_inactive(struct cachefiles_cache *cache,
                                     struct cachefiles_object *object)
 {
+       blkcnt_t i_blocks = d_backing_inode(object->dentry)->i_blocks;
+
        write_lock(&cache->active_lock);
        rb_erase(&object->active_node, &cache->active_nodes);
        clear_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags);
@@ -273,8 +275,7 @@ void cachefiles_mark_object_inactive(struct cachefiles_cache *cache,
        /* This object can now be culled, so we need to let the daemon know
         * that there is something it can remove if it needs to.
         */
-       atomic_long_add(d_backing_inode(object->dentry)->i_blocks,
-                       &cache->b_released);
+       atomic_long_add(i_blocks, &cache->b_released);
        if (atomic_inc_return(&cache->f_released))
                cachefiles_state_changed(cache);
 }