From 7c13e933a7fc98409cc8cb19ca7f69ba093f2ce2 Mon Sep 17 00:00:00 2001 From: alex Date: Wed, 3 Dec 2003 22:35:57 +0000 Subject: [PATCH] - fix against wrong lock order in fsfilt_ext3_write_record() bug 2306 --- lustre/lvfs/fsfilt_ext3.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lustre/lvfs/fsfilt_ext3.c b/lustre/lvfs/fsfilt_ext3.c index dd70aa5..378b95c 100644 --- a/lustre/lvfs/fsfilt_ext3.c +++ b/lustre/lvfs/fsfilt_ext3.c @@ -726,11 +726,13 @@ static int fsfilt_ext3_write_record(struct file *file, void *buf, int bufsize, block_count = (*offs & (blocksize - 1)) + bufsize; block_count = (block_count + blocksize - 1) >> inode->i_blkbits; + down(&inode->i_sem); journal = EXT3_SB(inode->i_sb)->s_journal; handle = journal_start(journal, block_count * EXT3_DATA_TRANS_BLOCKS + 2); if (IS_ERR(handle)) { CERROR("can't start transaction\n"); + up(&inode->i_sem); return PTR_ERR(handle); } @@ -776,17 +778,17 @@ out: /* correct in-core and on-disk sizes */ if (new_size > inode->i_size) { - down(&inode->i_sem); if (new_size > inode->i_size) inode->i_size = new_size; if (inode->i_size > EXT3_I(inode)->i_disksize) EXT3_I(inode)->i_disksize = inode->i_size; - up(&inode->i_sem); if (inode->i_size > old_size) mark_inode_dirty(inode); } journal_stop(handle); + up(&inode->i_sem); + if (err == 0) *offs = offset; return err; -- 1.8.3.1