Page MenuHomeFreeBSD

D25563.diff
No OneTemporary

D25563.diff

Index: head/sbin/newfs_msdos/mkfs_msdos.c
===================================================================
--- head/sbin/newfs_msdos/mkfs_msdos.c
+++ head/sbin/newfs_msdos/mkfs_msdos.c
@@ -41,8 +41,10 @@
#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 @@
#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 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 @@
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 @@
tm = localtime(&now);
}
+ chunksize = getchunksize();
physbuf = malloc(chunksize);
if (physbuf == NULL) {
warn(NULL);
@@ -848,6 +834,47 @@
}
#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);
}
/*

File Metadata

Mime Type
text/plain
Expires
Thu, Nov 21, 12:14 AM (21 h, 31 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14750393
Default Alt Text
D25563.diff (2 KB)

Event Timeline