diff options
author | trasz <trasz@FreeBSD.org> | 2012-04-08 13:44:55 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2012-04-08 13:44:55 +0000 |
commit | 63d1a2cda8a26181b4a8a0004b374fe584c5f16f (patch) | |
tree | fb6d7c6293c26d0091565cd21f048f31cc2b928a /sys/ufs | |
parent | f001c5d63e95efd8ef1616678ab5b713c3faeec7 (diff) | |
download | FreeBSD-src-63d1a2cda8a26181b4a8a0004b374fe584c5f16f.zip FreeBSD-src-63d1a2cda8a26181b4a8a0004b374fe584c5f16f.tar.gz |
Fix panic in ffs_reload(), which may happen when read-only filesystem
gets resized and then reloaded.
Reviewed by: kib, mckusick (earlier version)
Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'sys/ufs')
-rw-r--r-- | sys/ufs/ffs/ffs_vfsops.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index 57aad92..936445a 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -675,8 +675,14 @@ ffs_reload(struct mount *mp, struct thread *td) /* * Step 3: re-read summary information from disk. */ - blks = howmany(fs->fs_cssize, fs->fs_fsize); - space = fs->fs_csp; + size = fs->fs_cssize; + blks = howmany(size, fs->fs_fsize); + if (fs->fs_contigsumsize > 0) + size += fs->fs_ncg * sizeof(int32_t); + size += fs->fs_ncg * sizeof(u_int8_t); + free(fs->fs_csp, M_UFSMNT); + space = malloc((u_long)size, M_UFSMNT, M_WAITOK); + fs->fs_csp = space; for (i = 0; i < blks; i += fs->fs_frag) { size = fs->fs_bsize; if (i + fs->fs_frag > blks) |