diff options
author | Srinivas Eeda <srinivas.eeda@oracle.com> | 2007-10-31 19:49:43 -0400 |
---|---|---|
committer | Mark Fasheh <mark.fasheh@oracle.com> | 2007-11-06 18:35:40 -0500 |
commit | e325a88f17196f18888f6e1426eb9fe3b4346d28 (patch) | |
tree | 34536cea32f530c0a41df0b8323d1e3a2249a0e6 /fs/ocfs2 | |
parent | bc7e97cbdd4bef162e5772c74ee2cc4487a2d997 (diff) |
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>
Diffstat (limited to 'fs/ocfs2')
-rw-r--r-- | fs/ocfs2/namei.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c index 729259016c18..989ac2718587 100644 --- a/fs/ocfs2/namei.c +++ b/fs/ocfs2/namei.c | |||
@@ -1105,9 +1105,16 @@ static int ocfs2_rename(struct inode *old_dir, | |||
1105 | goto bail; | 1105 | goto bail; |
1106 | } | 1106 | } |
1107 | 1107 | ||
1108 | if (!new_de && new_inode) | 1108 | if (!new_de && new_inode) { |
1109 | mlog(ML_ERROR, "inode %lu does not exist in it's parent " | 1109 | /* |
1110 | "directory!", new_inode->i_ino); | 1110 | * Target was unlinked by another node while we were |
1111 | * waiting to get to ocfs2_rename(). There isn't | ||
1112 | * anything we can do here to help the situation, so | ||
1113 | * bubble up the appropriate error. | ||
1114 | */ | ||
1115 | status = -ENOENT; | ||
1116 | goto bail; | ||
1117 | } | ||
1111 | 1118 | ||
1112 | /* In case we need to overwrite an existing file, we blow it | 1119 | /* In case we need to overwrite an existing file, we blow it |
1113 | * away first */ | 1120 | * away first */ |