Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 23 Apr 2010 08:46:03 +0000 (UTC)
From:      Jeff Roberson <jeff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r207102 - projects/suj/head/sbin/tunefs
Message-ID:  <201004230846.o3N8k3K2047723@svn.freebsd.org>

index | next in thread | raw e-mail

Author: jeff
Date: Fri Apr 23 08:46:03 2010
New Revision: 207102
URL: http://svn.freebsd.org/changeset/base/207102

Log:
   - Don't fail to create the journal if we can't find enough contig space.
     Instead, we make two passes, one looking for contig space, and another
     that takes what it can get while warning the user.

Modified:
  projects/suj/head/sbin/tunefs/tunefs.c

Modified: projects/suj/head/sbin/tunefs/tunefs.c
==============================================================================
--- projects/suj/head/sbin/tunefs/tunefs.c	Fri Apr 23 08:44:41 2010	(r207101)
+++ projects/suj/head/sbin/tunefs/tunefs.c	Fri Apr 23 08:46:03 2010	(r207102)
@@ -526,6 +526,7 @@ journal_balloc(void)
 	ufs2_daddr_t blk;
 	struct cg *cgp;
 	int valid;
+	static int contig = 1;
 
 	cgp = &disk.d_cg;
 	for (;;) {
@@ -547,9 +548,21 @@ journal_balloc(void)
 			 */
 			if (cgp->cg_cs.cs_nbfree > blocks / 8)
 				break;
+			if (contig == 0 && cgp->cg_cs.cs_nbfree)
+				break;
 		}
 		if (valid)
 			continue;
+		/*
+		 * Try once through looking only for large contiguous regions
+		 * and again taking any space we can find.
+		 */
+		if (contig) {
+			contig = 0;
+			disk.d_ccg = 0;
+			warnx("Journal file fragmented.");
+			continue;
+		}
 		warnx("Failed to find sufficient free blocks for the journal");
 		return -1;
 	}
@@ -906,12 +919,6 @@ journal_alloc(int64_t size)
 	while (cgread(&disk) == 1) {
 		if (cgp->cg_cs.cs_nifree == 0)
 			continue;
-		/*
-		 * Try to minimize fragmentation by requiring at least a
-		 * 1/16th of the blocks be present in each cg we use.
-		 */
-		if (cgp->cg_cs.cs_nbfree < blocks / 16)
-			continue;
 		ino = cgialloc(&disk);
 		if (ino <= 0)
 			break;
@@ -992,7 +999,7 @@ journal_alloc(int64_t size)
 		sblock.fs_sujfree = 0;
 		return (0);
 	}
-	warnx("Insufficient contiguous free space for the journal.");
+	warnx("Insufficient free space for the journal.");
 out:
 	return (-1);
 }


help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004230846.o3N8k3K2047723>