aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_mount.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_mount.c')
-rw-r--r--fs/xfs/xfs_mount.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
index 51435dbce9c4..13d117089101 100644
--- a/fs/xfs/xfs_mount.c
+++ b/fs/xfs/xfs_mount.c
@@ -1074,11 +1074,23 @@ xfs_unmountfs(
1074 xfs_sysfs_del(&mp->m_kobj); 1074 xfs_sysfs_del(&mp->m_kobj);
1075} 1075}
1076 1076
1077int 1077/*
1078xfs_fs_writable(xfs_mount_t *mp) 1078 * Determine whether modifications can proceed. The caller specifies the minimum
1079 * freeze level for which modifications should not be allowed. This allows
1080 * certain operations to proceed while the freeze sequence is in progress, if
1081 * necessary.
1082 */
1083bool
1084xfs_fs_writable(
1085 struct xfs_mount *mp,
1086 int level)
1079{ 1087{
1080 return !(mp->m_super->s_writers.frozen || XFS_FORCED_SHUTDOWN(mp) || 1088 ASSERT(level > SB_UNFROZEN);
1081 (mp->m_flags & XFS_MOUNT_RDONLY)); 1089 if ((mp->m_super->s_writers.frozen >= level) ||
1090 XFS_FORCED_SHUTDOWN(mp) || (mp->m_flags & XFS_MOUNT_RDONLY))
1091 return false;
1092
1093 return true;
1082} 1094}
1083 1095
1084/* 1096/*
@@ -1086,9 +1098,9 @@ xfs_fs_writable(xfs_mount_t *mp)
1086 * 1098 *
1087 * Sync the superblock counters to disk. 1099 * Sync the superblock counters to disk.
1088 * 1100 *
1089 * Note this code can be called during the process of freezing, so 1101 * Note this code can be called during the process of freezing, so we use the
1090 * we may need to use the transaction allocator which does not 1102 * transaction allocator that does not block when the transaction subsystem is
1091 * block when the transaction subsystem is in its frozen state. 1103 * in its frozen state.
1092 */ 1104 */
1093int 1105int
1094xfs_log_sbcount(xfs_mount_t *mp) 1106xfs_log_sbcount(xfs_mount_t *mp)
@@ -1096,7 +1108,8 @@ xfs_log_sbcount(xfs_mount_t *mp)
1096 xfs_trans_t *tp; 1108 xfs_trans_t *tp;
1097 int error; 1109 int error;
1098 1110
1099 if (!xfs_fs_writable(mp)) 1111 /* allow this to proceed during the freeze sequence... */
1112 if (!xfs_fs_writable(mp, SB_FREEZE_COMPLETE))
1100 return 0; 1113 return 0;
1101 1114
1102 xfs_icsb_sync_counters(mp, 0); 1115 xfs_icsb_sync_counters(mp, 0);