diff options
author | mckusick <mckusick@FreeBSD.org> | 2004-12-09 21:24:00 +0000 |
---|---|---|
committer | mckusick <mckusick@FreeBSD.org> | 2004-12-09 21:24:00 +0000 |
commit | a697c3ed65bcc3c1af7a47a8a6a24ddd24110f9b (patch) | |
tree | 6f08450a669678b23022b5e3b4df81bee94861d7 | |
parent | 2ed0f4f1abfffa89380dfdf7dbb597ad14f6ef46 (diff) | |
download | FreeBSD-src-a697c3ed65bcc3c1af7a47a8a6a24ddd24110f9b.zip FreeBSD-src-a697c3ed65bcc3c1af7a47a8a6a24ddd24110f9b.tar.gz |
Fixes a bug that caused UFS2 filesystems bigger than 2TB to
prematurely report that they were full and/or to panic the kernel
with the message ``ffs_clusteralloc: allocated out of group''.
Submitted by: Henry Whincup <henry@jot.to>
MFC after: 1 week
-rw-r--r-- | sys/ufs/ffs/ffs_alloc.c | 18 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_snapshot.c | 2 |
2 files changed, 10 insertions, 10 deletions
diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c index 7331a0a..ed23f64 100644 --- a/sys/ufs/ffs/ffs_alloc.c +++ b/sys/ufs/ffs/ffs_alloc.c @@ -1066,7 +1066,7 @@ ffs_blkpref_ufs1(ip, lbn, indx, bap) if (indx % fs->fs_maxbpg == 0 || bap[indx - 1] == 0) { if (lbn < NDADDR + NINDIR(fs)) { cg = ino_to_cg(fs, ip->i_number); - return (fs->fs_fpg * cg + fs->fs_frag); + return (cgbase(fs, cg) + fs->fs_frag); } /* * Find a cylinder with greater than average number of @@ -1082,12 +1082,12 @@ ffs_blkpref_ufs1(ip, lbn, indx, bap) for (cg = startcg; cg < fs->fs_ncg; cg++) if (fs->fs_cs(fs, cg).cs_nbfree >= avgbfree) { fs->fs_cgrotor = cg; - return (fs->fs_fpg * cg + fs->fs_frag); + return (cgbase(fs, cg) + fs->fs_frag); } for (cg = 0; cg <= startcg; cg++) if (fs->fs_cs(fs, cg).cs_nbfree >= avgbfree) { fs->fs_cgrotor = cg; - return (fs->fs_fpg * cg + fs->fs_frag); + return (cgbase(fs, cg) + fs->fs_frag); } return (0); } @@ -1115,7 +1115,7 @@ ffs_blkpref_ufs2(ip, lbn, indx, bap) if (indx % fs->fs_maxbpg == 0 || bap[indx - 1] == 0) { if (lbn < NDADDR + NINDIR(fs)) { cg = ino_to_cg(fs, ip->i_number); - return (fs->fs_fpg * cg + fs->fs_frag); + return (cgbase(fs, cg) + fs->fs_frag); } /* * Find a cylinder with greater than average number of @@ -1131,12 +1131,12 @@ ffs_blkpref_ufs2(ip, lbn, indx, bap) for (cg = startcg; cg < fs->fs_ncg; cg++) if (fs->fs_cs(fs, cg).cs_nbfree >= avgbfree) { fs->fs_cgrotor = cg; - return (fs->fs_fpg * cg + fs->fs_frag); + return (cgbase(fs, cg) + fs->fs_frag); } for (cg = 0; cg <= startcg; cg++) if (fs->fs_cs(fs, cg).cs_nbfree >= avgbfree) { fs->fs_cgrotor = cg; - return (fs->fs_fpg * cg + fs->fs_frag); + return (cgbase(fs, cg) + fs->fs_frag); } return (0); } @@ -1376,7 +1376,7 @@ ffs_alloccg(ip, cg, bpref, size) cgp->cg_frsum[allocsiz]--; if (frags != allocsiz) cgp->cg_frsum[allocsiz - frags]++; - blkno = cg * fs->fs_fpg + bno; + blkno = cgbase(fs, cg) + bno; if (DOINGSOFTDEP(ITOV(ip))) softdep_setup_blkmapdep(bp, fs, blkno); if (fs->fs_active != 0) @@ -1437,7 +1437,7 @@ gotit: fs->fs_cstotal.cs_nbfree--; fs->fs_cs(fs, cgp->cg_cgx).cs_nbfree--; fs->fs_fmod = 1; - blkno = cgp->cg_cgx * fs->fs_fpg + bno; + blkno = cgbase(fs, cgp->cg_cgx) + bno; if (DOINGSOFTDEP(ITOV(ip))) softdep_setup_blkmapdep(bp, fs, blkno); return (blkno); @@ -1541,7 +1541,7 @@ ffs_clusteralloc(ip, cg, bpref, len) for (i = 1; i <= len; i++) if (!ffs_isblock(fs, blksfree, got - run + i)) panic("ffs_clusteralloc: map mismatch"); - bno = cg * fs->fs_fpg + blkstofrags(fs, got - run + 1); + bno = cgbase(fs, cg) + blkstofrags(fs, got - run + 1); if (dtog(fs, bno) != cg) panic("ffs_clusteralloc: allocated out of group"); len = blkstofrags(fs, len); diff --git a/sys/ufs/ffs/ffs_snapshot.c b/sys/ufs/ffs/ffs_snapshot.c index 5261289..b5b6cde 100644 --- a/sys/ufs/ffs/ffs_snapshot.c +++ b/sys/ufs/ffs/ffs_snapshot.c @@ -743,7 +743,7 @@ cgaccount(cg, vp, nbp, passno) nbp->b_flags |= B_VALIDSUSPWRT; numblks = howmany(fs->fs_size, fs->fs_frag); len = howmany(fs->fs_fpg, fs->fs_frag); - base = cg * fs->fs_fpg / fs->fs_frag; + base = cgbase(fs, cg) / fs->fs_frag; if (base + len >= numblks) len = numblks - base - 1; loc = 0; |