Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -667,7 +667,7 @@ static int reiserfs_allocate_blocks_for_region(struct reiserfs_transaction_handl
	if (th->t_trans_id) {
		int err;
		// update any changes we made to blk count
		reiserfs_update_sd(th, inode);
		mark_inode_dirty(inode);
		err =
		    journal_end(th, inode->i_sb,
				JOURNAL_PER_BALANCE_CNT * 3 + 1 +
@@ -855,17 +855,18 @@ static int reiserfs_submit_file_region_for_write(struct reiserfs_transaction_han

		if (th->t_trans_id) {
			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);
		} else
			inode->i_sb->s_op->dirty_inode(inode);
			mark_inode_dirty(inode);

		sd_update = 1;
	}
	if (th->t_trans_id) {
		reiserfs_write_lock(inode->i_sb);
		if (!sd_update)
			reiserfs_update_sd(th, inode);
			mark_inode_dirty(inode);
		status = journal_end(th, th->t_super, th->t_blocks_allocated);
		if (status)
			retval = status;
@@ -1320,7 +1321,7 @@ static ssize_t reiserfs_file_write(struct file *file, /* the file we are going t
				return err;
			}
			reiserfs_update_inode_transaction(inode);
			reiserfs_update_sd(&th, inode);
			mark_inode_dirty(inode);
			err = journal_end(&th, inode->i_sb, 1);
			if (err) {
				reiserfs_write_unlock(inode->i_sb);
+7 −9
Original line number Diff line number Diff line
@@ -2639,6 +2639,12 @@ static int reiserfs_commit_write(struct file *f, struct page *page,
		}
		reiserfs_update_inode_transaction(inode);
		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);
		update_sd = 1;
		ret = journal_end(&myth, inode->i_sb, 1);
@@ -2649,21 +2655,13 @@ static int reiserfs_commit_write(struct file *f, struct page *page,
	if (th) {
		reiserfs_write_lock(inode->i_sb);
		if (!update_sd)
			reiserfs_update_sd(th, inode);
			mark_inode_dirty(inode);
		ret = reiserfs_end_persistent_transaction(th);
		reiserfs_write_unlock(inode->i_sb);
		if (ret)
			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:
	return ret;