Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e325a88f authored by Srinivas Eeda's avatar Srinivas Eeda Committed by Mark Fasheh
Browse files

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: default avatarSrinivas Eeda <srinivas.eeda@oracle.com>
Signed-off-by: default avatarMark Fasheh <mark.fasheh@oracle.com>
parent bc7e97cb
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -1105,9 +1105,16 @@ static int ocfs2_rename(struct inode *old_dir,
		goto bail;
	}

	if (!new_de && new_inode)
		mlog(ML_ERROR, "inode %lu does not exist in it's parent "
		     "directory!", new_inode->i_ino);
	if (!new_de && new_inode) {
		/*
		 * 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
	 * away first */