summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/ufs/ffs/ffs_extern.h3
-rw-r--r--sys/ufs/ffs/ffs_suspend.c2
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c16
3 files changed, 16 insertions, 5 deletions
diff --git a/sys/ufs/ffs/ffs_extern.h b/sys/ufs/ffs/ffs_extern.h
index c29e5d5..058e68f 100644
--- a/sys/ufs/ffs/ffs_extern.h
+++ b/sys/ufs/ffs/ffs_extern.h
@@ -107,6 +107,9 @@ void ffs_susp_uninitialize(void);
#define FFSV_FORCEINSMQ 0x0001
+#define FFSR_FORCE 0x0001
+#define FFSR_UNSUSPEND 0x0002
+
extern struct vop_vector ffs_vnodeops1;
extern struct vop_vector ffs_fifoops1;
extern struct vop_vector ffs_vnodeops2;
diff --git a/sys/ufs/ffs/ffs_suspend.c b/sys/ufs/ffs/ffs_suspend.c
index 5baf460..3c327e5 100644
--- a/sys/ufs/ffs/ffs_suspend.c
+++ b/sys/ufs/ffs/ffs_suspend.c
@@ -234,7 +234,7 @@ ffs_susp_dtor(void *data)
KASSERT((mp->mnt_kern_flag & MNTK_SUSPEND) != 0,
("MNTK_SUSPEND not set"));
- error = ffs_reload(mp, curthread, 1);
+ error = ffs_reload(mp, curthread, FFSR_FORCE | FFSR_UNSUSPEND);
if (error != 0)
panic("failed to unsuspend writes on %s", fs->fs_fsmnt);
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c
index fe07ff0..1f4ce0c 100644
--- a/sys/ufs/ffs/ffs_vfsops.c
+++ b/sys/ufs/ffs/ffs_vfsops.c
@@ -583,11 +583,13 @@ ffs_cmount(struct mntarg *ma, void *data, uint64_t flags)
* 2) re-read superblock from disk.
* 3) re-read summary information from disk.
* 4) invalidate all inactive vnodes.
- * 5) invalidate all cached file data.
- * 6) re-read inode data for all active vnodes.
+ * 5) clear MNTK_SUSPEND2 and MNTK_SUSPENDED flags, allowing secondary
+ * writers, if requested.
+ * 6) invalidate all cached file data.
+ * 7) re-read inode data for all active vnodes.
*/
int
-ffs_reload(struct mount *mp, struct thread *td, int force)
+ffs_reload(struct mount *mp, struct thread *td, int flags)
{
struct vnode *vp, *mvp, *devvp;
struct inode *ip;
@@ -602,7 +604,7 @@ ffs_reload(struct mount *mp, struct thread *td, int force)
ump = VFSTOUFS(mp);
MNT_ILOCK(mp);
- if ((mp->mnt_flag & MNT_RDONLY) == 0 && force == 0) {
+ if ((mp->mnt_flag & MNT_RDONLY) == 0 && (flags & FFSR_FORCE) == 0) {
MNT_IUNLOCK(mp);
return (EINVAL);
}
@@ -692,6 +694,12 @@ ffs_reload(struct mount *mp, struct thread *td, int force)
size = fs->fs_ncg * sizeof(u_int8_t);
fs->fs_contigdirs = (u_int8_t *)space;
bzero(fs->fs_contigdirs, size);
+ if ((flags & FFSR_UNSUSPEND) != 0) {
+ MNT_ILOCK(mp);
+ mp->mnt_kern_flag &= ~(MNTK_SUSPENDED | MNTK_SUSPEND2);
+ wakeup(&mp->mnt_flag);
+ MNT_IUNLOCK(mp);
+ }
loop:
MNT_VNODE_FOREACH_ALL(vp, mp, mvp) {
OpenPOWER on IntegriCloud