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

Commit 776a75fa authored by Lachlan McIlroy's avatar Lachlan McIlroy Committed by Tim Shimmin
Browse files

[XFS] Ensure file size updates have been completed before writing inode to disk.



SGI-PV: 968767
SGI-Modid: xfs-linux-melb:xfs-kern:29675a

Signed-off-by: default avatarLachlan McIlroy <lachlan@sgi.com>
Signed-off-by: default avatarDavid Chinner <dgc@sgi.com>
Signed-off-by: default avatarTim Shimmin <tes@sgi.com>
parent 65de5567
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -181,6 +181,7 @@ xfs_setfilesize(
		ip->i_d.di_size = isize;
		ip->i_update_core = 1;
		ip->i_update_size = 1;
		mark_inode_dirty_sync(vn_to_inode(ioend->io_vnode));
	}

	xfs_iunlock(ip, XFS_ILOCK_EXCL);
+3 −1
Original line number Diff line number Diff line
@@ -415,8 +415,10 @@ xfs_fs_write_inode(

	if (vp) {
		vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address);
		if (sync)
		if (sync) {
			filemap_fdatawait(inode->i_mapping);
			flags |= FLUSH_SYNC;
		}
		error = bhv_vop_iflush(vp, flags);
		if (error == EAGAIN)
			error = sync? bhv_vop_iflush(vp, flags | FLUSH_LOG) : 0;
+12 −8
Original line number Diff line number Diff line
@@ -1082,6 +1082,9 @@ xfs_fsync(
	if (XFS_FORCED_SHUTDOWN(ip->i_mount))
		return XFS_ERROR(EIO);

	if (flag & FSYNC_DATA)
		filemap_fdatawait(vn_to_inode(XFS_ITOV(ip))->i_mapping);

	/*
	 * We always need to make sure that the required inode state
	 * is safe on disk.  The vnode might be clean but because
@@ -3769,12 +3772,16 @@ xfs_inode_flush(
			sync_lsn = log->l_last_sync_lsn;
			GRANT_UNLOCK(log, s);

			if ((XFS_LSN_CMP(iip->ili_last_lsn, sync_lsn) <= 0))
				return 0;

			if ((XFS_LSN_CMP(iip->ili_last_lsn, sync_lsn) > 0)) {
				if (flags & FLUSH_SYNC)
					log_flags |= XFS_LOG_SYNC;
			return xfs_log_force(mp, iip->ili_last_lsn, log_flags);
				error = xfs_log_force(mp, iip->ili_last_lsn, log_flags);
				if (error)
					return error;
			}

			if (ip->i_update_core == 0)
				return 0;
		}
	}

@@ -3788,9 +3795,6 @@ xfs_inode_flush(
	if (flags & FLUSH_INODE) {
		int	flush_flags;

		if (xfs_ipincount(ip))
			return EAGAIN;

		if (flags & FLUSH_SYNC) {
			xfs_ilock(ip, XFS_ILOCK_SHARED);
			xfs_iflock(ip);