diff options
Diffstat (limited to 'fs/fscache/object.c')
| -rw-r--r-- | fs/fscache/object.c | 69 | 
1 files changed, 65 insertions, 4 deletions
diff --git a/fs/fscache/object.c b/fs/fscache/object.c index da032daf0e0d..9e792e30f4db 100644 --- a/fs/fscache/object.c +++ b/fs/fscache/object.c @@ -328,6 +328,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.   */  static const struct fscache_state *fscache_abort_initialisation(struct fscache_object *object, @@ -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); @@ -1016,3 +1030,50 @@ static const struct fscache_state *fscache_update_object(struct fscache_object *  	_leave("");  	return transit_to(WAIT_FOR_CMD);  } + +/** + * fscache_object_retrying_stale - Note retrying stale object + * @object: The object that will be retried + * + * Note that an object lookup found an on-disk object that was adjudged to be + * stale and has been deleted.  The lookup will be retried. + */ +void fscache_object_retrying_stale(struct fscache_object *object) +{ +	fscache_stat(&fscache_n_cache_no_space_reject); +} +EXPORT_SYMBOL(fscache_object_retrying_stale); + +/** + * fscache_object_mark_killed - Note that an object was killed + * @object: The object that was culled + * @why: The reason the object was killed. + * + * Note that an object was killed.  Returns true if the object was + * already marked killed, false if it wasn't. + */ +void fscache_object_mark_killed(struct fscache_object *object, +				enum fscache_why_object_killed why) +{ +	if (test_and_set_bit(FSCACHE_OBJECT_KILLED_BY_CACHE, &object->flags)) { +		pr_err("Error: Object already killed by cache [%s]\n", +		       object->cache->identifier); +		return; +	} + +	switch (why) { +	case FSCACHE_OBJECT_NO_SPACE: +		fscache_stat(&fscache_n_cache_no_space_reject); +		break; +	case FSCACHE_OBJECT_IS_STALE: +		fscache_stat(&fscache_n_cache_stale_objects); +		break; +	case FSCACHE_OBJECT_WAS_RETIRED: +		fscache_stat(&fscache_n_cache_retired_objects); +		break; +	case FSCACHE_OBJECT_WAS_CULLED: +		fscache_stat(&fscache_n_cache_culled_objects); +		break; +	} +} +EXPORT_SYMBOL(fscache_object_mark_killed);  |