[Ocfs2-devel] Problem with ordered mode handling on truncate
Joel Becker
Joel.Becker at oracle.com
Mon Feb 9 19:23:37 PST 2009
On Tue, Feb 03, 2009 at 04:34:16PM +0100, Jan Kara wrote:
> Hi,
>
> I've looked at how OCFS2 call jbd2_journal_begin_ordered_truncate()
> (because I've been adding some comments about how is should be used) and
> noticed that OCFS2 has a potential race in truncate vs transaction commit
> leading to stale data in file. In particular: There is a race if someone
> writes new data and we start committing the transaction after
> jbd2_journal_begin_ordered_truncate() is called but before transaction
> adding inode to orphan list is started. Because then data written by the new
> write are discarded in the truncate but if we crash before the truncate
> itself is committed, we see old data instead of newly written one.
> Maybe more understandable as a diagram:
> CPU 1: CPU 2:
> jbd2_journal_begin_ordered_truncate(inode, 0)
> write(trans, inode, ...)
> discard data of "inode"
> commit "trans"
> ---- CRASH
>
> The correct fix to this problem is to call
> jbd2_journal_begin_ordered_truncate() after inode has been added to orphan
> list (new i_size written respectively). That function is called from two
> places:
> 1) ocfs2_truncate_for_delete() - easy to fix, just move the call just after
> the write of the inode.
> 2) ocfs2_setattr() - we can move the call into ocfs2_truncate_file() but
> that would mean calling jbd2_journal_begin_ordered_truncate()
> and consequently ocfs2_write_page() under ip_alloc_sem - not too nice.
> Furthermore ocfs2_orphan_for_truncate() zeros the last cluster
> beyond i_size and we cannot do that before writing out previous
> content... Not sure how to solve that yet.
>
> Any ideas welcome.
Well, we don't actually orphan the inode ;-)
Is this the same crash as you specified in the later patch to
lock the journal? Or something different and ocfs2-specific?
Joel
--
"Reader, suppose you were and idiot. And suppose you were a member of
Congress. But I repeat myself."
- Mark Twain
Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127
More information about the Ocfs2-devel
mailing list