summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2010-11-11 11:38:57 +0000
committerkib <kib@FreeBSD.org>2010-11-11 11:38:57 +0000
commit90d9ba4d7cb62ff1c83d26273d56d8411485a3d5 (patch)
tree839b0fa01d86479315395e169e9dcbd6510acd3e
parenta16cecf311abf4d7a478af04ffe04c1c2685112f (diff)
downloadFreeBSD-src-90d9ba4d7cb62ff1c83d26273d56d8411485a3d5.zip
FreeBSD-src-90d9ba4d7cb62ff1c83d26273d56d8411485a3d5.tar.gz
In journal_mount(), only set MNTK_SUJ flag after the jblocks are mapped.
I believe there is a window otherwise where jblocks can be accessed without proper initialization. Reviewed by: jeff Tested by: pho
-rw-r--r--sys/ufs/ffs/ffs_softdep.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c
index 6801c5e..b7d2b7a 100644
--- a/sys/ufs/ffs/ffs_softdep.c
+++ b/sys/ufs/ffs/ffs_softdep.c
@@ -2270,7 +2270,6 @@ journal_mount(mp, fs, cred)
int error;
int i;
- mp->mnt_kern_flag |= MNTK_SUJ;
error = softdep_journal_lookup(mp, &vp);
if (error != 0) {
printf("Failed to find journal. Use tunefs to create one\n");
@@ -2295,20 +2294,26 @@ journal_mount(mp, fs, cred)
}
jblocks->jb_low = jblocks->jb_free / 3; /* Reserve 33%. */
jblocks->jb_min = jblocks->jb_free / 10; /* Suspend at 10%. */
- /*
- * Only validate the journal contents if the filesystem is clean,
- * otherwise we write the logs but they'll never be used. If the
- * filesystem was still dirty when we mounted it the journal is
- * invalid and a new journal can only be valid if it starts from a
- * clean mount.
- */
- if (fs->fs_clean) {
- DIP_SET(ip, i_modrev, fs->fs_mtime);
- ip->i_flags |= IN_MODIFIED;
- ffs_update(vp, 1);
- }
VFSTOUFS(mp)->softdep_jblocks = jblocks;
out:
+ if (error == 0) {
+ MNT_ILOCK(mp);
+ mp->mnt_kern_flag |= MNTK_SUJ;
+ MNT_IUNLOCK(mp);
+ /*
+ * Only validate the journal contents if the
+ * filesystem is clean, otherwise we write the logs
+ * but they'll never be used. If the filesystem was
+ * still dirty when we mounted it the journal is
+ * invalid and a new journal can only be valid if it
+ * starts from a clean mount.
+ */
+ if (fs->fs_clean) {
+ DIP_SET(ip, i_modrev, fs->fs_mtime);
+ ip->i_flags |= IN_MODIFIED;
+ ffs_update(vp, 1);
+ }
+ }
vput(vp);
return (error);
}
OpenPOWER on IntegriCloud