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
This commit is contained in:
Konstantin Belousov
2010-11-11 11:38:57 +00:00
parent fae5c47dd4
commit d23c72cdb5
+18 -13
View File
@@ -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);
}