tux3: Fix tux3_iattrdirty() usages

Now, on some paths, mark_inode_dirty() is not called after
tux3_iattrdirty() was called.

E.g. If inode->i_ctime is same with current time, file_update_time()
skips to dirty inode.

	tux3_iattrdirty()
	file_update_time() {
	    if (!timespec_equal(&inode->i_ctime, &now))
		sync_it |= S_CTIME;
	    if (sync_it)
	        mark_inode_dirty_sync()
	}

This is wrong as tux3_iattrdirty() usage. tux3_iattrdirty() was
called, the caller must call mark_inode_dirty() too.

Otherwise,

	delta = 1
	tux3_iattrdirty(inode)
	    iattr_delta = delta

        /* flush delta 1 */
	inode is not dirty, so iattr_delta == 1 is remaining

	/* flush delta 2 for data pages */
	read_idata_for_i_size()
	    if (iattr_delta != delta)
		/*
		 * iattr_delta is still 1, so read from idata[], but
		 * idata[] is invalid.
		 */

By remaining iattr_delta, future inode flush is confused, and hits to
assertion.

To fix this, this makes sure to call tux3_iattrdirty() only when we call
mark_inode_dirty().

[FIXME: file_update_time() of mmap and write can race.]

Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
3 files changed