ocfs2: fix rename vs unlink race
If another node unlinks the destination while ocfs2_rename() is waiting on a cluster lock, ocfs2_rename() simply logs an error and continues. This causes a crash because the renaming node is now trying to delete a non-existent inode. The correct solution is to return -ENOENT. Signed-off-by: Srinivas Eeda <srinivas.eeda@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
This commit is contained in:
parent
bc7e97cbdd
commit
e325a88f17
1 changed files with 10 additions and 3 deletions
|
@ -1105,9 +1105,16 @@ static int ocfs2_rename(struct inode *old_dir,
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!new_de && new_inode)
|
if (!new_de && new_inode) {
|
||||||
mlog(ML_ERROR, "inode %lu does not exist in it's parent "
|
/*
|
||||||
"directory!", new_inode->i_ino);
|
* Target was unlinked by another node while we were
|
||||||
|
* waiting to get to ocfs2_rename(). There isn't
|
||||||
|
* anything we can do here to help the situation, so
|
||||||
|
* bubble up the appropriate error.
|
||||||
|
*/
|
||||||
|
status = -ENOENT;
|
||||||
|
goto bail;
|
||||||
|
}
|
||||||
|
|
||||||
/* In case we need to overwrite an existing file, we blow it
|
/* In case we need to overwrite an existing file, we blow it
|
||||||
* away first */
|
* away first */
|
||||||
|
|
Loading…
Reference in a new issue