diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/cachefiles/namei.c | 12 | 
1 files changed, 11 insertions, 1 deletions
| diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c index 14ac4806e291..eeb4986ea7db 100644 --- a/fs/cachefiles/namei.c +++ b/fs/cachefiles/namei.c @@ -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); | 
