Skip to content

Commit

Permalink
ocfs2: Fix rename/extend race
Browse files Browse the repository at this point in the history
If one process is extending a file while another is renaming it, there
exists a window when rename could flush the old inode's stale i_size to
disk. This patch recognizes the fact that rename is only updating the old
inode's ctime, so it ensures only that value is flushed to disk.

Signed-off-by: Sunil Mushran <sunil.musran@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
  • Loading branch information
Sunil Mushran authored and Mark Fasheh committed Aug 10, 2007
1 parent 6a18380 commit 480214d
Showing 1 changed file with 15 additions and 1 deletion.
16 changes: 15 additions & 1 deletion fs/ocfs2/namei.c
Original file line number Diff line number Diff line change
Expand Up @@ -1080,6 +1080,7 @@ static int ocfs2_rename(struct inode *old_dir,
struct buffer_head *old_inode_de_bh = NULL; // if old_dentry is a dir,
// this is the 1st dirent bh
nlink_t old_dir_nlink = old_dir->i_nlink;
struct ocfs2_dinode *old_di;

/* At some point it might be nice to break this function up a
* bit. */
Expand Down Expand Up @@ -1354,7 +1355,20 @@ static int ocfs2_rename(struct inode *old_dir,

old_inode->i_ctime = CURRENT_TIME;
mark_inode_dirty(old_inode);
ocfs2_mark_inode_dirty(handle, old_inode, old_inode_bh);

status = ocfs2_journal_access(handle, old_inode, old_inode_bh,
OCFS2_JOURNAL_ACCESS_WRITE);
if (status >= 0) {
old_di = (struct ocfs2_dinode *) old_inode_bh->b_data;

old_di->i_ctime = cpu_to_le64(old_inode->i_ctime.tv_sec);
old_di->i_ctime_nsec = cpu_to_le32(old_inode->i_ctime.tv_nsec);

status = ocfs2_journal_dirty(handle, old_inode_bh);
if (status < 0)
mlog_errno(status);
} else
mlog_errno(status);

/* now that the name has been added to new_dir, remove the old name */
status = ocfs2_delete_entry(handle, old_dir, old_de, old_de_bh);
Expand Down

0 comments on commit 480214d

Please sign in to comment.