diff options
Diffstat (limited to 'fs/cachefiles/interface.c')
-rw-r--r-- | fs/cachefiles/interface.c | 33 |
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)) { |