summaryrefslogtreecommitdiffstats
path: root/sys/ufs/ffs/ffs_vfsops.c
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2012-04-08 13:44:55 +0000
committertrasz <trasz@FreeBSD.org>2012-04-08 13:44:55 +0000
commit63d1a2cda8a26181b4a8a0004b374fe584c5f16f (patch)
treefb6d7c6293c26d0091565cd21f048f31cc2b928a /sys/ufs/ffs/ffs_vfsops.c
parentf001c5d63e95efd8ef1616678ab5b713c3faeec7 (diff)
downloadFreeBSD-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/ffs/ffs_vfsops.c')
-rw-r--r--sys/ufs/ffs/ffs_vfsops.c10
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)
OpenPOWER on IntegriCloud