svn commit: r362937 - head/sbin/newfs_msdos

Xin LI delphij at FreeBSD.org
Sun Jul 5 00:19:08 UTC 2020


Author: delphij
Date: Sun Jul  5 00:19:08 2020
New Revision: 362937
URL: https://svnweb.freebsd.org/changeset/base/362937

Log:
  Use KERN_MAXPHYS.
  
  Suggested by:	imp
  Reviewed by:	imp, cem (earlier version), emaste
  MFC after:	2 weeks
  Differential Revision:	https://reviews.freebsd.org/D25563

Modified:
  head/sbin/newfs_msdos/mkfs_msdos.c

Modified: head/sbin/newfs_msdos/mkfs_msdos.c
==============================================================================
--- head/sbin/newfs_msdos/mkfs_msdos.c	Sat Jul  4 18:37:04 2020	(r362936)
+++ head/sbin/newfs_msdos/mkfs_msdos.c	Sun Jul  5 00:19:08 2020	(r362937)
@@ -41,8 +41,10 @@ static const char rcsid[] =
 #include <sys/mount.h>
 #endif
 #include <sys/stat.h>
+#include <sys/sysctl.h>
 #include <sys/time.h>
 
+#include <assert.h>
 #include <ctype.h>
 #include <err.h>
 #include <errno.h>
@@ -78,25 +80,6 @@ static const char rcsid[] =
 #define	MAXCLS16  0xfff4U	/* maximum FAT16 clusters */
 #define	MAXCLS32  0xffffff4U	/* maximum FAT32 clusters */
 
-#ifndef	CTASSERT
-#define	CTASSERT(x)		_CTASSERT(x, __LINE__)
-#define	_CTASSERT(x, y)		__CTASSERT(x, y)
-#define	__CTASSERT(x, y)	typedef char __assert_ ## y [(x) ? 1 : -1]
-#endif
-
-/*
- * For better performance, we want to write larger chunks instead of
- * individual sectors (the size can only be 512, 1024, 2048 or 4096
- * bytes). Assert that MAXPHYS can always hold an integer number of
- * sectors by asserting that both are power of two numbers and the
- * MAXPHYS is greater than MAXBPS.
- */
-CTASSERT(powerof2(MAXPHYS));
-CTASSERT(powerof2(MAXBPS));
-CTASSERT(MAXPHYS > MAXBPS);
-
-const static ssize_t chunksize = MAXPHYS;
-
 #define	mincls(fat)  ((fat) == 12 ? MINCLS12 :	\
 		      (fat) == 16 ? MINCLS16 :	\
 				    MINCLS32)
@@ -240,6 +223,7 @@ static volatile sig_atomic_t got_siginfo;
 static void infohandler(int);
 
 static int check_mounted(const char *, mode_t);
+static ssize_t getchunksize(void);
 static int getstdfmt(const char *, struct bpb *);
 static int getdiskinfo(int, const char *, const char *, int, struct bpb *);
 static void print_bpb(struct bpb *);
@@ -272,6 +256,7 @@ mkfs_msdos(const char *fname, const char *dtype, const
     bool set_res, set_spf, set_spc;
     int fd, fd1, rv;
     struct msdos_options o = *op;
+    ssize_t chunksize;
 
     physbuf = NULL;
     rv = -1;
@@ -640,6 +625,7 @@ mkfs_msdos(const char *fname, const char *dtype, const
 	    tm = localtime(&now);
 	}
 
+	chunksize = getchunksize();
 	physbuf = malloc(chunksize);
 	if (physbuf == NULL) {
 	    warn(NULL);
@@ -848,6 +834,47 @@ check_mounted(const char *fname, mode_t mode)
     }
 #endif
     return 0;
+}
+
+/*
+ * Get optimal I/O size
+ */
+static ssize_t
+getchunksize(void)
+{
+	static int chunksize;
+
+	if (chunksize != 0)
+		return ((ssize_t)chunksize);
+
+#ifdef	KERN_MAXPHYS
+	int mib[2];
+	size_t len;
+
+	mib[0] = CTL_KERN;
+	mib[1] = KERN_MAXPHYS;
+	len = sizeof(chunksize);
+
+	if (sysctl(mib, 2, &chunksize, &len, NULL, 0) == -1) {
+		warn("sysctl: KERN_MAXPHYS, using %zu", (size_t)MAXPHYS);
+		chunksize = 0;
+	}
+#endif
+	if (chunksize == 0)
+		chunksize = MAXPHYS;
+
+	/*
+	 * For better performance, we want to write larger chunks instead of
+	 * individual sectors (the size can only be 512, 1024, 2048 or 4096
+	 * bytes). Assert that chunksize can always hold an integer number of
+	 * sectors by asserting that both are power of two numbers and the
+	 * chunksize is greater than MAXBPS.
+	 */
+	static_assert(powerof2(MAXBPS), "MAXBPS is not power of 2");
+	assert(powerof2(chunksize));
+	assert(chunksize > MAXBPS);
+
+	return ((ssize_t)chunksize);
 }
 
 /*


More information about the svn-src-all mailing list