|
@@ -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);
|