summaryrefslogtreecommitdiffstats
path: root/sys/ufs
diff options
context:
space:
mode:
authormckusick <mckusick@FreeBSD.org>2013-07-02 21:07:08 +0000
committermckusick <mckusick@FreeBSD.org>2013-07-02 21:07:08 +0000
commitf267001deec080ed066c932f80bfb869edddde59 (patch)
tree9e96b604e73a11c85e2cb1483e469c9a87805de3 /sys/ufs
parent665aff7bbd681deed1ebf184c9ece20cb2d4ba61 (diff)
downloadFreeBSD-src-f267001deec080ed066c932f80bfb869edddde59.zip
FreeBSD-src-f267001deec080ed066c932f80bfb869edddde59.tar.gz
Make better use of metadata area by avoiding using it for data blocks
that no should no longer immediately follow their indirect blocks. MFC after: 2 weeks
Diffstat (limited to 'sys/ufs')
-rw-r--r--sys/ufs/ffs/ffs_alloc.c2
-rw-r--r--sys/ufs/ffs/ffs_balloc.c26
2 files changed, 25 insertions, 3 deletions
diff --git a/sys/ufs/ffs/ffs_alloc.c b/sys/ufs/ffs/ffs_alloc.c
index d7db636..287ccbb 100644
--- a/sys/ufs/ffs/ffs_alloc.c
+++ b/sys/ufs/ffs/ffs_alloc.c
@@ -1710,7 +1710,7 @@ ffs_alloccgblk(ip, bp, bpref, size)
cgp = (struct cg *)bp->b_data;
blksfree = cg_blksfree(cgp);
if (bpref == 0) {
- bpref = cgp->cg_rotor;
+ bpref = cgbase(fs, cgp->cg_cgx) + cgp->cg_rotor + fs->fs_frag;
} else if ((cgbpref = dtog(fs, bpref)) != cgp->cg_cgx) {
/* map bpref to correct zone in this cg */
if (bpref < cgdata(fs, cgbpref))
diff --git a/sys/ufs/ffs/ffs_balloc.c b/sys/ufs/ffs/ffs_balloc.c
index 1e809bb..1b830ae 100644
--- a/sys/ufs/ffs/ffs_balloc.c
+++ b/sys/ufs/ffs/ffs_balloc.c
@@ -299,6 +299,10 @@ retry:
continue;
}
UFS_LOCK(ump);
+ /*
+ * If parent indirect has just been allocated, try to cluster
+ * immediately following it.
+ */
if (pref == 0)
pref = ffs_blkpref_ufs1(ip, lbn, i - num - 1,
(ufs1_daddr_t *)0);
@@ -368,7 +372,14 @@ retry:
*/
if (nb == 0) {
UFS_LOCK(ump);
- if (pref == 0)
+ /*
+ * If allocating metadata at the front of the cylinder
+ * group and parent indirect block has just been allocated,
+ * then cluster next to it if it is the first indirect in
+ * the file. Otherwise it has been allocated in the metadata
+ * area, so we want to find our own place out in the data area.
+ */
+ if (pref == 0 || (lbn > NDADDR && fs->fs_metaspace != 0))
pref = ffs_blkpref_ufs1(ip, lbn, indirs[i].in_off,
&bap[0]);
error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
@@ -850,6 +861,10 @@ retry:
continue;
}
UFS_LOCK(ump);
+ /*
+ * If parent indirect has just been allocated, try to cluster
+ * immediately following it.
+ */
if (pref == 0)
pref = ffs_blkpref_ufs2(ip, lbn, i - num - 1,
(ufs2_daddr_t *)0);
@@ -920,7 +935,14 @@ retry:
*/
if (nb == 0) {
UFS_LOCK(ump);
- if (pref == 0)
+ /*
+ * If allocating metadata at the front of the cylinder
+ * group and parent indirect block has just been allocated,
+ * then cluster next to it if it is the first indirect in
+ * the file. Otherwise it has been allocated in the metadata
+ * area, so we want to find our own place out in the data area.
+ */
+ if (pref == 0 || (lbn > NDADDR && fs->fs_metaspace != 0))
pref = ffs_blkpref_ufs2(ip, lbn, indirs[i].in_off,
&bap[0]);
error = ffs_alloc(ip, lbn, pref, (int)fs->fs_bsize,
OpenPOWER on IntegriCloud