]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - fs/cachefiles/namei.c
CacheFiles: Fix a race in cachefiles_delete_object() vs rename
[net-next-2.6.git] / fs / cachefiles / namei.c
index 14ac4806e2913f8c37e76d95dc1d0274f4bbd027..eeb4986ea7db7cbb65b0b48685ae0a0d3f6a1a7e 100644 (file)
@@ -348,7 +348,17 @@ int cachefiles_delete_object(struct cachefiles_cache *cache,
        dir = dget_parent(object->dentry);
 
        mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT);
-       ret = cachefiles_bury_object(cache, dir, object->dentry);
+
+       /* we need to check that our parent is _still_ our parent - it may have
+        * been renamed */
+       if (dir == object->dentry->d_parent) {
+               ret = cachefiles_bury_object(cache, dir, object->dentry);
+       } else {
+               /* it got moved, presumably by cachefilesd culling it, so it's
+                * no longer in the key path and we can ignore it */
+               mutex_unlock(&dir->d_inode->i_mutex);
+               ret = 0;
+       }
 
        dput(dir);
        _leave(" = %d", ret);