diff options
Diffstat (limited to 'fs/xfs/xfs_fsops.c')
| -rw-r--r-- | fs/xfs/xfs_fsops.c | 31 | 
1 files changed, 18 insertions, 13 deletions
| diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index dbca5f5c37b..43b1d569933 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -604,31 +604,36 @@ out:  	return 0;  } +/* + * Dump a transaction into the log that contains no real change. This is needed + * to be able to make the log dirty or stamp the current tail LSN into the log + * during the covering operation. + * + * We cannot use an inode here for this - that will push dirty state back up + * into the VFS and then periodic inode flushing will prevent log covering from + * making progress. Hence we log a field in the superblock instead. + */  int  xfs_fs_log_dummy( -	xfs_mount_t	*mp) +	xfs_mount_t	*mp, +	int		flags)  {  	xfs_trans_t	*tp; -	xfs_inode_t	*ip;  	int		error;  	tp = _xfs_trans_alloc(mp, XFS_TRANS_DUMMY1, KM_SLEEP); -	error = xfs_trans_reserve(tp, 0, XFS_ICHANGE_LOG_RES(mp), 0, 0, 0); +	error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, +					XFS_DEFAULT_LOG_COUNT);  	if (error) {  		xfs_trans_cancel(tp, 0);  		return error;  	} -	ip = mp->m_rootip; -	xfs_ilock(ip, XFS_ILOCK_EXCL); - -	xfs_trans_ijoin(tp, ip); -	xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); -	xfs_trans_set_sync(tp); -	error = xfs_trans_commit(tp, 0); - -	xfs_iunlock(ip, XFS_ILOCK_EXCL); -	return error; +	/* log the UUID because it is an unchanging field */ +	xfs_mod_sb(tp, XFS_SB_UUID); +	if (flags & SYNC_WAIT) +		xfs_trans_set_sync(tp); +	return xfs_trans_commit(tp, 0);  }  int | 
