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

Commit 830156c7 authored by Frank Mayhar's avatar Frank Mayhar Committed by Theodore Ts'o
Browse files

ext4: Avoid updating the inode table bh twice in no journal mode



This is a cleanup of commit 91ac6f43.  Since ext4_mark_inode_dirty()
has already called ext4_mark_iloc_dirty(), which in turn calls
ext4_do_update_inode(), it's not necessary to have ext4_write_inode()
call ext4_do_update_inode() in no journal mode.  Indeed, it would be
duplicated work.

Reviewed-by: default avatar"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatarFrank Mayhar <fmayhar@google.com>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent f3ce8064
Loading
Loading
Loading
Loading
+16 −21
Original line number Diff line number Diff line
@@ -4991,8 +4991,7 @@ static int ext4_inode_blocks_set(handle_t *handle,
 */
static int ext4_do_update_inode(handle_t *handle,
				struct inode *inode,
				struct ext4_iloc *iloc,
				int do_sync)
				struct ext4_iloc *iloc)
{
	struct ext4_inode *raw_inode = ext4_raw_inode(iloc);
	struct ext4_inode_info *ei = EXT4_I(inode);
@@ -5093,22 +5092,10 @@ static int ext4_do_update_inode(handle_t *handle,
		raw_inode->i_extra_isize = cpu_to_le16(ei->i_extra_isize);
	}

	/*
	 * If we're not using a journal and we were called from
	 * ext4_write_inode() to sync the inode (making do_sync true),
	 * we can just use sync_dirty_buffer() directly to do our dirty
	 * work.  Testing s_journal here is a bit redundant but it's
	 * worth it to avoid potential future trouble.
	 */
	if (EXT4_SB(inode->i_sb)->s_journal == NULL && do_sync) {
		BUFFER_TRACE(bh, "call sync_dirty_buffer");
		sync_dirty_buffer(bh);
	} else {
	BUFFER_TRACE(bh, "call ext4_handle_dirty_metadata");
	rc = ext4_handle_dirty_metadata(handle, inode, bh);
	if (!err)
		err = rc;
	}
	ei->i_state &= ~EXT4_STATE_NEW;

out_brelse:
@@ -5176,8 +5163,16 @@ int ext4_write_inode(struct inode *inode, int wait)
		err = ext4_get_inode_loc(inode, &iloc);
		if (err)
			return err;
		err = ext4_do_update_inode(EXT4_NOJOURNAL_HANDLE,
					   inode, &iloc, wait);
		if (wait)
			sync_dirty_buffer(iloc.bh);
		if (buffer_req(iloc.bh) && !buffer_uptodate(iloc.bh)) {
			ext4_error(inode->i_sb, __func__,
				   "IO error syncing inode, "
				   "inode=%lu, block=%llu",
				   inode->i_ino,
				   (unsigned long long)iloc.bh->b_blocknr);
			err = -EIO;
		}
	}
	return err;
}
@@ -5473,7 +5468,7 @@ int ext4_mark_iloc_dirty(handle_t *handle,
	get_bh(iloc->bh);

	/* ext4_do_update_inode() does jbd2_journal_dirty_metadata */
	err = ext4_do_update_inode(handle, inode, iloc, 0);
	err = ext4_do_update_inode(handle, inode, iloc);
	put_bh(iloc->bh);
	return err;
}