diff options
| -rw-r--r-- | fs/cachefiles/interface.c | 8 | ||||
| -rw-r--r-- | fs/cachefiles/internal.h | 3 | ||||
| -rw-r--r-- | fs/cachefiles/namei.c | 8 | 
3 files changed, 13 insertions, 6 deletions
diff --git a/fs/cachefiles/interface.c b/fs/cachefiles/interface.c index ce5f345d70f5..e7f16a77a22a 100644 --- a/fs/cachefiles/interface.c +++ b/fs/cachefiles/interface.c @@ -253,6 +253,8 @@ static void cachefiles_drop_object(struct fscache_object *_object)  	struct cachefiles_object *object;  	struct cachefiles_cache *cache;  	const struct cred *saved_cred; +	struct inode *inode; +	blkcnt_t i_blocks = 0;  	ASSERT(_object); @@ -279,6 +281,10 @@ static void cachefiles_drop_object(struct fscache_object *_object)  		    _object != cache->cache.fsdef  		    ) {  			_debug("- retire object OBJ%x", object->fscache.debug_id); +			inode = d_backing_inode(object->dentry); +			if (inode) +				i_blocks = inode->i_blocks; +  			cachefiles_begin_secure(cache, &saved_cred);  			cachefiles_delete_object(cache, object);  			cachefiles_end_secure(cache, saved_cred); @@ -292,7 +298,7 @@ static void cachefiles_drop_object(struct fscache_object *_object)  	/* note that the object is now inactive */  	if (test_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags)) -		cachefiles_mark_object_inactive(cache, object); +		cachefiles_mark_object_inactive(cache, object, i_blocks);  	dput(object->dentry);  	object->dentry = NULL; diff --git a/fs/cachefiles/internal.h b/fs/cachefiles/internal.h index 2fcde1a34b7c..cd1effee8a49 100644 --- a/fs/cachefiles/internal.h +++ b/fs/cachefiles/internal.h @@ -160,7 +160,8 @@ extern char *cachefiles_cook_key(const u8 *raw, int keylen, uint8_t type);   * namei.c   */  extern void cachefiles_mark_object_inactive(struct cachefiles_cache *cache, -					    struct cachefiles_object *object); +					    struct cachefiles_object *object, +					    blkcnt_t i_blocks);  extern int cachefiles_delete_object(struct cachefiles_cache *cache,  				    struct cachefiles_object *object);  extern int cachefiles_walk_to_object(struct cachefiles_object *parent, diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c index 3f7c2cd41f8f..c6ee4b5fb7e6 100644 --- a/fs/cachefiles/namei.c +++ b/fs/cachefiles/namei.c @@ -261,10 +261,9 @@ requeue:   * Mark an object as being inactive.   */  void cachefiles_mark_object_inactive(struct cachefiles_cache *cache, -				     struct cachefiles_object *object) +				     struct cachefiles_object *object, +				     blkcnt_t i_blocks)  { -	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); @@ -707,7 +706,8 @@ mark_active_timed_out:  check_error:  	_debug("check error %d", ret); -	cachefiles_mark_object_inactive(cache, object); +	cachefiles_mark_object_inactive( +		cache, object, d_backing_inode(object->dentry)->i_blocks);  release_dentry:  	dput(object->dentry);  	object->dentry = NULL;  |