Commit 9f03783c authored by Chris Mason's avatar Chris Mason Committed by Linus Torvalds

[PATCH] reiserfs: use mark_inode_dirty instead of reiserfs_update_sd

reiserfs should use mark_inode_dirty during reiserfs_file_write and
reiserfs_commit_write.  This makes sure the inode is properly flagged as
dirty, which is used during O_SYNC to decide when to trigger log commits.

This patch also removes the O_SYNC check from reiserfs_commit_write, since
that gets dealt with properly at higher layers once we start using
mark_inode_dirty.

Thanks to Hifumi Hisashi <hifumi.hisashi@lab.ntt.co.jp> for catching this.
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 9f158333
...@@ -667,7 +667,7 @@ static int reiserfs_allocate_blocks_for_region(struct reiserfs_transaction_handl ...@@ -667,7 +667,7 @@ static int reiserfs_allocate_blocks_for_region(struct reiserfs_transaction_handl
if (th->t_trans_id) { if (th->t_trans_id) {
int err; int err;
// update any changes we made to blk count // update any changes we made to blk count
reiserfs_update_sd(th, inode); mark_inode_dirty(inode);
err = err =
journal_end(th, inode->i_sb, journal_end(th, inode->i_sb,
JOURNAL_PER_BALANCE_CNT * 3 + 1 + JOURNAL_PER_BALANCE_CNT * 3 + 1 +
...@@ -855,17 +855,18 @@ static int reiserfs_submit_file_region_for_write(struct reiserfs_transaction_han ...@@ -855,17 +855,18 @@ static int reiserfs_submit_file_region_for_write(struct reiserfs_transaction_han
if (th->t_trans_id) { if (th->t_trans_id) {
reiserfs_write_lock(inode->i_sb); reiserfs_write_lock(inode->i_sb);
reiserfs_update_sd(th, inode); // And update on-disk metadata // this sets the proper flags for O_SYNC to trigger a commit
mark_inode_dirty(inode);
reiserfs_write_unlock(inode->i_sb); reiserfs_write_unlock(inode->i_sb);
} else } else
inode->i_sb->s_op->dirty_inode(inode); mark_inode_dirty(inode);
sd_update = 1; sd_update = 1;
} }
if (th->t_trans_id) { if (th->t_trans_id) {
reiserfs_write_lock(inode->i_sb); reiserfs_write_lock(inode->i_sb);
if (!sd_update) if (!sd_update)
reiserfs_update_sd(th, inode); mark_inode_dirty(inode);
status = journal_end(th, th->t_super, th->t_blocks_allocated); status = journal_end(th, th->t_super, th->t_blocks_allocated);
if (status) if (status)
retval = status; retval = status;
...@@ -1320,7 +1321,7 @@ static ssize_t reiserfs_file_write(struct file *file, /* the file we are going t ...@@ -1320,7 +1321,7 @@ static ssize_t reiserfs_file_write(struct file *file, /* the file we are going t
return err; return err;
} }
reiserfs_update_inode_transaction(inode); reiserfs_update_inode_transaction(inode);
reiserfs_update_sd(&th, inode); mark_inode_dirty(inode);
err = journal_end(&th, inode->i_sb, 1); err = journal_end(&th, inode->i_sb, 1);
if (err) { if (err) {
reiserfs_write_unlock(inode->i_sb); reiserfs_write_unlock(inode->i_sb);
......
...@@ -2639,6 +2639,12 @@ static int reiserfs_commit_write(struct file *f, struct page *page, ...@@ -2639,6 +2639,12 @@ static int reiserfs_commit_write(struct file *f, struct page *page,
} }
reiserfs_update_inode_transaction(inode); reiserfs_update_inode_transaction(inode);
inode->i_size = pos; inode->i_size = pos;
/*
* this will just nest into our transaction. It's important
* to use mark_inode_dirty so the inode gets pushed around on the
* dirty lists, and so that O_SYNC works as expected
*/
mark_inode_dirty(inode);
reiserfs_update_sd(&myth, inode); reiserfs_update_sd(&myth, inode);
update_sd = 1; update_sd = 1;
ret = journal_end(&myth, inode->i_sb, 1); ret = journal_end(&myth, inode->i_sb, 1);
...@@ -2649,21 +2655,13 @@ static int reiserfs_commit_write(struct file *f, struct page *page, ...@@ -2649,21 +2655,13 @@ static int reiserfs_commit_write(struct file *f, struct page *page,
if (th) { if (th) {
reiserfs_write_lock(inode->i_sb); reiserfs_write_lock(inode->i_sb);
if (!update_sd) if (!update_sd)
reiserfs_update_sd(th, inode); mark_inode_dirty(inode);
ret = reiserfs_end_persistent_transaction(th); ret = reiserfs_end_persistent_transaction(th);
reiserfs_write_unlock(inode->i_sb); reiserfs_write_unlock(inode->i_sb);
if (ret) if (ret)
goto out; goto out;
} }
/* we test for O_SYNC here so we can commit the transaction
** for any packed tails the file might have had
*/
if (f && (f->f_flags & O_SYNC)) {
reiserfs_write_lock(inode->i_sb);
ret = reiserfs_commit_for_inode(inode);
reiserfs_write_unlock(inode->i_sb);
}
out: out:
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment