|
@@ -1174,7 +1174,7 @@ static void afs_dir_remove_subdir(struct dentry *dentry)
|
|
|
static int afs_rmdir(struct inode *dir, struct dentry *dentry)
|
|
|
{
|
|
|
struct afs_fs_cursor fc;
|
|
|
- struct afs_vnode *dvnode = AFS_FS_I(dir);
|
|
|
+ struct afs_vnode *dvnode = AFS_FS_I(dir), *vnode = NULL;
|
|
|
struct key *key;
|
|
|
u64 data_version = dvnode->status.data_version;
|
|
|
int ret;
|
|
@@ -1188,6 +1188,14 @@ static int afs_rmdir(struct inode *dir, struct dentry *dentry)
|
|
|
goto error;
|
|
|
}
|
|
|
|
|
|
+ /* Try to make sure we have a callback promise on the victim. */
|
|
|
+ if (d_really_is_positive(dentry)) {
|
|
|
+ vnode = AFS_FS_I(d_inode(dentry));
|
|
|
+ ret = afs_validate(vnode, key);
|
|
|
+ if (ret < 0)
|
|
|
+ goto error_key;
|
|
|
+ }
|
|
|
+
|
|
|
ret = -ERESTARTSYS;
|
|
|
if (afs_begin_vnode_operation(&fc, dvnode, key)) {
|
|
|
while (afs_select_fileserver(&fc)) {
|
|
@@ -1206,6 +1214,7 @@ static int afs_rmdir(struct inode *dir, struct dentry *dentry)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+error_key:
|
|
|
key_put(key);
|
|
|
error:
|
|
|
return ret;
|