summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormckusick <mckusick@FreeBSD.org>2004-12-09 21:24:00 +0000
committermckusick <mckusick@FreeBSD.org>2004-12-09 21:24:00 +0000
commita697c3ed65bcc3c1af7a47a8a6a24ddd24110f9b (patch)
tree6f08450a669678b23022b5e3b4df81bee94861d7 /sys
parent2ed0f4f1abfffa89380dfdf7dbb597ad14f6ef46 (diff)
downloadFreeBSD-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
Diffstat (limited to 'sys')
-rw-r--r--sys/ufs/ffs/ffs_alloc.c18
-rw-r--r--sys/ufs/ffs/ffs_snapshot.c2
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;
OpenPOWER on IntegriCloud