Whamcloud - gitweb
re-committing on b_devel:
b=1997
r=alex
My previous fix for truncate/write lock inversion was close, but badly
flawed. I failed to remember that truncate will internally restart
the transaction -- start a new one, for all intents and purposes -- so
the ordering was backwards. "i_sem before transaction" is the
cardinal rule.
I tried to avoid that because I didn't want to hold the i_sem across
the entire disk I/O in filter_commitrw_write. After some discussion
with Alex, however, we decided that the i_sem need only be held for
the block allocation, and that the BKL suffices for updating i_size.
So the ordering in the write path is now: take i_sem, start transaction,
call filter_direct_io, f_d_io does block alloc, drops i_sem, does I/O.