aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cachefiles/interface.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/cachefiles/interface.c')
-rw-r--r--fs/cachefiles/interface.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/fs/cachefiles/interface.c b/fs/cachefiles/interface.c
index 584743d456c3..1c7293c3a93a 100644
--- a/fs/cachefiles/interface.c
+++ b/fs/cachefiles/interface.c
@@ -268,20 +268,27 @@ static void cachefiles_drop_object(struct fscache_object *_object)
268 ASSERT((atomic_read(&object->usage) & 0xffff0000) != 0x6b6b0000); 268 ASSERT((atomic_read(&object->usage) & 0xffff0000) != 0x6b6b0000);
269#endif 269#endif
270 270
271 /* delete retired objects */ 271 /* We need to tidy the object up if we did in fact manage to open it.
272 if (test_bit(FSCACHE_OBJECT_RETIRED, &object->fscache.flags) && 272 * It's possible for us to get here before the object is fully
273 _object != cache->cache.fsdef 273 * initialised if the parent goes away or the object gets retired
274 ) { 274 * before we set it up.
275 _debug("- retire object OBJ%x", object->fscache.debug_id); 275 */
276 cachefiles_begin_secure(cache, &saved_cred); 276 if (object->dentry) {
277 cachefiles_delete_object(cache, object); 277 /* delete retired objects */
278 cachefiles_end_secure(cache, saved_cred); 278 if (test_bit(FSCACHE_OBJECT_RETIRED, &object->fscache.flags) &&
279 } 279 _object != cache->cache.fsdef
280 ) {
281 _debug("- retire object OBJ%x", object->fscache.debug_id);
282 cachefiles_begin_secure(cache, &saved_cred);
283 cachefiles_delete_object(cache, object);
284 cachefiles_end_secure(cache, saved_cred);
285 }
280 286
281 /* close the filesystem stuff attached to the object */ 287 /* close the filesystem stuff attached to the object */
282 if (object->backer != object->dentry) 288 if (object->backer != object->dentry)
283 dput(object->backer); 289 dput(object->backer);
284 object->backer = NULL; 290 object->backer = NULL;
291 }
285 292
286 /* note that the object is now inactive */ 293 /* note that the object is now inactive */
287 if (test_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags)) { 294 if (test_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags)) {